渗透测试 | 黑白盒测试配合实战经验分享(第二篇)
字数 1732 2025-08-19 12:40:45

PHP渗透测试实战:黑白盒测试配合与风险函数分析

前言

本文是基于David_Jou在FreeBuf上分享的黑白盒渗透测试实战经验整理而成,重点介绍PHP代码审计中的风险函数识别以及黑白盒测试配合的实际应用。通过本教程,您将学习到如何识别PHP代码中的安全隐患,以及如何结合黑盒和白盒测试方法进行有效的渗透测试。

一、PHP常见风险函数详解

1. 命令执行函数

这些函数如果接收了未经验证的用户输入,可能导致任意命令执行漏洞:

  • exec():执行系统命令并返回最后一行输出
  • system():执行系统命令并直接输出结果到浏览器
  • passthru():执行系统命令并直接输出结果(无过滤)
  • shell_exec():执行系统命令并返回完整输出
  • popen():打开进程管道进行通信
  • proc_open():打开进程并返回资源句柄

风险示例

$cmd = $_GET['command']; // 用户可控输入
system($cmd); // 高危!可执行任意系统命令

2. 代码执行函数

这些函数可能导致任意代码执行漏洞:

  • eval():将字符串作为PHP代码执行
  • assert():类似eval(),执行字符串代码
  • preg_replace():使用/e修饰符时执行匹配内容
  • create_function():创建匿名函数(内部使用eval)
  • include/require系列:包含外部文件(可能导致文件包含漏洞)

风险示例

$code = $_POST['code']; // 用户可控输入
eval($code); // 高危!可执行任意PHP代码

3. 数据库操作函数

可能导致SQL注入漏洞的函数:

  • mysql_query()/mysqli_query()/pdo_query():执行SQL查询
  • mysql_fetch_array()/mysqli_fetch_array()/pdo_fetch_all():获取数据

风险示例

$id = $_GET['id']; // 用户可控输入
$sql = "SELECT * FROM users WHERE id = $id"; // 未过滤
mysql_query($sql); // 高危!可能导致SQL注入

4. 文件操作函数

可能导致文件读取/写入漏洞:

  • file_get_contents():读取文件内容
  • file_put_contents():写入文件内容
  • fopen():打开文件

风险示例

$file = $_GET['file']; // 用户可控输入
echo file_get_contents($file); // 高危!可能读取敏感文件

5. 其他风险函数

  • parse_str():字符串解析为变量(可能导致变量覆盖)
  • extract():数组键值对提取为变量(可能导致变量覆盖)
  • header():设置HTTP头部(可能用于XSS或重定向攻击)

二、代码审计方法与工具

1. 代码审计方法

  1. 模式匹配:使用正则表达式匹配已知漏洞模式
  2. 词法分析:将代码分解为标记(token)
  3. 语法分析:分析代码结构
  4. 语义分析:理解代码实际功能

2. 审计策略建议

  • 新手可先进行黑盒测试挖掘漏洞,再定位相关代码进行审计
  • 重点关注用户输入点与风险函数的结合使用
  • 检查输入验证和过滤逻辑是否完善

三、黑白盒测试配合实战

1. 黑盒测试发现漏洞

案例:文件上传漏洞

  1. 在用户头像上传功能处尝试上传Webshell
  2. 上传PHP文件(如冰蝎Shell)测试防护措施
  3. 观察响应,发现上传成功并返回路径:
    http://XXX.XX.XX.XX/uploads/20240628/41b6384e8f7dd5434c55ab5f1573dde0.php?imageMogr2/auto-orient/thumbnail/!200p/blur/1x0/quality/10|images
    

2. 白盒测试分析原因

  1. 定位头像上传功能代码
  2. 检查是否对文件类型、内容进行了充分验证
  3. 分析文件存储路径生成逻辑
  4. 确认是否有安全防护被绕过

3. 反射型XSS+文件上传组合漏洞

  1. 在聊天室功能中发现未过滤的用户输入点
  2. 测试XSS payload执行情况
  3. 结合文件上传功能实现更复杂的攻击链

四、防御建议

  1. 输入验证

    • 对所有用户输入进行严格验证
    • 使用白名单而非黑名单方法
  2. 函数使用安全

    • 避免直接使用风险函数处理用户输入
    • 使用安全替代方案(如预处理语句替代直接SQL查询)
  3. 文件上传安全

    • 验证文件类型(MIME类型、内容检测)
    • 重命名上传文件
    • 限制可执行文件的存储
  4. 输出编码

    • 对输出到HTML的内容进行编码
    • 设置合适的Content-Type和XSS防护头
  5. 最小权限原则

    • 应用程序以最低必要权限运行
    • 数据库用户仅具有必要权限

