1. 漏洞环境搭建与初步分析
最近在复盘CTF比赛题目时,遇到一个典型的命令注入案例,来自SWPUCTF 2021新生赛的easyrce挑战。这个题目完美展示了Web应用中eval()函数使用不当导致的严重安全问题。我们先来看下题目提供的环境界面(图1),可以看到这是个简单的PHP脚本执行环境。
提示:在真实渗透测试中,遇到eval()函数要特别警惕,这往往是命令注入的高危点。
eval()作为PHP中强大的动态代码执行函数,它会将传入的字符串参数直接作为PHP代码执行。题目中通过GET方法接收url参数,并将其直接传递给eval()执行。这种设计在开发中虽然方便,但如果没有严格的输入过滤,就会形成严重的安全漏洞。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞利用原理深度解析
2.1 eval()函数工作机制
eval()的语言特性决定了它会将字符串参数解析为有效的PHP代码并执行。例如:
php复制eval('echo "Hello World";');
这行代码实际上会输出"Hello World"。问题在于,当这个字符串来自用户可控的输入时,攻击者就可以注入任意PHP代码。
2.2 系统命令注入路径
题目中开发者使用了system()函数来执行系统命令。system()与eval()的致命组合形成了双重危险:
- eval()允许执行任意PHP代码
- system()允许执行操作系统命令
典型的攻击链如下:
code复制用户输入 -> 通过GET传递 -> 未经过滤直接eval() -> 执行system() -> 操作系统命令执行
2.3 命令拼接技术
在HTTP请求中,我们使用?url=参数来传递payload。关键技巧在于:
- 使用分号(;)闭合前一条语句
- 在Linux中,分号是命令分隔符
- 通过闭合前面的PHP语句,我们可以插入自己的system()调用
3. 完整渗透测试过程
3.1 初始信息收集
首先我们尝试最基本的命令注入,列出根目录下的文件:
code复制?url=system("ls /");
这个payload的工作原理是:
- 原始代码可能类似:eval($_GET['url']);
- 我们传入system("ls /");
- 最终执行的PHP代
