WEB漏洞—RCE代码及命令执行漏洞全解

WEB漏洞—RCE代码及命令执行漏洞全解

RCE

代码执行

代码执行【php中的eval函数】就是会将接收到的数据当作代码去执行,如下图做一个简单的例子,如下图

Snipaste_2022-05-15_12-46-55

此时我在浏览器上传入一个值

Snipaste_2022-05-15_12-47-35

结果是:

Snipaste_2022-05-15_12-48-03

传入的数据不是当作字符串输出,而是被当作代码执行了,输入一个echo 123 ,不是输出echo 123,而是输出123,因为会把这个数据当作一个数据执行,echo是输出函数,所以就会输出123

Snipaste_2022-05-15_12-50-18

系统命令

执行系统命令,使用php中的system函数,顾名思义就是会将传入的值当作系统命令执行,代码如下

Snipaste_2022-05-15_12-54-19

执行一下ping命令和ipconfig命令

Snipaste_2022-05-15_12-55-29

Snipaste_2022-05-15_12-56-38

可以看到是可以进行系统命令的,如果此时我执行dir命令就可以看到当前目录的所有文件了

Snipaste_2022-05-15_12-57-50

这个也是跟目标的系统挂钩的,如果对方是linux的话就需要用,ifconfig,ls之类的命令了

漏洞形成条件:可控变量,漏洞函数比如刚刚说的【eval,system】这两个函数

白盒:代码审计

黑盒:漏扫工具,公开漏洞,手工参数及功能点

Snipaste_2022-05-15_13-15-32

如果看到网站这个URL中有这php中的函数之类的东西,就可以测试一下【换成相关的php代码测试一下】

墨者靶场案例

原理

远程系统命令执行

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。

如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台执行,从而控制整个后台服务器。

现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过“自动化运维平台”进行操作。但这种平台上往往会出现远程系统命令执行的漏洞。

远程代码执行

同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

第一个案例

Snipaste_2022-05-15_13-24-16

可以看到这是一个简单的ping命令,那么说明这里可以执行系统命令,那么如果我是使用,这个其他的系统命令怎么执行,先判断对方的操作系统,通过抓包发现对方是ubuntu

Snipaste_2022-05-15_13-37-25

那么就可以用一个管道符【|】,如果直接在在这个输入框中输入:127.0.0.1 | ls。会被拦截, 然后在这样发送一次,可以看到这个

Snipaste_2022-05-15_13-39-17

Snipaste_2022-05-15_13-39-25

出现了这个就说明对方是采用的前端验证,那么我可以禁用到前端验证,但是我禁用掉之后,再去ping的话就没有任何反应了,有可能是没有将代码带入到这个服务器中执行,既然这样不行也可以用修改数据包的形式,来发送这样就可以达到一个绕过的目的。

Snipaste_2022-05-15_13-35-53

我的那个渗透版火狐好像没有小迪视频中的功能,所以这里我用这个burp抓包,然后更改,使用ls查看当前目录,可以看到有一个key的文件

这里用了很多命令,都是不行,cat,more,tail,head,什么的都不行,看了小迪的视频:用cat < 文件名的方式就可以读取到了,这里说明一下cat < 的意思,就是将后面的文件作为标准输入,然后cat就读出的意思吧,看弹幕说的。。。

提交key

Snipaste_2022-05-15_13-54-08

第二个案例

Snipaste_2022-05-15_15-54-51

Snipaste_2022-05-15_15-55-14

找一个在线运行的php网站

Snipaste_2022-05-15_15-56-06

主要要把那个&去掉,然后再把这个eval函数去掉,还有一对括号

Snipaste_2022-05-15_15-59-23

执行ls命令,看到有一个key的文件,然后访问

Snipaste_2022-05-15_16-02-12

提交

Snipaste_2022-05-15_16-01-42

那么这个靶场不是用eval执行的吗?为什么执行的是系统的命令,因为在源代码在进行解密的时候,得出的结果在上面,可以看到有两个反引号将其括了起来。反引号包起来的内容会被系统命令执行

用php手册的话说是下图

Snipaste_2022-05-15_16-10-06

