比學生作品更差劣的網站: IBANSPORT
阿恆
最近有朋友使用 IBANSPORT 網站報名跑步比賽,事後向我猛吐苦水,說過程中一步一碰壁,幾乎每一步都撞到系統錯誤,雖然有錯誤訊息,但卻毫無幫助,令人不知何去何從。
IBANSPORT 是香港一間計時晶片公司,與很多體育團體合辦跑步比賽,很多賽事都必須在他們的網站報名,網站已經運作多年,我好奇之下造訪一下,結果令我大吃一驚。 簡單的說,為了保護大家的個人隱私,儘快把自己的資料刪除,不要再使用這個網站。
這個網站的問題非常多,我把比較嚴重的幾點羅列如下:
1. 使用不安全的通訊協定
相信任何人都不會把姓名、地址、電話、身分證號碼、出生日期等等個人資料在街上隨處張貼吧?IBANSPORT 網站使用不安全的 HTTP 通訊協定,包括收集這些個人資料的頁面,任何稍懂網絡技術的小伙子都懂得如何竊聽 HTTP 通訊,所以 IBANSPORT 等於把大眾的隱私向全世界公開。
IBANSPORT 應該使用業界標準的 HTTPS 加密通訊協定,HTTPS 已經發展超過 20 年,主流的網站伺服器包括 IBANSPORT 使用的 Apache 和 Nginx 等等,都支援 HTTPS。為了鼓勵網站使用 HTTPS,Google 會壓低使用不安全的 HTTP 網站的排名。從 HTTP 轉到 HTTPS 也沒有任何額外的支出。總的來說,IBANSPORT 應該使用 HTTPS,至少在收集和顯示用戶個人資料的頁面使用 HTTPS。
2. SQL 注入攻擊
SQL 注入攻擊 (SQL injection) 是一種老掉牙的攻擊技術,但就是因為有 IBANSPORT 這種貨色的開發人員,才讓這種咸豐年代的技術仍然有用武之地。我隨意選了一個跑步項目,在隊伍資料欄位中輸入了一個包含英文單引號 (') 的名稱,呈送資料後竟然收到類似以下的錯誤訊息:
|
|
我不鼓勵大家破壞 IBANSPORT 的系統,所以不打算告訴你怎樣利用他們編程上的智障低能白痴(下省三百字)來盜取,甚至銷毀數據庫的資料。不過,我心腸好,別人卻很難說,我的忠告是: 你若果有個人資料放了在 IBANSPORT 的系統內,現在立即全部刪除,現在就去做,才回來繼續看這篇文章! 不然的話,明天發現你的姓名、電話、出生日期、身分證號碼等等資料在網絡上傳播,莫要怪我不作警告。
3. 洩漏重要的系統架構訊息
前面第二點引用的錯誤訊息,是完整的數據庫錯誤訊息,對普通用戶來說肯定一頭霧水,但對於 IT 人來說,可說是金礦!它暴露了數據庫的架構 (schema),結合 SQL 注入攻擊,幾乎可以把整個數據庫完全控制。
事情還沒結束,我查看了一下從網站伺服器送來的頭標 (header),發現很多有趣的資料:
|
|
對 IT 人來說,這又是一個金礦!因為這裏告訴我們一些伺服器的重要資料,黑客憑著這些資料可以發動針對性的攻擊,到時除了數據庫失陷外,整個伺服器都會失陷。
舉一個例子,我們可以見到網站使用 PHP 語言編寫,PHP 的版本是 5.4.16,它不是最新的版本,PHP 5.4 分支的最後版本是 5.4.45,這還不夠,5.4 分支其實在 2015 年 9 月已經停止開發,不會再有任何臭蟲或者安全性更新。升級到 PHP 5.5 分支行嗎?很遺憾 5.5 仍是太舊了,它已經在 2016 年 7 月停止開發,所以 IBANSPORT 最少要升級到 PHP 5.6 才安全。其實 PHP 的最新最快最強最安全的分支是 7.1,如果你在 IBANSPORT 工作,或者是他們的朋友,麻煩通知他們一下。
PHP 5.4.16 很不安全嗎?所有 IT 人都知道,系統安全的第一道防線,也是最容易做到的,就是使用最新版本的工具。PHP 5.4.16 這種嘉慶年間的產品,只要到 PHP 的官方網站便知道它有多少安全漏洞,這些資料俯拾即是,試問黑客怎會錯過?
這個金礦還有其他珍貴資料,我懶得一一細數了,算是給大家的練習吧。
4. 沒有加密用戶的密碼
IBANSPORT 把用戶的密碼儲存在數據庫中,如果他們的數據庫被黑客攻陷,這些密碼便會公諸於世。從前面第二和第三點知道,他們的系統比紙糊的更不堪,所以用戶的密碼根本毫無保障。很多用戶都會在不同的網站使用相同的密碼,IBANSPORT 帳號的密碼可能跟他們的 Facebook、Gmail、Yahoo 等帳號的密碼相同,你可以想像黑客得到 IBANSPORT 用戶的密碼有多高興。
正確儲存密碼的方法,是把密碼加密後(嚴格來說是計算密碼的散列值)才放入數據庫,具體的方法我從略了,總之,IBANSPORT 連這麼簡單的系統安全也沒有做好,可見他們毫不重視對用戶的保障。
5. 差劣的用戶體驗
前面所述的都與安全性有關,其實 IBANSPORT 網站的用戶體驗也極差,包括:
- 語焉不詳的錯誤訊息 (
'Sorry, Database error, please try again later'
) - 部份必須填寫的欄位沒有標示