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)