You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
3-1 ~ 3-3 原型練攻擊導讀筆記
Part I :上週主題回顧:
Q1: Sanitizer API 與第三方套件 DOMPurify 相比有什麼特點?
A: Sanitizer API 的特點是「不管你怎麼用怎麼設定,都不會有 XSS 的產生」。這是優點也是缺點,因為它的限制很嚴格,某些合法的標籤(如
<iframe>
)即使設定允許也會被移除,彈性較低。相較之下,DOMPurify 可以自訂允許哪些標籤跟屬性,較為彈性。Q2: 什麼是 Universal XSS (UXSS)?它與一般的 XSS 有什麼不同?
A: Universal XSS 是針對瀏覽器或內建 plugin 的漏洞進行攻擊,而不是針對網站本身。它的特點是即使網站本身沒有任何問題,甚至是純靜態網頁,都可能受到攻擊。UXSS 可以做到「無論在哪個網站都可以執行程式碼」,影響範圍比一般 XSS 更廣。
Q3: CSP bypass 中,base-uri 的設定為什麼重要?
A: 如果沒有設定 base-uri,攻擊者可以透過插入
<base>
標籤改變所有相對路徑的參考位置,進而載入惡意的腳本。因此建議在 CSP 中加入 base-uri 'none' 來阻擋所有的 base 標籤。Q4: Trusted Types 的主要功能是什麼?
A: Trusted Types 的功能不是「確定你的 HTML 沒問題」,而是「強制在有可能出問題的 DOM API 使用 Trusted Types,不能使用字串」。當開發者忘記處理使用者輸入時,瀏覽器會直接拋出錯誤,而不會把未處理過的字串當作 HTML 直接 render。
Q5: 什麼是 Mutation XSS (mXSS)?請解釋其原理。
A: Mutation XSS 是利用瀏覽器對 HTML 的自動修復機制所產生的攻擊。當 HTML 在瀏覽器中被解析時,某些元素的結構會被瀏覽器自動改變(mutation),這種變化可能導致原本看似安全的 HTML 變得不安全。例如
<svg>
中的元素可能會「跳出」到外層。正式的導讀開始囉 🎉
不直接執行 Javascript 的攻擊手法(3-1~3-3)
3-1 原型鏈的攻擊方式
其中
__proto__
是 JavaScript 物件的一個隱藏屬性,用來訪問物件的原型,同時攻擊者可以透過這個屬性來串接原型鏈,進而修改原本不該被修改的物件。如何透過 prototype chain 進行攻擊?
什麼時候會發生?
解析 URL query string 時,如果沒有對 key 做過濾,攻擊者可以透過 key 的值串接原型鏈,進而修改原本不該被修改的物件。
合併/操作物件時,如果沒有對 key 做過濾,攻擊者可以透過 key 的值串接原型鏈,進而修改原本不該被修改的物件。
例如:
__proto__
屬性Object.create(null)
創建沒有原型鏈的物件Object.freeze(obj)
,避免物件被修改Reflect
API 來操作物件,例如Reflect.set(obj, key, value)
Question:為什麼操作 Key 值的時候很容易被原型練攻擊?
例如:
a[b][c]
這樣的 key 值,如果沒有過濾,攻擊者可以透過 key 的值串接原型鏈,進而修改原本不該被修改的物件。章節QA
Question:這個章節的重點是?
3-2 DOM Clobbering
1️⃣
<a>
標籤的name
屬性<a>
標籤有一個name
屬性,可以用來設定錨點。當我們點擊一個連結時,瀏覽器會自動捲動到對應的錨點位置。舉例:
2️⃣
id
屬性在 HTML 中,
id
屬性是唯一的,不能重複。如果我們在全域物件上設定一個id
屬性,就會覆蓋掉原本的id
屬性。在 prototype chain 當中,如果找不到方法或屬性,JavaScript 會往上一層原型鏈找,直到找到為止。因此,如果我們在全域物件上設定一個
id
屬性,就會覆蓋掉原本的id
屬性。進階版:多層級的 DOM Clobbering
透過層級結構,攻擊者能夠覆蓋目標屬性。
3-3 模板注入攻擊 CSTI
防禦 CSTI 攻擊的方法
Q:什麼是樣板引擎攻擊?
樣板是 Server 處理前端程式碼,靜態資料中插入動態資料並輸出
=> 由於可以透過嵌入程式碼來實際執行程式碼,因此可能會有安全性問題
=> 補充:現在的框架基本上比較不會遇到 CSTI
舉例:AngularJS 的 CSTI 攻擊
$event.composedPath()|orderBy:'(z=alert)(1)'
是一個惡意的表達式聚焦(focus)
時,這段程式碼會觸發 alert(1) 彈出一個警告框Angular.js 在早期版本(特别是 1.x 版本)对 Client 提供的表達式處理不夠嚴格。相較於 React 會在輸出前對輸入進行過濾,Angular.js 會直接執行輸入的表達式,則容易達成 CSTI 攻擊。
補充:React 的 CSTI 攻擊
=> 解法:只傳入需要使用到的
屬性(props)
怎麼發現這個小技巧的?
=> CTF 競賽~
=> PICOCTF
Beta Was this translation helpful? Give feedback.
All reactions