[红日安全]PHP-Audit-Labs题解之Day1-4
字数 1536 2025-08-18 11:37:33
PHP代码审计实战教学:Day1-4题解详解
前言
本教学文档基于红日安全团队的PHP-Audit-Labs项目中的Day1至Day4题目,详细解析了PHP代码审计中的关键漏洞点和利用技巧。这些题目涵盖了in_array函数缺陷、filter_var函数绕过、实例化任意对象漏洞以及strpos使用不当等常见安全问题。
Day1:in_array函数缺陷与updatexml注入
漏洞分析
-
in_array函数弱类型比较绕过:
- 代码将用户ID存储在
$whitelist数组中 - 使用
in_array检查用户输入的id参数是否在白名单中 - 未使用严格模式(
in_array第三个参数未设为true),导致类型混淆绕过
- 代码将用户ID存储在
-
updatexml报错注入:
- 注入点在
updatexml函数 - 特殊字符或字母会导致报错,报错信息会显示特殊字符之后的内容
- 常规方法使用
concat(0x7e,(SELECT user()),0x7e)进行拼接
- 注入点在
绕过技巧
-
in_array绕过:
- 使用
id=1'即可绕过检查
- 使用
-
updatexml注入绕过:
- 题目过滤了字符串拼接函数
- 使用
make_set函数替代concat:and (select updatexml(1,make_set(3,'~',(select flag from flag)),1))
关键点
in_array必须使用严格模式(第三个参数为true)- 报错注入时确保数据以非数字开头
- 当常规拼接函数被过滤时,寻找替代函数
Day2:filter_var函数绕过与命令执行
漏洞分析
-
filter_var函数绕过:
- 使用
FILTER_VALIDATE_URL过滤器验证URL - 多种方法可绕过此验证
- 使用
-
命令执行:
- 使用
exec执行curl命令 - 需要
$site_info['host']以sec-redclub.com结尾
- 使用
绕过方法
-
filter_var绕过payload:
http://demo.com@sec-redclub.com http://demo.com&sec-redclub.com http://demo.com?sec-redclub.com http://demo.com/sec-redclub.com demo://demo.com,sec-redclub.com demo://demo.com:80;sec-redclub.com:80/ http://demo.com#sec-redclub.com (#需编码为%23) -
命令执行payload:
demo://";ls;#;sec-redclub.com:80/ demo://";cat<f1agi3hEre.php;#;sec-redclub.com:80/
关键点
filter_var的URL验证可被多种方式绕过- 命令执行时使用
<代替空格绕过过滤 - 注意URL编码特殊字符
Day3:实例化任意对象与XXE漏洞
漏洞分析
-
任意类实例化:
- 使用
class_exists检查类是否存在 - 不存在时调用
__autoload或注册的自动加载函数
- 使用
-
XXE漏洞:
- 利用PHP内置类
SimpleXMLElement - 结合PHP流读取文件内容
- 利用PHP内置类
利用方法
-
搜索flag文件:
- 使用
GlobIterator类:?name=GlobIterator¶m=./*.php¶m2=0
- 使用
-
读取文件内容:
- 使用
SimpleXMLElement配合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
- 使用
关键点
- 利用PHP内置类进行文件操作
- 使用base64编码绕过XML特殊字符限制
param2=2对应LIBXML_NOENT模式,允许实体解析
Day4:弱类型比较漏洞
漏洞分析
-
弱类型比较:
- 使用
==比较用户输入和随机数 - 可被数组和布尔值绕过
- 使用
-
利用方法:
- 提交包含7个
true元素的数组 - 只要随机数不含0,比较结果即为真
- 提交包含7个
关键点
- 永远使用
===进行严格比较 - JSON格式输入可传递数组和布尔值
- 数字与
true比较时,除0外都为真
总结
-
函数使用注意事项:
in_array必须使用严格模式filter_var验证可被绕过,需额外验证- 避免使用
==,始终使用===
-
安全编码实践:
- 对用户输入进行严格过滤和验证
- 使用参数化查询防止SQL注入
- 禁用危险函数如
exec、system等
-
审计技巧:
- 关注输入验证和过滤逻辑
- 寻找替代函数绕过过滤
- 利用PHP特性和内置类进行漏洞利用
通过这四天的题目,我们学习了PHP代码审计中的多种漏洞类型和利用技巧,这些知识对于提高代码安全意识和审计能力至关重要。