В эту субботу (08.06.24) вышел новый таск на веб уязвимость.
Ссылка на сайт задания: http://185.255.132.89:8001
Название: Secret Way
Описание: Найди путь к флагу и достань его из секретного документохранилища
На веб странице нас встречает форма поиска:
Переместимся в burp suite и попробуем подставить в запрос символ '
:
А вот и ошибка :)
Предполагаем, что поиск осуществляется по БД SQL.
Попробуем подставить базовую SQL-инъекцию 111' or 1=1 --
:
Получаем тот же ответ. Через пару часов постоянного подбора инъекций было выяснено, что поиск работает не на БД SQL. Очень похожа на SQL-injection - это Xpath-injection. По сути это тот же самый поиск, но уже по XML документу. Пример XML документа:
<?xml version="1.0" encoding="UTF-8"?>
<petstore>
<pet category="cat">
<name>Борис</name>
<year>2021</year>
</pet>
</petstore>
Доступ к документу осуществляется по его пути. Например, для извлечения имени кота надо ввести путь к нему: /petstore/pet/name
Теперь попробуем внедрить базовый пэйлоад для Xpath ' or true() or '
:
Получаем:
Данные переданы для модерации
.
Если же отправим ' or false() or '
, то получим: Ничего не найдено
.
Перед нами Blind Xpath boolean-based injection. То есть сервер нам может ответить либо истину, либо ложь.
Например узнаем число подкаталогов в /root:
из ответа видим, что не 2, пробуем с тремя:
А вот и верный ответ!
Естественно делать это вручную долго, поэтому был написан небольшой скрипт (solve.py). Реализовано 3 функции:
- Нахождение количества подкаталогов в директории:
' or count(/root/*)={count} or '
- Нахождение длины имени подкаталога по n индексу:
' or string-length(name(/root/*[{node_num}]))={length} or '
- Нахождение имени подкаталога путем перебора по алфавиту:
' or substring(name(/root/*[{node_num}]), {i}, 1) = '{c}' or '
, где i - это индекс символа в имени подкаталога, c - это символ в алфавите.
Находим путь к флагу: /root/secrettecret/flag
и сам флаг: letoctf{XML_master_da_Way_XPAth_WaY}
Спасибо за прочтение!