2014
Jan
03





Google 是一個很強的搜尋引擎,你可以在 Google 找到很多知識與學問,但是你有被 Google 給駭客過嗎? 沒錯

Google Search 不但好用,而且也很變態的一直在 Hack 別人的系統。

很久的曾經,我接過一個客戶的案子,內容是這樣的,我的客戶正在做一個強力的後台管理系統,其中有會員、最新消息、留言版、商品等等子系統,而客戶希望我使用他們的系統,去製作一個網站,而且還要有文章管理的功能。

這個案子我一聽到,就覺得是客戶是想藉由這個案子,要我幫他們多完成一個文章管理系統,這樣客戶未來就有更多可以直接拿來套版的功能,不管怎麼,我還是接了這個案子。

一個小小網站加上文章管理系統,當然不會難到我,幾天的功夫就做完了,並且我提供了一個測試網站,讓客戶的客戶可以先在測試系統中上傳他的產品內容。

管理介面,大約像下面這個樣子的表格。

標題圖片內容編輯刪除
第一篇 xxxx文章內容??EditDelete
第二篇 xxxx文章內容??EditDelete
第三篇 xxxx文章內容??EditDelete

奇怪的是,就在客戶上完一部分資料後的二週左右,有一天所有的文章突然不見了,當天客戶也打電話問我為什麼他上傳的資料都不見了,在那個剛睡醒的早晨,我也沒辦法說明原因,還被客戶問說是不是網站被人 hack 了...

接著我開始追查 Access Log ,發現的確有刪除文章的記錄,而且是一筆一筆刪除,Log 中還有 Browser User Agent 的資料,上面寫著 「Google Bot」,內容如下。

Access Log
  1. 10.53.xx.x [01/Jan/2008] "GET /admin/delete.php?id=1 HTTP/1.1" 200 > 39 "Google Bot xxxx"
  2. 10.53.xx.x [01/Jan/2008] "GET /admin/delete.php?id=2 HTTP/1.1" 200 > 39 "Google Bot xxxx"
  3. 10.53.xx.x [01/Jan/2008] "GET /admin/delete.php?id=3 HTTP/1.1" 200 > 39 "Google Bot xxxx"
一開始我想說是不是駭客故意偽裝成 Google Spider,企圖讓我忽略這幾條 Access Log,實際測試刪除的功能之後,才發現客戶系統中的檢查「管理員登入」是有問題的,駭客可以跳過登入檢查,直接刪除文章。

當時寫的 PHP 檔案,大約像下面這段 Code.

delete.php 內容
  1. if (!login()) {
  2. header("location: index.php");
  3. }
  4.  
  5. deleteArticle($id);

這段程式有一個很大的問題,就在於 php 在執行 header 這個 function 時,只會印出如下的重導 header ,但在程式並不會中止,而是繼續往下執行 deleteArticle。

HTTP Response
  1. HTTP/1.1 302
  2. location index.php

也就是因為這個原因, Google Spider 每掃一個刪除的連結,就會刪掉一篇文章 @@ ,最後一篇不留的刪光光。


目前回應 Comments(4 comments)

  • Jonathan Goh 2016/12/29

    低级漏洞..

  • IL 2016/12/29

    自己的過失請不要推給駭客,操作資料請一律用POST或其他HTTP Verb

    Reply

    Admin

    單純分享自已的經驗,沒有要推卸責任啦,而要不要用 POST/PUT 等等 HTTP Method ,也跟我們使用的 Framework  有關,不是每個 Framework 都設計得很完善, 很容易在不夠了解該 Framework / Library 的情形下就中招了。

  • unood 2015/06/16

    header("location: index.php");下面加一行exit(); 應該藉能解決這種詭異的現象了吧?

    Reply

    Admin

    沒錯

  • alan 2014/11/11

    看到這篇 !真的是非常感謝,因為我當初也遇到同樣狀況
    但是就沒有人相信,後來我把移除讓他失效,才保住文章 !!!

    Reply

    Admin

    沒有工程師背景的人,應該都很難相信吧!  我記得當初跟客戶講這件事的時候,客戶也是有點不太相信,所以我還實際  demo 如何跳過 login 的 bug,然後點擊刪除連結。
     
    如果你的系統不會有 login 功能 ,那麼有一個比較簡單的解法,就是對每個第一次進來網站的 user 都先設定一個 cookie ,這樣就能擋掉 Google Spider.
     
    $isRealUser = $_COOKIE['isRealUser'];
    if (empty($isRealUser)) {
        setcookie('isRealUser', 1);
        header('location: index.php');
        exit(1);
    }

回應 (Leave a comment)