The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

機會教育:從中華民國總統府網站被發現 XSS 漏洞講起

昨晚從黑暗執行緒那邊得知中華民國總統府網站已經淪陷了,看到總統府新聞稿一直在跳 Sorry Sorry 舞蹈,雖然只是網友惡搞,但估計這個 Cross-Site Script (XSS) 弱點可能會遭受駭客利用,騙那些好奇的鄉民點選觀看,也許背地裡會潛藏木馬或病毒在其中,各位千萬要小心啊!

總統府網站新聞稿的頁面使用了非常糟糕的設計法,導致可以讓頁面插入任意標籤(Tag Injection),雖然無法直接插入 <script> 標籤,但是至少可以插入 IFRAME 嵌入任意網頁,而且 IFRAME 只要加上 onload 屬性就等於可以執行 JavaScript 了,危險程度「極高」!

此網站可能引發的潛在危機包括:

我個人認為這已經是一個高危險性的網站了,我的 IE8 雖然有內建防止 XSS 攻擊的保護功能,但我還是將該網站網址加入「網際網路選項」的「限制的網站」,以確保不會遭受攻擊,設定方式如下圖:

「網際網路選項」的「限制的網站」

除此之外,我以 2007 年 OWASP 公佈的 Web 十大弱點, 分析總統府網站還有以下問題存在:

OWASP Top 10 在總統府就包辦 6 項,這真是一場給 Web 開發人員絕佳的機會教育阿!

依我個人的經驗判斷,該總統府網站可能有以下特點:

  • 採用 PHP 程式語言,版本竟然是 4.3.2 版,實在太舊太舊了!
    • 這種古董級的 PHP 漏洞少說也上百個,而且版本號還沒隱藏,這簡直是駭客的春藥。
    • 這也代表該網站已經年久失修了,應該是多年前完成的案子,搞不好連維護廠商都沒了。
    • 從網址列判斷這裡的 PHP 應該是以 CGI 的方式運作,非常吃系統資源,要是被 DoS 一下網站應該就會關了。
  • 採用 AIX 或 Linux 或 FreeBSD 或 Solaris 平台
    • 以 PHP 的版本研判,OS 版本也不會多新才對。
  • 採用 Apache 網站伺服器 ( 版本號已被隱藏,這點值得鼓勵 )
    • 以 PHP 的版本研判,Apache 版本也不會多新才對。
  • 採用 MySQL 資料庫,目前好像只有 MySQL 有 limit 語法,從錯誤訊息就看的出來
    • 以 PHP 的版本研判,MySQL 版本也不會多新才對。

我個人寫 PHP 的經驗約有 9 年,我知道 PHP 很容易上手,開發網站也很快,但就是缺乏工具與架構,雖然目前市面上已經有不少工具與架構可選擇,但舊有的網站還是很多,很難一口氣修正所有的缺點,相對的網站弱點也是非常多,這是個難解的問題,需要時間與金錢才能徹底解決。

最後,我有以下建議:

廣大使用者

  • 不要好奇點選任何來路不明的連結
  • 不要開啟任何來路不明的郵件或附件

所有Web開發人員

  • 要將撰寫安全的程式(Write Secure Code)的技能練到跟呼吸一樣自然,安全的程式永遠比高效能的程式來的重要,千萬不能本末倒置。
  • 多吸收些安全相關的知識,瞭解攻擊方法預防被攻擊一樣重要,一把刀兩面刃,不要做壞事就對了。

PHP 開發人員

  • 以我的個人經驗,修正弱點很容易也很快,難的是「知道弱點在哪裡」!
  • PHP 真的很容易寫出有漏洞的程式,我很難給你們建議,連我自己寫的 PHP 程式都被攻陷過,我個人認為需要「原始碼檢測軟體」才能較快的找到弱點所在,並且一口氣修復所有安全弱點。
  • 近期我們公司應該會提供這類的顧問服務,有需要這類檢測服務的人可以跟我聯絡。

總統府網站相關人員

  • 第一步:先關閉網站
  • 第二步:修正網站「已知」的弱點後再開站  [ 備註: 今天早上總統府網站已經緊急修復該弱點了 ]
  • 第三步:修正網站「未知」的弱點,透過「原始碼檢測軟體」找出所有弱點並一次修復
    • 對知名網站來說,這是最經濟實惠的策略!
    • 我相信總統府的網站一定有防火牆設備,但請不要花大錢再買更高階的防火牆了,程式碼安全更重要。
  • 第四步:找到對的廠商將網站改版
    • 總統府網站應該不複雜,重新製作一遍不用幾個月就完成了。
    • 改版不代表「安全」,先有安全的常識與觀念才會有安全的網站。
    • 建議汰換現有的所有軟硬體,連作業系統也要升級

總統府網站的建置廠商或系統管理者

  • 隱藏所有軟體版本資訊 ( Linux, Apahce, MySQL, PHP, … )
  • 隨時更新作業系統、網站伺服器、資料庫伺服器、PHP 的版本,任何已知的patch都需要定時更新
  • 不要信任所有從 Browser 端傳來的資料,對所有網路輸入的參數進行檢核 ( QueryString, POST Data, Cookies, All HTTP Headers )
  • 對所有輸出到網頁的資料進行 HTML Encode 或 URL Encode
  • 隱藏所有可能會揭露網站技術細節的資訊
  • 將前、後台區分兩個不同的網域(Domain) => 不是 Active Directory 那種網域喔!

這篇文章原本昨天晚上就寫好了,想說等等看今天早上問題會不會修復,不然若文章發出去可能就有一堆人想 try 總統府網站,那我就是罪人了。

還好總統府網站今天一早睡醒就已經修復完畢,雖然目前已經看不到原本的弱點頁面會再跳出訊息,且從弱點被發現到解決的時間雖然不到 12 小時,但漏洞存在的時間確實有很長一段時間,況且還有哪些弱點目前還不知道,不過依照目前的程式寫法來說,弱點一定還會有,所以還是小心一點為妙。