五、总结

本教程详细介绍了PHP代码审计中的关键风险函数,以及如何通过黑白盒测试配合的方法有效发现和验证安全漏洞。通过理解这些风险点和测试方法,安全人员可以更全面地评估Web应用的安全性,开发人员则可以编写更安全的代码。

记住:安全是一个持续的过程,需要结合自动化和人工分析,并保持对新型攻击方式的关注和学习。

PHP渗透测试实战:黑白盒测试配合与风险函数分析 前言 本文是基于David_ Jou在FreeBuf上分享的黑白盒渗透测试实战经验整理而成,重点介绍PHP代码审计中的风险函数识别以及黑白盒测试配合的实际应用。通过本教程,您将学习到如何识别PHP代码中的安全隐患,以及如何结合黑盒和白盒测试方法进行有效的渗透测试。 一、PHP常见风险函数详解 1. 命令执行函数 这些函数如果接收了未经验证的用户输入,可能导致任意命令执行漏洞: exec() :执行系统命令并返回最后一行输出 system() :执行系统命令并直接输出结果到浏览器 passthru() :执行系统命令并直接输出结果(无过滤) shell_ exec() :执行系统命令并返回完整输出 popen() :打开进程管道进行通信 proc_ open() :打开进程并返回资源句柄 风险示例 : 2. 代码执行函数 这些函数可能导致任意代码执行漏洞: eval() :将字符串作为PHP代码执行 assert() :类似eval(),执行字符串代码 preg_ replace() :使用/e修饰符时执行匹配内容 create_ function() :创建匿名函数(内部使用eval) include/require系列 :包含外部文件(可能导致文件包含漏洞) 风险示例 : 3. 数据库操作函数 可能导致SQL注入漏洞的函数: mysql_ query()/mysqli_ query()/pdo_ query() :执行SQL查询 mysql_ fetch_ array()/mysqli_ fetch_ array()/pdo_ fetch_ all() :获取数据 风险示例 : 4. 文件操作函数 可能导致文件读取/写入漏洞: file_ get_ contents() :读取文件内容 file_ put_ contents() :写入文件内容 fopen() :打开文件 风险示例 : 5. 其他风险函数 parse_ str() :字符串解析为变量(可能导致变量覆盖) extract() :数组键值对提取为变量(可能导致变量覆盖) header() :设置HTTP头部(可能用于XSS或重定向攻击) 二、代码审计方法与工具 1. 代码审计方法 模式匹配 :使用正则表达式匹配已知漏洞模式 词法分析 :将代码分解为标记(token) 语法分析 :分析代码结构 语义分析 :理解代码实际功能 2. 审计策略建议 新手可先进行黑盒测试挖掘漏洞,再定位相关代码进行审计 重点关注用户输入点与风险函数的结合使用 检查输入验证和过滤逻辑是否完善 三、黑白盒测试配合实战 1. 黑盒测试发现漏洞 案例:文件上传漏洞 在用户头像上传功能处尝试上传Webshell 上传PHP文件(如冰蝎Shell)测试防护措施 观察响应,发现上传成功并返回路径: 2. 白盒测试分析原因 定位头像上传功能代码 检查是否对文件类型、内容进行了充分验证 分析文件存储路径生成逻辑 确认是否有安全防护被绕过 3. 反射型XSS+文件上传组合漏洞 在聊天室功能中发现未过滤的用户输入点 测试XSS payload执行情况 结合文件上传功能实现更复杂的攻击链 四、防御建议 输入验证 : 对所有用户输入进行严格验证 使用白名单而非黑名单方法 函数使用安全 : 避免直接使用风险函数处理用户输入 使用安全替代方案(如预处理语句替代直接SQL查询) 文件上传安全 : 验证文件类型(MIME类型、内容检测) 重命名上传文件 限制可执行文件的存储 输出编码 : 对输出到HTML的内容进行编码 设置合适的Content-Type和XSS防护头 最小权限原则 : 应用程序以最低必要权限运行 数据库用户仅具有必要权限 五、总结 本教程详细介绍了PHP代码审计中的关键风险函数,以及如何通过黑白盒测试配合的方法有效发现和验证安全漏洞。通过理解这些风险点和测试方法,安全人员可以更全面地评估Web应用的安全性,开发人员则可以编写更安全的代码。 记住:安全是一个持续的过程,需要结合自动化和人工分析,并保持对新型攻击方式的关注和学习。