前言
远程代码执行漏洞(RCE,也叫任意代码执行),是由用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致执行了服务器的命令。 RCE漏洞的造成方式有很多种,一旦可以执行任意命令,就可以执行任意操作,属于高危漏洞。
远程代码执行:Remote Code Execute
应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval(),eval可以将字符串当做函数执行)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。一般很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。
远程命令执行:Remote Command Execute
命令执行直接调用操作系统命令。其原理是,在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交命令执行命令,由于服务端没有针对执行函数做过滤,将用户的输入作为系统的命令的参数拼接到命令行中,在没有过滤用户输入的情况下,造成命令执行漏洞。
为什么要远程执行代码?
**漏洞危害 **
近几年影响比较大的RCE漏洞
PHP RCE涉及函数
代码code注入:
命令command注入 :
靶场案例
在靶场案列演示之前,我们先来学习一些基础的知识:
Windows命令拼接符号:
Linux命令拼接符号:
接下来我们拿pikaqiu靶场来做演示:
我们再来看一下它的源代码,很简单就是调用了shell_exec执行用户输入的命令:
我们输入一个127.0.0.1去ping一下:
得到了结果,并执行了响应。
但如果我们在这条命令后面跟上了恶意的命令呢?由于服务端没有对恶意函数进行限制,会不会导致恶意代码执行呢?
如图显示,ipconfig命令执行了。原本只有ping功能的服务,却应为没有对用户输入进行验证,导致了恶意命令的执行。
我们再来看一下第二种eval:
我们之前说过,代码执行漏洞就是因为后端使用了eval()这样的函数,导致将用户输入的字符串解析成了代码执行,我们这里输入 phpinfo();看看会发生什么?
可以看到他将我们输入的字符串当作函数来执行了。
CTF案列
我们打开CTFhub平台:
我们从最简单的eval执行开始:
我们启动靶场,打开环境:
看到出现如图下所示的场景:
我们这里可以分析一下他的代码,可以看到这里面有个eval函数,传参是cmd,那我们可以直接通过Webshell工具去连接他:
我们点击添加,然后双击url打开:
然后显示如下:
我们可以看到这里有个index.php文件,我们通过终端去看看:
可以看到在根目录路径下有个flag_22263文件,我们打开它:
然后看到了flag,点击提交他:
我们再来看下第二道题目:
出现如图下所示的界面:
我们来分析一下这串代码,首先判断用户输入存不存在,然后通过Get请求接受用户输入的ip,然后执行ping -c 用户输入的ip并赋值给$cmd参数,最后通过exec函数去执行。
我们这里输入ping 127.0.0.1来查看他的功能是否正常:
因为这里是一个linux的操作系统,所以我们在127.0.0.1加上;号在跟上ls命令:
然后我们发现了以下的文件:
我们继续构造语句查看这个文件的内容:
发现什么都没有。
我们继续在我们的语句后面添加上命令,进行一个base64的转码:
然后果然出现了内容,接下啦我们把这段base64的编码拿去解密:
得到:
然后提交flag:
接下来我们来看第三题:
老样子,我们打开靶场:
看到如下代码:
和上一管基本相似,但多了一个过滤cat命令。
这一步和上一关一样。
回显:
但这里因为cat命令被禁用了,我们只能另寻他路了。
其实这里考的就是我们查看文件的方式,Linux系统下查看文件的命令太多了,我就不一一列举了,这里直接 less跟上文件名:
得到以下数据:
老规矩,拿去解密:
然后得到了这么一串数据:
提交:
我们接下来看第四关:
它这里过滤了空格。
老方法 :
这一题主要考的就是我们Liunx里有哪些可以替换空格的操作符号:
得到这么一串数据:
解密:
第五关:
出现了跟之前不同的东西,这应该是个文件夹,而不是跟之前一样是一个文件。
我们通过ls命令去列出这个文件夹的内容:
发现里面有一个flag。
这一题考的就是过滤目录分割符:
这里我们先 cd 到目录下,然后跟上;号,接着cat命令 去查看这个文件:
然后我们直接右键查看网页源代码:
提交flag。
第六关:
像上面提到的这些运算符全部都被过滤了。但唯独没有过滤;号。
cat命令查看文件:
右键查看网页源码:
第七关:
我们发现好多东西都被过滤了。
这一题由于;符号被过滤了,所以我们在url一栏中后面添加上%0a来进行绕过:
我们本来应该构造如下语句的:127.0.0.1%0acd flag_is_here%0als 进入这个目录,查看文件,但由于空格和flag都被过滤了,我们之前提到过空格可以用${IFS}来替代,flag这里我们可以运用通配符来替代。
然后应该构造如下语句的:127.0.0.1%0acd${IFS}f***_is_here%0alsmore${IFS}f***_20021218031292.php来进行绕过:
右键查看源码:
RCE防御
1、尽量不要使用命令执行的函数
2、如果必须使用,需要做白名单处理
3、用正则表达式对用户输入的内容进行处理
4、使用WAF
版权归原作者 私ははいしゃ敗者です 所有, 如有侵权,请联系我们删除。