[红日安全]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注入

漏洞分析

  1. in_array函数绕过

    • 题目中使用了in_array()函数检查用户输入的id是否在白名单数组中
    • 关键缺陷:没有使用严格模式(第三个参数未设置为true)
    • 绕过方法:id=1'可以绕过检查,因为PHP会进行类型转换
  2. 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函数缺陷与命令执行

漏洞分析

  1. filter_var绕过

    • 题目使用filter_var($url, FILTER_VALIDATE_URL)验证URL
    • 需要URL以"sec-redclub.com"结尾才能执行exec函数
    • parse_url函数解析URL可能存在解析差异
  2. 命令执行

    • 通过构造特殊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漏洞

漏洞分析

  1. 任意对象实例化

    • 通过class_existsspl_autoload_register机制
    • 可利用PHP内置类进行文件操作
  2. XXE漏洞

    • 通过SimpleXMLElement类加载外部实体
    • 结合PHP伪协议读取文件内容

利用方法

步骤1:查找flag文件

http://localhost/CTF/index.php?name=GlobIterator&param=./*.php&param2=0
  • 使用GlobIterator类搜索当前目录下所有.php文件
  • param2=0表示使用FilesystemIterator::CURRENT_AS_FILEINFO模式

步骤2:读取flag文件内容

http://localhost/CTF/index.php?name=SimpleXMLElement&param=<?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>&param2=2
  • 使用SimpleXMLElement类
  • 通过php://filter伪协议base64编码读取文件内容
  • param2=2表示LIBXML_NOENT模式,允许实体替换

关键点总结

  • PHP内置类如GlobIterator、SimpleXMLElement可被利用进行文件操作
  • XXE漏洞可通过PHP伪协议绕过特殊字符限制
  • 文件内容使用base64编码可避免XML解析问题

Day4:松散比较与逻辑漏洞

漏洞分析

  1. 松散比较问题

    • 题目使用==比较用户输入与随机生成的数字
    • ==只比较值不比较类型,会进行类型转换
    • 在PHP中,true与任何非零数字比较都为true
  2. 逻辑漏洞利用

    • 通过发送包含7个true的数组绕过每位数字比较
    • 只要随机数不包含0,比较结果都为true

利用方法

Payload构造

  • 提交JSON格式数据:[true, true, true, true, true, true, true]
  • 每次比较都会返回true,获得最高奖励

关键点总结

  • PHP松散比较(==)会引发类型转换问题
  • 布尔值true与数字比较的特殊性
  • 数组提交方式可绕过逐位数字比较
  • 替代解法:暴力注册多次购买彩票(非预期解)

总结与防御建议

  1. 函数使用规范

    • in_array必须使用严格模式
    • filter_var不能单独作为安全验证
    • 避免使用==,应使用===严格比较
  2. 安全编码实践

    • 对用户输入进行严格过滤和类型检查
    • 禁用危险函数如exec、system等
    • 禁止外部实体加载防止XXE攻击
  3. 防御措施

    • 使用白名单而非黑名单过滤
    • 对文件操作进行权限限制
    • 关键操作添加验证码等二次验证

通过这四天的题目学习,可以掌握PHP中常见的安全问题和审计方法,这些知识在实际的代码审计和安全评估中都非常实用。

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 : 使用 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示例 : 使用分号分隔命令 用 < 代替空格绕过过滤 URL编码特殊字符(如#编码为%23) 关键点总结 filter_ var的FILTER_ VALIDATE_ URL过滤器有多种绕过方式 parse_ url函数解析URL可能与浏览器解析方式不同 命令执行时可用多种方式绕过空格限制(如 <、${IFS}等) Day3:任意对象实例化与XXE漏洞 漏洞分析 任意对象实例化 : 通过 class_exists 和 spl_autoload_register 机制 可利用PHP内置类进行文件操作 XXE漏洞 : 通过SimpleXMLElement类加载外部实体 结合PHP伪协议读取文件内容 利用方法 步骤1:查找flag文件 : 使用GlobIterator类搜索当前目录下所有.php文件 param2=0表示使用FilesystemIterator::CURRENT_ AS_ FILEINFO模式 步骤2:读取flag文件内容 : 使用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中常见的安全问题和审计方法,这些知识在实际的代码审计和安全评估中都非常实用。