1、审计方法
漏洞原理:
在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。
审计技巧:
查询 include、include_once、require、require_once 等常用文件包含函数,追踪包含函数的变量尝试符合包含格式对变量进行本地文件包含和远程文件包含,如果目标网站开启了allow_url_include和allow_url_fopen为On就可以进行远程文件包含,没开启就只能进行本地文件包含和部分伪协议包含。
审计案例:
使用Seay代码审计工具,导入网站源码自动审计,看到可能存在文件包含漏洞右击打开文件:
看到一个 module 变量包含点,包含格式为文件名后面拼接 .inc 后缀:
经测试目标没有开启allow_url_include和allow_url_fopen为On,只能本地文件包含和部分伪协议包含,寻找上传文件点。
看到用户编辑资料处有上传头像的点:
查看上传页面源码,看到接收头像信息的页面为updateAvatar.php,追踪该文件:
看到文件重命名后上传到根目录的uploads文件,重命名格式为u_时间戳_源文件名:
在本地生成一个webshell文件1.inc,然后压缩成zip后重命名为1.png:
上传1.png头像的同时抓住上传的时间戳:
创建查看数字时间戳的文件,赋值字符串时间戳后访问获取数字时间戳:
通过上传重命名文件格式和上传时间戳构造到了上传后的文件名,然后使用phar://压缩包流伪协议包含shell文件:
payload:phar://uploads/u_1646978101_1.png/1
后面的1是压缩文件里的文件名称1.inc,因为包含文件处后面拼接了.inc字符,所以这里不需要写后缀。
2、防御方法
(1)禁止服务器远程文件包含
配置php.ini文件中的参数allow_url_include=Off和allow_url_fopen=Off。
(2)过滤包含变量 .号 ..号 /号 号
(3)设置文件包含白名单
(4)php.ini中open_basedir设置活动目录区域限制
限制用户只能访问网站目录网站目录外的文件不加载,Windows端用分号写多目录Linux端用冒号写多目录。
原文始发于微信公众号(ZackSecurity):【PHP代码审计】文件包含漏洞审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论