高级sql注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级sql注入相关的知识,希望对你有一定的参考价值。

1. 避开输入过滤

输入过滤存在于外部和内部,外部属于web应用防火墙WAF,入侵防御系统IPS,入侵检测系统IDS,内部属于代码中对输入进行过滤

过滤select,insert等sql关键字和‘ |,等字符

(1)大小写变种:将关键字变为SeLeCt * FrOm UserINFO   由于过滤是针对全大写或者全小写,很少会对大小写做排列组合进行过滤。若单个过滤则会影响用户正常输入。

(2)使用sql注释:php中使用stristr(‘a‘,‘b‘)判断b在a中第一次出现并返回,通过

技术分享

判断输入中是否含有关键字,且大小写不敏感且二进制安全。都紧跟空格进行检查

用/**/代替空格    用like代替=  

(3)使用URL编码:URL编码是通过浏览器进行,不同浏览器的编码方式不同。IE11使用GB2312,firefox3.2使用UTF-8,解码却是根据服务器的编码模式进行解码,所以经常开发过程会出现中文未对其进行编码处理就会导致乱码问题,就是浏览器编码和服务器解码不一致问题。这样也会产生get和post的区别,get是由浏览器自动编码。但post是由请求头contentType中的charset决定编码模式,并告诉服务器应对应什么方式进行解码。所以在使用URL编码绕过sql过滤且进行get注入的时候要考虑浏览器的编码模式和服务器的解码模式,随便一个页面就能看出服务器的解码模式。JS的AJAX技术也是一样。escape就是针对GB2312的编码,URLencordCompontent是针对UTF-8的。

有的对于中文查询会在前段进行UTF-8编码再进行UTF-8(ISO-8859-1),在服务器端逆序解码。需要双URL编码。

原始注入:c‘ and if(current_user()=‘[email protected]‘,1,0)#ww

c‘%2F%2A%2A%2Fand%2F%2A%2A%2Fif%28current_user%u0023%29%3D‘root%40localhost‘%2C1%2C0)%3B%23ww

(4)使用动态查询:SQLserver允许用exec(‘‘)的方式执行sql语句

exec (‘select * from sysobjects‘)

滥用字符连接绕过sql过滤

exec(‘s‘+‘e‘+‘l‘+‘e‘+‘c‘+‘t‘+‘/**/*/**/f‘+‘r‘+‘o‘+‘m/**/s‘+‘y‘+‘s‘+‘o‘+‘b‘+‘j‘+‘e‘+‘c‘+‘t‘+‘s‘)

使用CHAR()构造单个字符,不需要引入任何引号。

sqlsever中可直接使用声明变量,赋值为0x的16进制进行

declare @query varchar(100)

set @query=0x73656C656374202A2066726F6D207379736F626A65637473

exec(@query)

(5)使用空字符:很多IDS或者WAF由C++等原生代码编写。对于空字符即是截断就会停止处理。

%00‘ UNION SELECT PASSWORD FROM TBLUSERS WHERE USERNAME=‘ADMIN‘--

原生代码指的是直接能靠cpu执行的代码,不需要虚拟机沙箱等外部应用库提供支持。

(6)对于剥离字符串:第一次剥离后不会迭代过滤器,所以可以selselectect进行注入

2. 二阶sql注入

(1) 产生原因: 攻击者需要在第一次注入的时候将目标值或者有用的东西存储在数据库中。再通过第二次查询将目标值读取出来。

应用实例:在添加用户的时候将用户名设置为 ‘+substring(@@version,1,50)+‘

数据库在插入语句则如下:insert into userinfo values (‘‘+substring(@@version,1,50)+‘‘,‘wwww‘);

这样就将版本信息插入进入了用户名字段,在随意查看用户名就知道了数据库版本号等信息。

重点考虑的是不同数据库的字符串连接符还闭合前后的引号,使得注入语句能被执行且保存在数据库中。

重点考虑的是用户名等信息在被处理的时候的具体处理方式,过滤还是剥离,或通过编码,大小写等方法一

一尝试

在用户名等插入过程中,常常将用户名设置为xxx‘ union select count(*),count(*) from xxx 等信息来进行二阶注入,在面对有输入过滤的情况下就进行绕过。

技术分享

(2) 寻找二阶注入点:常用工具无法扫出,只能通过手工注入。

1. 寻找能被用户操作且存储的数据项

2. 检测非法字符注入的可行性

3. 试试用URL编码,大小写转换等技巧绕过输入过滤

4. 针对程序可能暴露出的敏感信息页面的收集

5. 开发代码验证SQL注入,先显后盲。

防御:所有对数据库提供的操作均使用参数化,对查询结果集结构进行固定。

3. 其他思路

(1) 使用混合攻击:使用跨站和sql注入混合攻击,若id是一个容易被注入的参数则有如下语句

id=123‘ union select 1,‘<script>alert(1)</script>‘,1

(2) 使用验证过的通道:有的sql注入漏洞是需要利用管理员登陆后才有权限访问的点。所以可以先通过跨站点伪造请求。

(3) 使用ORACLE执行OS命令,通过双引号包含表名,包含恶意shell命令的表名的表则被成功创建。再通过SQL*Plus来执行的时候该脚本会去除引号,将!解析为UNIX命令,$则是windows,VMS。

以上是关于高级sql注入的主要内容,如果未能解决你的问题,请参考以下文章

高级sql注入

高级SQL注入:混淆和绕过

初探sql注入

sql注入初中高学习

sql注入靶场都有哪些

Web高级 网站安全