带有SQL注入的不太盲目的RCE

  • A+
所属分类:安全文章

点击标题下「蓝色微信名」可快速关注

带有SQL注入的不太盲目的RCE

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

我已经建立了一个相同的测试环境,以演示我们手头的确切问题。让我们看看如何提取xp_cmdshell 此处的输出 。

执行基于UNION的SQL注入

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

带有SQL注入的不太盲目的RCE

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

带有SQL注入的不太盲目的RCE

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

带有SQL注入的不太盲目的RCE

查询执行,我们有一些数据!我们将继续进行典型的 ORDER BY 然后是 UNION 语句的工作,以获得基于UNION的有效SQL注入:

带有SQL注入的不太盲目的RCE

检查数据库用户权限

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

在这里,我想介绍一个

很棒的SQL注入备忘单

。它来自pentestmonkey。查看该备忘单,我们发现可以使用 SELECT is_srvrolemember('sysadmin') 查询来确定当前的数据库用户是否 sysadmin 存在。让我们尝试一下:

带有SQL注入的不太盲目的RCE

既然1 在响应中得到a ,我们就可以确认当前的数据库用户确实是a sysadmin 。

检查对堆叠查询的支持

堆叠查询意味着我们可以通过使用分号字符将它们分开来在单个语句中运行多个查询,就像我们在命令行中所做的一样。因此,如果我们有这样的查询:

SELECT * FROM user WHERE userid =“ <注入点>”

在支持堆叠查询的情况下,我们可以运行以下查询:

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

没有堆查询,我们只限于 SELECT 报表而无法运行任何 INSERT , UPDATE , DELETE 或类似 EXEC 的查询。但是,使用堆叠式查询,我们可以执行所需的任何类型的查询。这就是为什么偷看,没有堆查询,并不标志着CVSS向量任何完整性的影响。

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

带有SQL注入的不太盲目的RCE

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

带有SQL注入的不太盲目的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注入的不太盲目的RCE

惊人的!我们已经启用了 xp_cmdshell 。现在让我们测试一下:

带有SQL注入的不太盲目的RCE

延迟3秒(默认为4 ping)表明我们确实有命令执行!目前,我们可以做的是尝试重新连接到VPS服务器并获得有效的Shell。如果应用程序位于配置为阻止传出连接的防火墙后面,但仍允许DNS查询,则可以使用

此处

介绍的出色的DNS渗透方法。但是在我们的案例中,防火墙不允许任何外部交互。到目前为止,我们一直陷入盲目的RCE。

将盲RCE升级为不太盲的RCE

我们可以做的是运行命令并将其输出重定向到文件,该文件位于webroot内部,我们可以从网站本身访问该文件。例如,如果我们的网站托管在中 C:inetpubwwwroot ,我们将使用 xp_cmdshell 来执行类似的命令 whoami > C:inetpubwwwrootopt.txt ,然后浏览 http:\site.comopt.txt 以获取whoami 命令的输出 。

出色地…

听起来不错,不起作用。

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

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

让我们使用这种方法。首先,让我们执行命令并将其输出存储在一个临时文件中:

带有SQL注入的不太盲目的RCE

现在,我们将创建一个表并将临时文件的内容存储在该表中:

带有SQL注入的不太盲目的RCE

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

带有SQL注入的不太盲目的RCE

和繁荣!现在,我们可以读取要执行的命令的输出了!


关于作者

具有2年经验的OSCE和OSCP认证专家。保护数字世界是我最喜欢的事情, 其次是编程。具有Web应用程序安全性,网络VAPT和源代码审查方面的经验。可 也PHP和Python的/ bash的脚本工作。


最初发布在https://notsoshant.github.io

本文始发于微信公众号(Ots安全):带有SQL注入的不太盲目的RCE

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: