关键字绕过
考察的知识点
• 对常用关键字禁止使用或删除的绕过。
• 手动构造注入语句。
常见的注入绕过方式
在注入过程中,攻击者输入“select”“union”“and”“or”“=”及空格等,往往会被程序的防御机制阻断,即程序不允许执行含有这些关键字的语句。攻击者在尝试绕过这些检测机制时通常会采取以下手段。
(1)编码绕过
• select URL编码:%73%65%6c%65%63%74。
• select双重编码:%25%73%25%65%25%6c%25%65%25%63%25%74。
• admin:CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110)SELECT(0x3C 613E61646D696E3C2F613E,0x2f61))。
除了可以使用在线编码,还可以使用一些本地工具,例如Burp Suite中的Decoder,如图1-1所示。
图1-1
(2)字母大小写绕过
SeleCT、uNioN、And、Or等。
(3)在关键字内添加无效字符
SE%00LECT、Sel%0bECT、%00-%0b及其他空字符。
(4)内联注释绕过
/*! code */、/*! uNION */、/*! SelECt */。
(5)利用被删除的关键字绕过
如果程序对某些关键字采取了删除措施,那么攻击者可能会利用“SEL + SELECT +ECT”的方式构造SELECTECT语句。此时,如果程序删除了SELECT关键字,就相当于让攻击者成功输入了SELECT关键字。同理,在删除其他字符(例如“<>”)时,攻击者也可以使用该字符实现绕过(例如“S<>ELECT”“UN<>ion”等)。
(6)等价函数与命令绕过
例如:用“&&”“||”代替“and”“or”;用“%20 %09 %0a %0b %0c %0d %a0 /**/制表符 ()反引号”代替空格;用“and 1 like 1”代替“and 1=1”;用“and 2>1”代替“and 1=1”;用“and 2<1”代替“and 1=2”;用sleep()代替benchmark();用concat_ws代替group_concat();用mid()、substr()、strcmp()代替substring();用 @@user代替user();用@@datadir代替datadir()。
(7)宽字节注入
当数据库编码为GBK,PHP开启了GPC等,并且在单引号前添加了反斜杠“\”时,输入“%df%27”,程序会在“%27”前添加一个“\”,构成“%df%5c%27”。
在GBK编码中,“%df%5c”是一个宽字符串,后面的“%27”不会被处理。这相当于插入单引号,形成了注入。
(8)溢出绕过
一段常见的溢出绕过代码如下。
(9)其他符号绕过
不同的WAF对输入代码的处理方式不尽相同。如果遇到采用上述方式无法绕过且确实需要注入的题目,应尽量进行模糊测试(Fuzzing),看看哪些函数是不可用的,哪些函数是可用的。笔者曾遇到将\n\r\t这样的字符添加在关键字中,程序在处理换行时自动把下一行接到上一行从而构成语句的情况。还可以使用一些数学运算函数(例如“exp(x):”,取常数e的x次方,e是自然对数的底)构造报错语句,从而实现注入。