1. 避开输入过滤 php
输入过滤存在于外部和内部,外部属于web应用防火墙WAF,入侵防护系统IPS,入侵检测系统IDS,内部属于代码中对输入进行过滤 web
过滤select,insert等sql关键字和' |,等字符 sql
(1)大小写变种:将关键字变为SeLeCt * FrOm UserINFO 因为过滤是针对全大写或者全小写,不多会对大小写作排列组合进行过滤。若单个过滤则会影响用户正常输入。 shell
(2)使用sql注释:php中使用stristr('a','b')判断b在a中第一次出现并返回,经过 数据库
判断输入中是否含有关键字,且大小写不敏感且二进制安全。都紧跟空格进行检查 windows
用/**/代替空格 用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()='root@localhost',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。