如果分配给变量的任何动态 Transact-SQL 比为该变量分配的缓冲区大,那么它将被截断。如果攻击者能够通过将意外长度的字符串传递给存储过程来强制执行语句截断,则该攻击者可以操作该结果。例如,以下脚本创建的存储过程容易受到由截断启用的注入攻击。 CREATE PROCEDURE sp_MySetPassword @loginname sysname, @old sysname, @new sysname AS -- Declare variable. -- Note that the buffer here is only 200 characters long. DECLARE @command varchar(200) -- Construct the dynamic Transact-SQL. -- In the following statement, we need a total of 154 characters -- to set the password of 'sa'. -- 26 for UPDATE statement, 16 for WHERE clause, 4 for 'sa', and 2 for -- quotation marks surrounded by QUOTENAME(@loginname): -- 200 – 26 – 16 – 4 – 2 = 154. -- But because @new is declared as a sysname, this variable can only hold -- 128 characters. -- We can overcome this by passing some single quotation marks in @new. SET @command= 'update Users set password=' + QUOTENAME(@new, '''') + ' where username=' + QUOTENAME(@loginname, '''') + ' AND password = ' + QUOTENAME(@old, '''') -- Execute the command. EXEC (@command) GO 通过向 128 个字符的缓冲区传递 154 个字符,攻击者便可以在不知道旧密码的情况下为 sa 设置新密码。 EXEC sp_MySetPassword 'sa', 'dummy', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012''''''''''''''''''''''''''''''''''''''''''''''''''' 因此,应对命令变量使用较大的缓冲区,或直接在 EXECUTE 语句内执行动态 Transact-SQL。使用 QUOTENAME(@variable, '''') 和 REPLACE() 时的截断 如果 QUOTENAME() 和 REPLACE() 返回的字符串超过了分配的空间,该字符串将被自动截断。以下示例中创建的存储过程显示了可能出现的情况。 CREATE PROCEDURE sp_MySetPassword @loginname sysname, @old sysname, @new sysname AS -- Declare variables. DECLARE @login sysname DECLARE @newpassword sysname DECLARE @oldpassword sysname DECLARE @command varchar(2000) -- In the following statements, the data stored in temp variables -- will be truncated because the buffer size of @login, @oldpassword, -- and @newpassword is only 128 characters, but QUOTENAME() can return -- up to 258 characters. SET @login = QUOTENAME(@loginname, '''') SET @oldpassword = QUOTENAME(@old, '''') SET @newpassword = QUOTENAME(@new, '''') -- Construct the dynamic Transact-SQL. -- If @new contains 128 characters, then @newpassword will be '123... n -- where n is the 127th character. -- Because the string returned by QUOTENAME() will be truncated, -- it can be made to look like the following statement: -- UPDATE Users SET password ='1234. . .[127] WHERE username=' -- other stuff here SET @command = 'UPDATE Users set password = ' + @newpassword + ' where username =' + @login + ' AND password = ' + @oldpassword; -- Execute the command. EXEC (@command) GO 因此,以下语句将把所有用户的密码都设置为在前面的代码中传递的值。 EXEC sp_MyProc '--', 'dummy', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678' 使用 REPLACE() 时,可以通过超出分配的缓冲区空间来强迫字符串截断。以下示例中创建的存储过程显示了可能出现的情况。 CREATE PROCEDURE sp_MySetPassword @loginname sysname, @old sysname, @new sysname AS -- Decl
舌头是我们身体中非常重要的一部分。不仅在说话中帮助纠正语句的发音,而且能辨别味道。如果说眼睛是心灵的窗户,那舌头就是身体的卫兵,它阻挡着不利于我们的物品侵入,舌头上的舌苔通常为薄薄的一层。但如果是厚白...
在2018年第三季度,根据亚信安全最新推出的季度报告中指出,勒索软件虽然在数量上有所减少,但是攻击方式更加多元化,防范的难度也更高。另外,针对ATM的攻击在本季度再度活跃,并出现了将恶意软件伪装成...
胡汉三是谁(“胡汉三”,再也不会回来了) 曾经《地道战》《闪闪的红星》《突破乌江》中扮演角色的八一厂老演员刘江今天早晨去世,享年95岁。 刘江1925年生于哈尔滨一个城市贫民家庭,他很早就到社...
手机通话记录怎么查通话记录怎么查到查别人的通话记录网上如何查通话记录网站死链的影响是非常大的,一个网站过多的死链不仅会造成蜘蛛道路不通,还会影响网站形象、整体收录和排名,所以整个网站的死链是必须要杜绝...
这个长假,过出了春节味儿! 这是一个极不寻常的“十一”黄金周 家国无恙 今年国庆过出了春节的味道 这是令世人瞩目的画卷 动起来、忙起来、火起来的中国 呈现...
本文导读目录: 1、黑客帝国有几部,分别什么剧情 2、关于黑客帝国2结尾 3、黑客帝国2讲的什么 4、聊聊怎样评价电影《黑客帝国2》? 5、黑客帝国2:重装上阵电影 黑客帝国有几部,...