[红日安全]PHP-Audit-Labs题解之Day1-4
字数 2048 2025-08-29 08:32:24
PHP代码审计实战教学:Day1-4题解详解
前言
本教学文档基于红日安全团队的PHP-Audit-Labs项目中的Day1至Day4题目,详细解析了每道题目的漏洞原理、利用方法和解题思路。这些题目涵盖了PHP中常见的函数缺陷和安全问题,包括in_array函数绕过、filter_var函数绕过、任意对象实例化漏洞以及strpos使用不当引发的安全问题。
Day1:in_array函数缺陷与updatexml注入
漏洞分析
-
in_array函数绕过:
- 题目中使用了
in_array()函数检查用户输入的id是否在白名单数组中 - 关键缺陷:没有使用严格模式(第三个参数未设置为true)
- 绕过方法:
id=1'可以绕过检查,因为PHP会进行类型转换
- 题目中使用了
-
updatexml注入:
- 题目过滤了字符串拼接函数(如concat)
- updatexml特性:当存在特殊字符或字母时,会报错并显示特殊字符后的内容
- 数字开头的数据只会显示字母部分(如"7701HongRi"只显示"HongRi")
利用方法
Payload:
http://localhost/index.php?id=4 and (select updatexml(1,make_set(3,'~',(select flag from flag)),1))
- 使用
make_set函数替代被过滤的concat函数 - 在查询数据前添加特殊字符'~',确保数据以非数字开头
关键点总结
in_array必须使用严格模式(第三个参数true)防止类型转换问题- updatexml注入需要确保数据以非数字开头才能完整显示
- 当常用字符串拼接函数被过滤时,可寻找替代函数如
make_set
Day2:filter_var函数缺陷与命令执行
漏洞分析
-
filter_var绕过:
- 题目使用
filter_var($url, FILTER_VALIDATE_URL)验证URL - 需要URL以"sec-redclub.com"结尾才能执行exec函数
parse_url函数解析URL可能存在解析差异
- 题目使用
-
命令执行:
- 通过构造特殊URL绕过filter_var验证
- 最终目标是执行系统命令读取flag文件
绕过方法
filter_var绕过Payload示例:
http://localhost/index.php?url=demo://%22;ls;%23;sec-redclub.com:80/
http://localhost/index.php?url=demo://%22;cat<f1agi3hEre.php;%23;sec-redclub.com:80/
- 使用分号分隔命令
- 用
<代替空格绕过过滤 - URL编码特殊字符(如#编码为%23)
关键点总结
- filter_var的FILTER_VALIDATE_URL过滤器有多种绕过方式
- parse_url函数解析URL可能与浏览器解析方式不同
- 命令执行时可用多种方式绕过空格限制(如<、${IFS}等)
Day3:任意对象实例化与XXE漏洞
漏洞分析
-
任意对象实例化:
- 通过
class_exists和spl_autoload_register机制 - 可利用PHP内置类进行文件操作
- 通过
-
XXE漏洞:
- 通过SimpleXMLElement类加载外部实体
- 结合PHP伪协议读取文件内容
利用方法
步骤1:查找flag文件:
http://localhost/CTF/index.php?name=GlobIterator¶m=./*.php¶m2=0
- 使用GlobIterator类搜索当前目录下所有.php文件
- param2=0表示使用FilesystemIterator::CURRENT_AS_FILEINFO模式
步骤2:读取flag文件内容:
http://localhost/CTF/index.php?name=SimpleXMLElement¶m=<?xml version="1.0"?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/html/CTF/f1agi3hEre.php">]><x>&xxe;</x>¶m2=2
- 使用SimpleXMLElement类
- 通过php://filter伪协议base64编码读取文件内容
- param2=2表示LIBXML_NOENT模式,允许实体替换
关键点总结
- PHP内置类如GlobIterator、SimpleXMLElement可被利用进行文件操作
- XXE漏洞可通过PHP伪协议绕过特殊字符限制
- 文件内容使用base64编码可避免XML解析问题
Day4:松散比较与逻辑漏洞
漏洞分析
-
松散比较问题:
- 题目使用
==比较用户输入与随机生成的数字 ==只比较值不比较类型,会进行类型转换- 在PHP中,true与任何非零数字比较都为true
- 题目使用
-
逻辑漏洞利用:
- 通过发送包含7个true的数组绕过每位数字比较
- 只要随机数不包含0,比较结果都为true
利用方法
Payload构造:
- 提交JSON格式数据:
[true, true, true, true, true, true, true] - 每次比较都会返回true,获得最高奖励
关键点总结
- PHP松散比较(
==)会引发类型转换问题 - 布尔值true与数字比较的特殊性
- 数组提交方式可绕过逐位数字比较
- 替代解法:暴力注册多次购买彩票(非预期解)
总结与防御建议
-
函数使用规范:
in_array必须使用严格模式filter_var不能单独作为安全验证- 避免使用
==,应使用===严格比较
-
安全编码实践:
- 对用户输入进行严格过滤和类型检查
- 禁用危险函数如exec、system等
- 禁止外部实体加载防止XXE攻击
-
防御措施:
- 使用白名单而非黑名单过滤
- 对文件操作进行权限限制
- 关键操作添加验证码等二次验证
通过这四天的题目学习,可以掌握PHP中常见的安全问题和审计方法,这些知识在实际的代码审计和安全评估中都非常实用。