当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候需要报错或盲注进行后续的操作,同时作为手工注入时。报错注入最简单,其次布尔注入,最后是延时注入
我们要学会看网站功能判断代码的写法
在网站应用中进行数据显示查询操作
例: select * from news where id=$id
在网站应用中进行用户注册添加等操作
例: insert into news (id, url,text) values ( 2,'x','$t')
后台管理里面删除文章删除用户等操作
例: delete from news where id=$id
会员或后台中心数据同步或缓存等操作
例: update user set password='xxx' where id=2 and username=' admin'
一般结合表名或列名进行数据排序操作
二、SQL语句盲注
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称为盲注。盲注可以分为一下三类:
1、基于布尔的SQL盲注-逻辑判断 regexp, like , ascii,left, ord , mid
2、基于时间的SQL盲注-延时判断 if ,sleep
3、基于报错的SQL盲注-报错回显 floor,updatexml,extractvalue
1、insert语句注入(pikachu)
用burp抓取post数据包,并修改数据包,如图进行注入
以此类推
2、update语句.
通过网络抓取到post提交数据,原理基本一致,以此类推
3、delete注入(pikachu)
通过网络协议发现,没删除一个留言id都会发生变化,这说明了请求注入的时候id也就是注入点
可以看见对已经删除的留言显示失败,说明id存在注入,由于id是数字,所以先尝试不见符号进行注入,又因为不能正常回显,所以使用报错注入法,以此类推
1、Sleep语句
2、If语句
1代表真 0为假
用if语句判断是否为真
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开头,如果是延时五秒
布尔(Boolean)型是计算机里的一种数据类型,只有True(真)和False(假)两个值。一般也称为逻辑型。
页面在执行sql语句后,只显示两种结果,这时可通过构造逻辑表达式的sql语句来判断数据的具体内容。
布尔注入用到的函数:
mid(str,start,length) :字符串截取
ORD() :转换成ascii码
Length() :统计长度
version() :查看数据库版本
database() :查看当前数据库名
user() :查看当前用户
布尔注入流程:
猜解获取数据库长度
渗透过程中,以此类推
猜解数据库名
'or mid(database(),1,1)= 'z' --+ :因为需要验证的字符太多,所以转化为ascii码验证
'or ORD(mid(database(),1,1)) > 100 --+ :通过确定ascii码,从而确定数据库名
猜解表的总数
‘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
Ord和ascii函数都是把字符转换成ascii值
猜解表字段的总数(count)
Count函数是计算总数有多少个,而不是长度
猜解表的字段名
先判断长度,然后猜解字符(可利用burp暴力破解)
利用mid函数猜解字符
通过此方法,以此类推,直接猜解出字段名
判断内容的总数
当你知道字段名为 id username password时候
以此类推
猜解内容长度·
当你知道字段名为 id username password时候
猜解内容
通过mid函数猜解内容
?id=1' and mid((select (concat(username,'~',password)) from security.users limit 0,1),1,1) ='D'--+
通过ascii计算猜解内容
?id=1' and ORD(mid((select (concat(username,'~',password)) from security.users limit 0,1),1,1))=68--+
也可以直接猜解出内容
?id=1' and (select (concat(username,'~',password)) from security.users limit 0,1)='Dumb~Dumb'--+
遇到实战建议布尔盲注加延时注入效果更佳,极其适合手工
关于库的计算总数
以此类推就好了
猜解第一个库的长度
直接验证数据名