什么是RCE?
RCE,Remote Command Execute,远程命令执行,又称为远程代码执行。可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。RCE分为远程命令执行ping和远程代码执行evel。
产生背景:应用系统从设计上需要给用户提供指定的远程命令操作的接口,用户通过浏览器提交执行命令,由于服务器没有针对执行函数做过滤,导致了执行了服务器的系统命令。
如何挖掘RCE漏洞?
黑盒测试:网站中有特殊功能,比如Ping、数据库备份等等。
白盒测试:查看命令执行函数是否做过滤。命令执行函数如下:
PHP代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
PHP命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()
当后端代码中使用上述函数时,一般都会存在RCE漏洞。
如何利用RCE漏洞?
要想利用RCE漏洞,要先了解关于命令拼接符号的理论知识。
Windows下命令拼接符号
符号 | 含义 | 例子 |
&& | 左边命令执行成功,才执行右边的命令 | ping 127.0.0.1 && echo 'hi' |
& | 右边的命令执行不受左边命令执行的影响 | ping 127.0.0.1 & echo 'hi' |
| | 左边命令执行的结果,作为右边命令执行的参数 | cd /1.txt | cat |
|| | 左边命令执行失败,才执行右边的命令 | ping 127.0.0.1 || echo 'hi' |
Linux下命令拼接符号
符号 | 含义 | 例子 |
&& | 左边命令执行成功,才执行右边的命令 | ping 127.0.0.1 && echo 'hi' |
; | 右边的命令执行不受左边命令执行的影响 简单的命令拼接 | ping 127.0.0.1 & echo 'hi' |
| | 左边命令执行的结果,作为右边命令执行的参数 | cd /1.txt | cat |
|| | 左边命令执行失败,才执行右边的命令 | ping 127.0.0.1 || echo 'hi' |
& | 在后台执行命令 |
然后,我们找到源码,进行代码审计,找出代码中对输入参数的限制,接着利用“等效替换”的方法,绕过过滤,进而拿到webshell,进行内网横向渗透。下面是一些常见的绕过机制:
- 空格代替:使用IFS$9、%09、、<>、{,}、%20、${ IFS}、${IFS}来代替空格
- cat过滤:使用more、less、head、tail
- 过滤目录分隔符:%0a代替目录分隔符
- 过滤关键字:采用模糊匹配,正则表达式进行绕过
- 采用url编码进行绕过
RCE的危害与防御
RCE属于高危漏洞,能直接获取服务器的控制权。常见的危害如下:
1.获取服务器权限
2.获取敏感数据文件
3.写入恶意文件getshell
4.植入木马病毒勒索软件等
防御:
1.尽量不要使用命令执行的函数
2.如果必须使用,需要做白名单处理(白名单策略:不在名单内的 都是拒绝的)
3.用正则表达式对用户输入的内容进行处理
4,使用WAF