SQL注入到Blind-RCE

Posted 快识

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入到Blind-RCE相关的知识,希望对你有一定的参考价值。



我又回到了一个有趣的发现。这次我将一个SQL注入实例,但这有点不同。此处的应用程序基于ASP.Net,使用MSSQL,支持堆叠查询,并且数据库用户也是sysadmin。一切看起来都很不错,可以完美地执行xp_cmdshell。我面临的唯一问题是,我无法在第一个查询之后获得查询的输出。最重要的是,该应用程序位于防火墙后面,该防火墙不允许任何外部访问。因此,我可以执行OS命令,但是看不到它的输出。这成为一种Blind的RCE。但是,正如标题所示,这不是一个Blind的RCE。


我已经建立了一个相同的测试环境来演示我们确切的问题。让我们看看我们如何在这里提取 xp_cmdshell 的输出。

执行基于UNION的SQL注入
首先,让我们分析易受攻击的请求,然后尝试执行基于UNION的SQL注入。查看下面的屏幕快照, txtUserName 参数容易受到SQL注入的攻击。

SQL注入到Blind-RCE


我将尝试关闭带有注释的查询。但是,当这样做时,我们会遇到另一个错误:


SQL注入到Blind-RCE


该错误表明basicsalary是无效的列名。通过仔细观察错误消息中公开的查询部分,仅使用单引号作为有效内容,我们发现查询已连接了Payslips表。也许此列是该表的一部分。在这种情况下,在注释掉查询的其余部分之前,我们还需要在有效负载中加入Payslips表。尝试一下:


SQL注入到Blind-RCE


查询,我们有一些数据!将进一步处理典型的ORDER BY,然后再处理UNION语句,获得有效的基于UNION的SQL注入:

SQL注入到Blind-RCE


检查数据库用户权限

下一步是检查数据库用户是否是sysadmin,因为只有sysadmin才能启用xp_cmdshell并执行OS级命令,这是我们最终的目标。


在这里,我想介绍一个很棒的SQL注入备忘录。它来自 pentestmonkey 。查看该备忘单,我们发现可以使用SELECT is_srvrolemember(' sysadmin ')查询来确定当前的数据库用户是否为 sysadmin 。让我们尝试一下:

SQL注入到Blind-RCE

由于我们在响应中得到1,因此可以确认当前数据库用户确实是sysadmin


检查对查询的支持
这意味着我们可以在一个语句中运行多个查询,方法是使用分号将它们分开,就像在命令行中一样。因此,如果我们用这样的查询:
SELECT * FROM user WHERE userid = "<injection-point>"

支持堆叠查询,我们可以运行以下查询:

SELECT * FROM user WHERE userid = "-1" AND 1=2; WAITFOR DELAY '0:0:5'; -- "


如果没有堆栈查询,我们将仅限于 SELECT 语句,并且无法运行任何 INSERT UPDATE DELETE 或类似EXEC查询的操作。但是使用堆积式查询,我们可以执行所需的任何类型的查询。这就是为什么在没有堆叠查询的情况下,窥视现象不会在CVSS向量中标记任何完整性影响的原因。


无论如何,请继续检查是否支持堆叠查询。我们将在查询后堆叠一个waitfor delay查询,看看它是否执行:


SQL注入到Blind-RCE


5秒的延迟在此处确认支持堆叠查询。现在看看我们是否也能够获得堆叠查询的输出。将堆叠SELECT 1、2、3、4而不是使用UNION:

SQL注入到Blind-RCE


请注意,我们的 SELECT 1,2,3,4 没有得到任何输出,这意味着在初始查询之后将要堆积的查询没有任何输出。

执行 xp_cmdshell
现在,启用 xp_cmdshell 并确认我们是否至少能够执行OS命令。为此,请参考备忘录。需要执行以下SQL命令:
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

让我们这样做:
SQL注入到Blind-RCE

我们启用了 xp_cmdshell 。现在让我们测试一下:

SQL注入到Blind-RCE


延迟3秒(默认为4 ping)表明我们确实有命令执行!目前,我们可以做的是尝试重新连接到VPS服务器并获得有效的Shell。如果应用程序位于配置为阻止传出连接的防火墙后面,仍允许DNS查询,则可以使用此处介绍的DNS渗透方法。但是在我们的案例中,防火墙不允许任何外部交互。到目前为止,我一直陷入Blind的RCE。


将BlindRCE升级为不Blind的RCE
我们可能要做的就是运行命令并将其输出重定向到文件,该文件位于webroot内部,我们可以从网站本身访问该文件。例如,如果我们的网站托管在 C: inetpub wwwroot 中,我们将使用 xp_cmdshell 执行类似 whoami> C: inetpub wwwroot opt.txt 的命令,然后浏览 http:\ site.com opt。txt 以获取whoami命令的输出。

图片

在这种情况下,我们不知道网站的物理路径。因此,我们必须以其他方式读取文件。回顾旧备忘单,确实找到了方法!可以执行以下查询来读取文件:

CREATE TABLE mydata (line varchar(8000));BULK INSERT mydata FROM 'c:windowswin.ini';SELECT line FROM mydata;


使用这种方法。首先,让执行命令并将其输出存储在一个临时文件中:
SQL注入到Blind-RCE


现在,我们将创建一个表并将临时文件的内容存储在该表中:
SQL注入到Blind-RCE



在表中有了内容之后,我们就可以使用UNION查询来读取它:


成功读取要执行的命令的输出了!



每天分享干货...

☜长按二维码识别关注

右下角点个“在看”吧~

 


以上是关于SQL注入到Blind-RCE的主要内容,如果未能解决你的问题,请参考以下文章

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

mybatis以及预编译如何防止SQL注入

手机只需发条消息即可开始大规模SQL注入攻击

基于约束的SQL攻击