Запрос параметризован, но '[' не дает результатов поиска.VB.NET Framework 4. Сущность к ESQL - PullRequest
2 голосов
/ 16 марта 2012

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

Я проверяю уровень допуска безопасности параметризованного запроса по отношению к SQL-инъекции, потому что слышу слухи, что это не 100%.

===== userinput чистые строки, но со злонамеренным контентом для SQL-инъекции =========

userinput = "Tubo'; UPDATE STOCK_TYPE SET Description='SQL Injection'" & 
            "WHERE STock_Type_ID=1; --'"

userinput = "'Some Name''; GRANT CONTROL TO [Malicious User]; PRINT ''Game over!" &
            "This system is no longer yours!''" & 
            "-- Malicious User now can control the database!!!'"

userinput = "!!!@@@###$$$%%%^^^&&&***((()))///```~~~___---+++===:::;;;"""'''|||
             \\\}}}>>><<<{{{}}}]]]...,,,[[[]]]///"

===== Для поиска названия компании с помощью SQL Injected userinput ==========================

Dim SQL = "select p.Name from EntContext.COMPANIes as p Where p.Name like @CompanyName"

ObjectParamters.Add(New ObjectParameter("@CompanyName", userinput))

Dim databaseObjectQuery As ObjectQuery(Of DbDataRecord) = 
     New ObjectQuery(Of DbDataRecord)(SQL, EntContext)

databaseObjectQuery.Parameters.Add(parameter)

===========================================================================

База данных COMPANIes.name содержит именно эти строки, чтобы помочь моейтестирование.При успешном поиске по пользовательскому вводу я думаю, что мой код сильнее против атаки.

Но когда я выполняю поиск по COMPANIes.name с точной строкой пользовательского ввода, только первый пользовательский результат дает результат.

Я сужаю виновника до '[', он не дает результата для второго и третьего ввода пользователя через LINQPAD

select p.company_id , p.Name
from EntContext.COMPANIes as p
Where  p.Name like '%[%'

Нет результата.Поэтому сделайте это

select p.company_id , p.Name
from EntContext.COMPANIes as p
Where  p.Name like '%/[%' escape '/'

, чтобы получить результат, сопоставленный второму и третьему пользовательскому вводу с совпадением '[' в названии компании.

================ Попытка решить программно в VB.NET ===============

FilterSQL = " AND COMPANies.Name like @CompanyName escape " + Chr(255)
objectParameters.Add(New ObjectParameter("CompanyName", "%" & Chr(255) &
searchResultParam.ParamValue.Value & "%"))


 The simple identifier 'ÿ' must contain basic Latin characters only. 
 To use UNICODE characters, use an escaped identifier. Near line 1, column 320.

=============================================================================

  1. Является ли параметризованный запрос на 100% надежным, даже если пользовательский ввод кодируется так?

    ObjectParamters.Add (New ObjectParameter ("@CompanyName ", userinput))

  2. Правильно ли было мое предположение о втором и третьем входе пользователя при экранировании этого символа '['?

  3. In параметризованозапрос LINQ, как выполнить поиск по этому точному сохраненному значению?

    COMPANIes.Name = "! @ # $% ^ & * () /` ~ _- + = :; "'|}> <{}]., [] / "</p>

1 Ответ

0 голосов
/ 18 марта 2012

Прорыв с этим кодом

FilterSQL = " AND COMPANies.Name like @CompanyName escape '['"
Dim escCrit As String = "%" & ParamValue.Value.Replace("[", "[[") & "%"
objectParameters.Add(New ObjectParameter("CompanyName", escCrit ))

Вот фактический и буквальный идентификатор и имя, хранящиеся в моем столбце COMPANies.Name.

  1. Тубо '; ОБНОВЛЕНИЕ STOCK_TYPE SET Описание = 'SQL-инъекция' ГДЕ STock_Type_ID = 1; - '

  2. «Некоторое имя»; ГРАНТ-КОНТРОЛЬ [Злонамеренному пользователю]; ПЕЧАТЬ '' Игра окончена! Эта система больше не ваша! '' - злонамеренный пользователь теперь может управлять базой данных !!! '

  3. !!! @@@ ### $$$ %%% ^^^ &&& * ((())) /// `` `~~~ _ --- +++ === ::: ;;; "" " '' '||| \}}} >>> <<< {{{}}}]]] ... ,,, [[[]]] /// ??? '' '</p>

  4. @ # $% ^ & * () / `~ _- + = :;" '|.}> <{}], [] / ȸ </p>

=============================================== =============

Введите userinput в текстовое поле и нажмите Search. Результаты теста:

userinput = Tubo'; UPDATE STOCK_TYPE SET Description='SQL Injection' WHERE STock_Type_ID=1; --'

Найден ID компании 1

userinput = 'Some Name''; GRANT CONTROL TO [Malicious User]; PRINT ''Game over! This system is no longer yours!'' -- Malicious User now can control the database!!!' 

Найден код компании 2

userinput = !!!@@@###$$$%%%^^^&&&***((()))///```~~~___---+++===:::;;;"""'''||| 
         \\\}}}>>><<<{{{}}}]]]...,,,[[[]]]/// 

Найден ID 3

userinput = ?!@#$%^&*()/`~_-+=:;"'|}><{}].,[]/ȸ

Найден код компании 5

userinput = [

Найдены идентификаторы компаний: 2, 3 и 5

userinput = []

Найдены идентификаторы компаний 3 и 5

userinput = [[[

Найден код компании 3

Это отвечает на мой третий вопрос. Мне не нужно было фильтровать любые входные данные и не нужно ограничивать только критерии поиска в текстовом поле. Этот режим поддерживает даже специальные символы, что особенно полезно в случае хранения публичных комментариев от ваших пользователей в вашей базе данных. Они могли напечатать что-нибудь в своем текстовом блоке. Я не знаю, почему '[' должно быть определенно кодом для спасения. Я думаю, что это ошибка, команда структуры сущностей забыла убежать '['. Однако они избегают всего, что я до сих пор проверял. Обратите внимание, что символ Dig Латинская строчная буква D Digraph является преднамеренной.

Интересно, что за магия произошла? Я думаю, что SQL отправляется отдельно от параметра. Когда SQL никогда не соответствует параметру, мы никогда не сможем получить SQL-инъекцию. Невозможно, потому что модальность SQL-инъекций зависит от грязного SQL. Но SQL никогда не встречал Injection. Мой тестовый пример диапазона специальных символов подсказывает это.

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

...