文件包含漏洞
1.漏洞点
大多数PHP网站,具有和漏洞相关的文件包含函数以及文件包含函数中存在动态变量,且用户能够控制该变量,这些网站可能存在文件包含漏洞。
2.漏洞利用
常见的文件包含漏洞的形式为 <?php include("inc/" . $_GET['file']); ?>
同目录包含 file=.htaccess
目录遍历 ?file=../../../../../../../../../var/lib/locate.db
日志注入 ?file=../../../../../../../../../var/log/apache/error.log
利用 /proc/self/environ其中日志可以使用SSH日志或者Web日志等多种日志来源测试
3.如何绕过防御
# 00字符截断(PHP<5.3.4)
条件是magic_quotes_gpc打开,而且php版本小于5.3.4。
../etc/passwd%00
# 超长字符截断
利用"./"的方式即可构造出超长目录字符串,除了incldue()等4个函数之外,PHP中能够对文件进行操作的函数都有可能出现漏洞。虽然大多数情况下不能执行PHP代码,但能够读取敏感文件带来的后果也是比较严重的。例如: fopen()、fread()
# 特殊字符绕过
某些情况下,读文件支持使用Shell通配符,如 ? * 等
url中 使用 ? # 可能会影响include包含的结果
某些情况下,unicode编码不同但是字形相近的字符有同一个效果
还有一些共通的绕过手法如双写、大小写等等
可以使用问号、#号、%20绕过
# 伪协议绕过
php://input,说明:用来接收POST数据。我们能够通过input把我们的语句输入上去然后执行。
data://,这是一种数据流封装器,data:URI schema(URL schema可以是很多形式)
file://,用于访问本地文件系统,通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。
4.文件包含漏洞修复
# 过滤危险字符
过滤点、反斜杠等特殊字符或使用str_replace等方法过滤掉危险字符
# 设置白名单
动态包含文件设置白名单,不读取非白名单的文件
# 关闭危险配置
关闭远程文件包含的配置选项allow_url_include = Off
# open_basedir
PHP 中使用 open_basedir 配置限制访问在指定的区域,防止目录遍历。