RPO(Relative Path Overwrite)相對路徑覆蓋攻擊

這不是在說資訊安全的RTO、RPO喔!這幾天在搞弱點掃描的時候,發現竟然還有這種攻擊手法(人心啊!),稍微研究一點心得將其寫在這邊,讓有需要的人可以參考。

這個攻擊的手法比較偏向非比較普遍見到的利用客戶端無修改的瀏覽器來進行,而是駭客可以關在家裡慢慢的Hack你的網站。有下列的達成條件前提:

  1. 後端網站伺服器,認為URL裡面的「%2F」是「/」,例如IIS跟Nginx都可以。
  2. 網站存在著XSS的漏洞(如果這條件存在的話,那就不一定要駭客才可以亂搞了)。
  3. 客戶端瀏覽器,可以接受亂搞的指令,例如可以在URL裡面輸入一些指令,或者透過相關工具模擬瀏覽器送出一些一般用戶不可能送出的命令。(這個因子不是你可以決定的)

RPO(Relative Path Overwrite)攻擊手法簡介

其實RPO最後實現的方式是混合攻擊,這邊只有簡單的講解最基本的觀念。

  1. 假設有一個http://example.com/normal/foo.html,裡面有這樣的HTML程式碼。
<link rel="stylesheet" type="text/css" href="../list.css" />
<script src="../list.js"></script>
  1. 然後剛好你的後端網站伺服器很好心,幫你把「%2F」轉換成「/」,所以駭客輸入了下列的URL,竟然也可以正確地得到網頁資料。
http://example.com/normal%2Ffoo.html
-----依然回傳下列資料-----
<link rel="stylesheet" type="text/css" href="../list.css" />
<script src="../list.js"></script>
  1. 然後剛好你的Root層有list.css、list.js這兩個檔案被人家取得控制(例如:被XSS、有漏洞可以被上傳檔案之類的),這下慘了。因為瀏覽器根本看不懂「%2F」,所以他把它當成是一個檔案,往前去提取得結果,相當於瀏覽器跑去這兩個網址執行提取動作。
http://example.com/list.css
http://example.com/list.js
  1. 與Sql Injection雷同,這下換URL路徑被當作填空遊戲了。寫到這邊,有感知的程式設計師就知道慘了,因為有了JS之後,就可以實現任何XSS相關的資訊擷取手法,在此就不再贅述。

簡單結論

不要以為前面說明的東西「很牽強」、「一堆假設」,那只是在跟你說明一點簡單的概念而已,RPO攻擊最重要的重點不是在JS,而是CSS。搭配瀏覽器對於CSS的解釋鬆散,以及CSS的@import url('')、background url('')加載的語法,就算沒有駭入網站的JS寫入權,網站也成為填空的遊樂園了(網路上有些範例竟然是把Google的網站拿來玩,不過現在好像被修復了。話說,你的腦有Google工程師強嗎?)。詳細情況因為敝人才疏學淺沒辦法簡單說明,有興趣的人詳見連結:新型 Web 攻击技术:RPO 攻击初探RPO攻击方式的探究

解決方式

如果你的網站也被弱點掃描給出這個訊息:Possible relative path overwrite,那麼我能給你建議的解法是:

  1. JS、CSS從此不要再用相對路徑了。
  2. 可以的話,iFrame設定成「X-Frame-Options: deny」。
  3. 可以的話,WebServer設定不要解析「%2F」轉換成「/」。

希望這篇文章有節省到你解BUG的時間。

RPO Hack Attack CSS RelativePath ImportUrl BackgroundUrl