渗透测试 | 黑白盒测试配合实战经验分享(第二篇)
字数 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. 代码审计方法
- 模式匹配:使用正则表达式匹配已知漏洞模式
- 词法分析:将代码分解为标记(token)
- 语法分析:分析代码结构
- 语义分析:理解代码实际功能
2. 审计策略建议
- 新手可先进行黑盒测试挖掘漏洞,再定位相关代码进行审计
- 重点关注用户输入点与风险函数的结合使用
- 检查输入验证和过滤逻辑是否完善
三、黑白盒测试配合实战
1. 黑盒测试发现漏洞
案例:文件上传漏洞
- 在用户头像上传功能处尝试上传Webshell
- 上传PHP文件(如冰蝎Shell)测试防护措施
- 观察响应,发现上传成功并返回路径:
http://XXX.XX.XX.XX/uploads/20240628/41b6384e8f7dd5434c55ab5f1573dde0.php?imageMogr2/auto-orient/thumbnail/!200p/blur/1x0/quality/10|images
2. 白盒测试分析原因
- 定位头像上传功能代码
- 检查是否对文件类型、内容进行了充分验证
- 分析文件存储路径生成逻辑
- 确认是否有安全防护被绕过
3. 反射型XSS+文件上传组合漏洞
- 在聊天室功能中发现未过滤的用户输入点
- 测试XSS payload执行情况
- 结合文件上传功能实现更复杂的攻击链
四、防御建议
-
输入验证:
- 对所有用户输入进行严格验证
- 使用白名单而非黑名单方法
-
函数使用安全:
- 避免直接使用风险函数处理用户输入
- 使用安全替代方案(如预处理语句替代直接SQL查询)
-
文件上传安全:
- 验证文件类型(MIME类型、内容检测)
- 重命名上传文件
- 限制可执行文件的存储
-
输出编码:
- 对输出到HTML的内容进行编码
- 设置合适的Content-Type和XSS防护头
-
最小权限原则:
- 应用程序以最低必要权限运行
- 数据库用户仅具有必要权限
五、总结
本教程详细介绍了PHP代码审计中的关键风险函数,以及如何通过黑白盒测试配合的方法有效发现和验证安全漏洞。通过理解这些风险点和测试方法,安全人员可以更全面地评估Web应用的安全性,开发人员则可以编写更安全的代码。
记住:安全是一个持续的过程,需要结合自动化和人工分析,并保持对新型攻击方式的关注和学习。