用 CSP 可以做到一些簡單的保護機制,但在設計不良的情況下還是有辦法繞過。
這次是上傳合法的 JPEG 檔案,但當作 javascript 檔案繞過去:「Bypassing CSP using polyglot JPEGs」。
開頭的「FF D8 FF E0
」可以在「List of file signatures」這邊看到是「JPEG raw or in the JFIF or Exif file format」,而這四個字元在 javascript 不會出問題。接下來的「2F 2A
」表示 JPEG header 長度,剛好就是「/*
」,把後面的東西給包起來,後面再用類似的方式一直組合就打穿了...
這種攻擊要跳過的是「用 CSP 的 self
限制不能引用外部網站 javascript」的限制,但還是有些前提:
- 允許使用者傳到同一個 domain 上面。
- 網站上有 XSS 漏洞。
其中第一個問題常見的解法是另外開一個 domain 來放使用者上傳的檔案 (最好是連 top domain 都不一樣,完全隔開),才可以透過 CSP 降低風險...
I don't understand why they are not try to add HTTP header (e.g. "user-content: unsafe, no-script") to avoid security issue on same domain.
I guess, It won't save the world, but do improve.