Обход фильтрации черного списка символов SQL - PullRequest
0 голосов
/ 20 сентября 2019

Я работаю над курсом по кибербезопасности, содержащим вызов на хосте SQL Server 2000.

Я пропустил файл asp, содержащий исходный код для страницы входа в систему, который содержит жестко закодированный запрос, который принимаетимя пользователя и пароль от пользователя и переходит к запросу db ...

sSql = "SELECT * FROM Users where user_name='" & username & "' and user_password='"&password&"'"

Перед тем, как это будет выполнено, пользовательский ввод фильтруется с помощью цикла по приведенному ниже методу удаления..

' " - & % / \ | > 

replace(myString, "&", "")

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

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

ПРИМЕЧАНИЕ: эмулятор Sql Server 2014 Express Edition не 2K.Не могу найти один за 2K

Надеюсь, это имеет смысл!

Вот то, что я пытаюсь передать и чего каждый персонаж пытается достичь ...

Закодированный запрос:

SELECT CONVERT(VARCHAR(60), SUBSTRING(0x22273B2053454C454354202A2066726F6D207573657273205748455245206E616D65203D2061646D696E3B202D2D20, 1, 96))

Переводится в (с завершающим пробелом):

"'; SELECT * from users WHERE name = admin; -- 

Я предполагаю, что общий запрос ниже формируется ПОСЛЕ обработки SUBSTRING: sSql = "SELECT * FROM Users where user_name='""'; SELECT * from users WHERE name = admin; -- & username & "' and user_password='"&password&"'"

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

Мой вопрос, является ли этот подход действительным с точки зрения SQL Server 2000?или мои предположения о том, как сервер получает и обрабатывает запрос, неверны?

1 Ответ

1 голос
/ 26 сентября 2019

Нет - способ его обработки не позволит вам атаковать таким образом.С вашей полезной нагрузкой строка в итоге будет иметь вид:

SELECT * FROM Users where user_name='SELECT CONVERT(VARCHAR(60), SUBSTRING(0x2...0, 1, 96))' and user_password='"&password&"'

Таким образом, SELECT, который вы пытаетесь выполнить, будет заключен в одинарные кавычки и никогда не будет интерпретироваться как код.

Ключ к этомувозможно, у вас есть две инъекции - попробуйте ввести «\» в первую инъекцию, чтобы избежать последней цитаты, а затем используйте обе инъекции для ее использования.

...