第三个案例

Snipaste_2022-05-15_16-20-36

Snipaste_2022-05-15_16-25-48

路径和下面的是:

1
2
POST /password_change.cgi HTTP/1.1
user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2

根据提示查看根下的目录

Snipaste_2022-05-15_16-35-58

发现有一个key.txt

查看这个txt文件。然后对返回的数据包,进行搜索mozhe关键字

Snipaste_2022-05-15_16-35-20

Snipaste_2022-05-15_16-37-14

提交过关

啊这,居然还有一个靶场,没有这个币了,所以就截图小迪视屏的吧

Snipaste_2022-05-15_16-41-58

Snipaste_2022-05-15_16-55-35

网上找的EXP

Snipaste_2022-05-15_16-57-45

利用并获取key

之前的EXP失败是因为下图位置的地方少一个【/】

Snipaste_2022-05-15_16-58-18

名词介绍

POC:验证代码,验证漏洞是否存在

EXP:利用代码,直接利用漏洞

拓展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
php:

代码执行函数:

- - 1- eval()(特别注意:php中@符号的意思是不报错,即使执行错误,也不报错。)
- 2- assert()
- 3- call_user_func()
- 4- create_function()
- 5- array_map()
- 6- call_user_func_array()
- 7- array_filter()
- 8- uasort()函数
- 9- preg_replace()

命令执行函数:

- - 1- system()
- 2-passthru()
- 3- exec()
- 4- pcntl_exec()
- 5- shell_exec()
- 6- popen()/proc_open()
- 7- 反引号 ``

Python:exec等

Java:Java中没有类似php中的eval函数这种直接可以将字符串转化成代码去执行的函数,但是有反射机制,并期望有各种基于反射机制的表达式引擎,如OGNL、SpEL等。

代码/命令执行漏洞的查找:

- 1.代码审计,比如网站使用开源CMS,则可以去网上搜索源代码审计。推荐站长之家:https://down.chinaz.com/
- 2.漏洞工具扫描
- 3.搜索引擎搜索公开漏洞
- 4.手工查看参数值和功能点判断(参数值和脚本有关,如test.php?x=echo 等等)

**Windows系统命令拼接**

- “|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
- “&” :commandA & commandB 先运行命令A,然后运行命令B
- “||”: commandA || commandB 运行命令A,如果失败则运行命令B
- “&&” :commandA || commandB 运行命令A,如果成功


菜刀原理总结:

—菜刀将功能性函数写入程序里面

—网站访问后门地址,将接受post传递的参数,并且将传递的参数当做系统命令执行

—菜刀将操作系统的命令写入参数,以post方式传递给网站后门,网站后门通过eval()代码执行来执行系统命令或者代码,从而达到了菜刀远程操作服务器的目的。

涉及资料:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://www.anquanke.com/post/id/184668
https://www.cnblogs.com/ermei/p/6689005.html
https://github.com/shack2/Struts2VulsTools/releases/tag/2.3.20190927

[Java代码审计入门](https://www.cnblogs.com/ermei/p/6689005.html)

[PHP 远程代码执行漏洞复现(CVE-2019-11043)](http://blog.leanote.com/post/snowming/9da184ef24bd)

[墨者:PHP代码分析溯源](https://www.mozhe.cn/bug/detail/T0YyUmZRa1paTkJNQ0JmVWt3Sm13dz09bW96aGUmozhe)

[墨者:命令注入执行分析](https://www.mozhe.cn/bug/detail/RWpnQUllbmNaQUVndTFDWGxaL0JjUT09bW96aGUmozhe)

[墨者:Webmin未经身份验证的远程代码执行](https://www.mozhe.cn/bug/detail/d01lL2RSbGEwZUNTeThVZ0xDdXl0Zz09bW96aGUmozhe)

[墨者:Apache Struts2远程代码执行漏洞(S2-037)复现](https://www.mozhe.cn/bug/detail/MmZVaC9DQ2VNeGVtOGRoSVFUcHlwQT09bW96aGUmozhe)

[$_GET和$_POST里面要不要加引号?](https://segmentfault.com/q/1010000004218078)