Web漏洞之RCE
(部分搜寻的资料用于自学,如有侵犯,联系可删! ———— by 611)
RCE漏洞
一、基础知识
RCE:Remote Code/Commond Execute,远程代码/命令执行
(分为两种:远程代码执行和远程命令执行)
1、漏洞原理
在Web应用中,开发者为了灵活性在编写代码时会应用一些代码执行函数或者系统命令执行函数,如果这些执行函数或函数的参数是用户可控制的,攻击者就可以通过代码/命令执行来获取恶意信息。
2、举例
(1)远程代码执行
就是执行脚本代码。
以下图为例,根据611.php可以发现,后端代码在开发的时候设定对于GET传入的内容均利用eval函数,即:将传入的字符串作为代码执行,因此如果我们把GET参数里的内容写成了我们有目的的代码,那么就会执行,我们就可以通过这样的漏洞获取到信息,这个过程就是一次简单的远程代码执行漏洞的利用。(小tips:注意下图例子中eval函数的运用,最好要被执行的语句两边加引号,而且记得如果里面是个语句,要以分号结尾,否则就是不完整的代码语句)
(2)远程命令执行
就是执行系统命令(相当于远程往cmd里写命令)
以下图为例,php中system()函数的主要功能是在系统权限允许的情况下执行系统命令,根据611.php可以发现,后端代码在开发的时候设定对于GET传入的参数内容均利用system函数,将其按照系统命令执行,并输出执行结果。那么我们就可以对输入的参数写成我们想要的系统命令,之后代码就会执行,返回输出结果,我们就可以通过漏洞获取信息,这就是一次简单的远程命令执行漏洞。
二、相关函数
1、eval函数
(1)用法:
eval ("string");
(2)作用:把字符串当做代码来执行。
(3)注意事项:
-
注意字符串两边的双引号,不加有时候会报错。
-
加双引号时,记得如果里面有诸如GET的请求方法,GET请求里面的参数就应该把单引号去掉,不然会报错。‘
-
反引号(`)的作用:如果字符串两边加上了反引号,那就意味着字符串不再是按照代码来执行,而是按照系统命令来执行。
eval(`$_GET[a]`;); //如果是linux系统,假如a传入的值是ls,那就直接显示目录,因为字符串加上反引号之后就是按照系统命令来执行。
2、system函数
system(char *conmmand)函数用来发出一个DOS命令,例如system("dir"),用来调用系统查看目录的命令
三、靶场举例
墨者学院 (php代码分析溯源第四题)
https://www.mozhe.cn/bug/detail/T0YyUmZRa1paTkJNQ0JmVWt3Sm13dz09bW96aGUmozhe
1、启动环境后,发现界面是一串php代码,观察发现是对数据进行了base64的解密,然后压缩。
<?php
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
2、我们可以直接找一个php在线调试的工具,把eval里面的一串内容输出出来,这样就知道eval里的语句代码是什么了。(注意:base64_decode里面的两个$要换成")
<?php
echo(gzinflate(base64_decode("40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==")));
?>
3、我们发现是利用request请求传入了参数a,所以界面原来想表达的代码就是:
eval(`$_REQUEST[a];`);
注意:eval中的字符串用反引号包裹起来了,那就意味着不再是按照代码来执行,而是按照系统命令执行,也就是说,传入的参数a会被当成系统命令来执行。
4、判断操作系统,根据大小写页面回显情况判断出是linux系统。
5、参数a赋予ls命令,查看目录。
6、发现那个key的文件应该就是包含flag的,因此查看文件的内容。但是用cat命令发现没反应,head tail也都不行,最后发现tac可以。
墨者学院 (命令注入执行分析)
https://www.mozhe.cn/bug/detail/RWpnQUllbmNaQUVndTFDWGxaL0JjUT09bW96aGUmozhe
1、进入靶场,发现是一个可以通过输入IP地址,并实行Ping命令的界面。
2、尝试其他代码,发现有弹窗检验IP格式,像以下这种弹窗,第一次弹,第二次弹有阻止弹窗的选项,那么就有可能这个检验函数是在前端。
3、检验发现真的是在前端有一个函数来验证,那么我们可以通过把这段js代码删掉,或者禁用js代码,来绕过这个检验函数。
4、禁用js。
5、禁用之后,如果想调用别的系统命令,需要用到Linux中的管道功能,因为输入之后一定是有Ping命令的,而管道的功能就是执行多个命令,每个命令用 | 来分开。因此我们可以前面输入要Ping的IP地址,然后用管道分隔符,后面写我们想让其执行的命令。
127.0.0.1|ls
6、发现key开头的文件应该是隐藏flag的,因此使用查看文件的相关命令。利用cat命令查看文件内容,发现无效;可以尝试换成cat<
127.0.0.1|cat<key_69375999467.php
7、成功过关。
利用公开的远程代码执行漏洞
比如WebMin漏洞,墨者学院也有靶场,这里不再进行演示。