在「Large-scale analysis of style injection by relative path overwrite」這邊看到的,記得這個方式不是新方法,不過還是有人會中...
這種攻擊是組合技,基礎是引用 css 或是 js 時使用相對路徑 (像是 static/style.css
這樣的引用法),再加上 https://www.example.com/a.php
這樣的頁面通常也可以吃 https://www.example.com/a.php/
,甚至是後面再加東西... 在某些情境下組不出來,但精心策劃後就有機會在頁面上弄出奇怪的 xss 或是其他攻擊了。而論文內列出了常見的的組合:
然後拿 Alexa 的排名來看,其實還是有些站台可以打:
防禦的方式也不算太難,absolute path 是個還不錯的方式:
One option is to use only absolute URLs, taking away the relative path expansion.
而 base
tag 也是個方式 (不過在 IE 上還是有問題):
Alternatively you can specify a base tag, though Internet Explorer did not appear to implement the tag correctly (i.e., was still vulnerable) at the time of the evaluation.
另外作者也提到了 document type 的方式 (看起來是建議用 html5 的 <!DOCTYPE html>
),然後 IE 另外做些處理避免失效:
One of the best mitigations is to avoid exploitation by declaring a modern document type that causes rendering in standards compliant mode. This defeats the attack in all browsers apart from IE. For IE it is also necessary to prevent the page being loaded in a frame by using X-Frame-Options , using X-Content-Type-Options to disable ‘content type sniffing,’ and X-UA-Compatible to turn off IE’s compatibility view.
不過大型站台本來就因為業務需求,會把 asset domain 切開 (然後透過 CDN 加速),而且會設計系統讓 programmer 很容易使用這樣的架構,反而因此比較不會用到 relative path,中這個攻擊的機會就低多了...