1609 字
8 分钟
RCE 远程命令执行漏洞
0x16 RCE漏洞
一、简介
RCE(remote command/code execute,远程命令执行)漏洞,一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。 一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器二、作用
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。三、原理
以PHP为例,system、exec、shell_exec、passthu、popen、proc_popen等函数可以执行系统命令。当我们可以控制这些函数的参数时,就能运行我们想运行的命令,从而进行攻击。 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。 现在很多的企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。在这种平台上往往会出现远程系统命令执行的漏洞。 远程代码执行同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。 因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。四、产生条件
可控变量、漏洞函数五、系统命令执行函数
1、system()
2、passthru()
3、exec()
4、shell_exec()
5、popen()
6、proc_open()
7、pcntl_exec()
在网址中的使用(举个例子):
node5.anna.nssctf.cn:28588/?url=system('l\s');
又或者
node5.anna.nssctf.cn:28588/?url=l\s
php就会执行系统命令六、windows系统命令拼接方式
1、"|" cmdA | cmdB 只执行cmdB (这边是把cmdA的一个输出结果作为cmdB的一个输入参数,cmdB处理过后才输出,所以这里只执行cmdB)
当cmdA与cmdB命令是相关联的话就譬如:在windows的cmd中输入 netstat -ano | findstr 80 就是把netstat -ano输出的所有参数当成findstr的一个输入参数,findstr再执行查找80关键字的处理后再进行输出,所以从某种意义来说,只执行findstr这个命令
要是两个命令毫不相干的话就只会执行cmdB
2、"||" cmdA || cmdB cmdA执行成功,就停止;执行失败,继续执行cmdB
3、"&" cmdA & cmdB 先运行cmdA,然后运行cmdB (windows系统,都会执行两个命令。Linux会分别使用两个界面输出两个命令结果)
【cmdA;cmdB //只适用于Linux系统;两个命令都会执行】
4、"&&" cmdA && cmdB 先执行cmd1,cmd1执行成功才会执行cmd2七、绕过方式
1、空格过滤
用这些方式来代替空格
%09(tab键) %20、$IFS$9、<>、${IFS}(空格)2、关键字过滤
当cat关键字被过滤的时候
base64编码绕过:echo"cat a.txt" | base64 进行base64位编码,得到编码:Y2F0IGEudHh0Cg==echo Y2F0IGEudHh0Cg== | base64 -d 进行base64位解码,得到解码:cat a.txt (-d是解码的意思)echo Y2F0IGEudHh0Cg== | base64 -d | sh (这里使用bash是可以的) 将会执行cat a.txt(输出其中的内容)
hex编码绕过:echo "cat a.txt" | xxdecho 6361 7420 612e 7478 740a | xxd -r -pecho 6361 7420 612e 7478 740a | xxd -r -p | sh (这里使用bash也是可以的)3、偶读拼接
某些关键字无法执行的时候,就先拆开再组合
a=l;b=s;$a$b 执行ls命令
a='ca';b='t ab';c='c.txt';$a$b$c 执行cat abc.txt命令4、换行绕过
%0a 换行
有些网站,只会对第一行的参数进行过滤,第二行不会。
举例:%0A cat flag.php5、花括号{}绕过
cat abc.txt
{cat,abc.txt} 其中的空格被过滤的时候,就用' {} ',中间的空格换成' , '就好
{ls,} 只有一个参数的话要在旁边加个,6、内联执行
本来echo是输出字符串,但现在在里面加上了' ` '变成了执行内部的命令
echo "`cat abc.txt`" 这个' ` '符号是与' ~ '属于同一个按键的符号,在Esc键的下方,注意!这里面符号不是单引号!7、引号执行
将关键字拆开但不影响执行
cat abc.txt
c""at abc.txt8、反斜杠执行
将关键字和文件名拆开但不影响执行
c\at ab\c.txt9、方括号[]绕过
将文件名拆开但不影响执行(不经常用)
cat abc.txt
cat ab[c].txt 不要用方括号去绕过关键字例如cat10、关键字替换绕过
有一些关键字虽然不同,但功能大体相似,当某些关键字被过滤的时候就可以才用具有相似功能的关键字
就譬如:
cat:查看一个文本文件的内容tac:以行为单位反序输出文件内容,即第一行最后显示,最后一行先显示,输出内容和cat 命令相反。
虽然功能不一样,但是都可以查看文件总结
1.空格绕过:%09,%20,$IFS$9,<>,${IFS},花括号{}
2.文件名参数绕过:base64,hex编码,偶读拼接,引号执行,反斜杠执行,方括号[]
3.关键字过滤:反斜杠执行,引号执行,偶读拼接,base64,hex编码
闽公网安备 35050402880173号