绕过web防火墙

        今天去面试一个渗透测试岗位,其中有一题“”绕过waf的方法“”,说实在本人虽然是信息安全专业,但是做母校专业鼻祖,真不敢恭维母校的教学质量。后来本人出来做了软件开发,可以说软件开发几乎是自学,成不成才真不好说,懂一点点皮毛,混口饭吃;后来想转到安全,去面试几家安全类岗位,好几个都以我没工作经验为由拒绝我,其实也有我能力不是很突出的问题,本人懂的东西很广,但是都不怎么深入,竟然连绕过防火墙这样的问题都不懂,深感惭愧,真对不起那个坑蒙拐骗的母校。

        后来我在网上看到一篇写得不知道如何的,反正我不懂,就学习了,为了防止类似情况出现,而消耗大量时间去查找,本人在此摘抄下来,与大家分享。

转自:http://www.myhack58.com/Article/html/3/7/2016/78244_3.htm



0×01 前言:

这个议题呢,主要是教大家一个思路,而不是把现成准备好的代码放给大家。

可能在大家眼中WAF(Web应用防火墙)就是“不要脸”的代名词。如果没有他,我们的“世界”可能会更加美好。但是事与愿违。没有它,你让各大网站怎么活。但是呢,我是站在你们的这一边的,所以,今天我们就来谈谈如何绕过WAF吧。之所以叫做“杂谈”,是因为我在本次演讲里,会涉及到webkit、nginx&apache等。下面正式开始:)

0x02 直视WAF:

作为第一节,我先为大家简单的说下一些绕过WAF的方法。

1、 大小写转换法:

看字面就知道是什么意思了,就是把大写的小写,小写的大写。比如:

1
2
SQL:sEleCt vERsIoN();
‍‍XSS:

出现原因:在waf里,使用的正则不完善或者是没有用大小写转换函数

2、 干扰字符污染法:

空字符、空格、TAB换行、注释、特殊的函数等等都可以。比如下面的:

1
2
3
SQL:sEleCt+1-1+vERsIoN   /*!*/       ();`yohehe‍‍
‍‍SQL2:select/*!*/`version`();
XSS:下面一节会仔细的介绍

3、字符编码法:

就是对一些字符进行编码,常见的SQL编码有unicode、HEX、URL、ascll、base64等,XSS编码有:HTML、URL、ASCII、JS编码、base64等等

1
2
SQL:load_file(0x633A2F77696E646F77732F6D792E696E69)
‍‍‍‍XSS:<%2Fscript>

出现原因:利用浏览器上的进制转换或者语言编码规则来绕过waf

4、拼凑法

如果过滤了某些字符串,我们可以在他们两边加上“原有字符串”的一部分。

1
2
SQL:selselectect verversionsion();
‍‍‍‍XSS:rip>alalertertrip>

出现原因:利用waf的不完整性,只验证一次字符串或者过滤的字符串并不完整。

本节是告诉大家,waf总会有自己缺陷的,任何事物都不可能完美。

0x03 站在webkit角度来说绕过WAF:

可能这时会有人问到,说绕过WAF,怎么跑到webkit上去了。嗯,你没有看错,我也没有疯。之说以站在webkit角度来讲绕过WAF,是因为各个代码的功能是由浏览器来解析的。那浏览器中谁又负责解析呢?那就是webkit, 既然要说到webkit,那就不得不提webkit下的解析器——词法分析器,因为我们在绕过的时候,就是利用解析器中的词法分析器来完成。

就比如一个简单的绕过WAF的XSS代码: