z-blog是一款开源的博客系统,它使用PHP语言编写,可以在Linux和Windows系统上运行。然而,更近有人发现了z-blog 1.8版本存在漏洞,这个漏洞可能会导致攻击者获取管理员权限,进而篡改网站内容。下面我们来看看这个漏洞的具体情况。
漏洞分析
1. 漏洞类型
这个漏洞是一种SQL注入漏洞,攻击者可以通过构造恶意的SQL语句来执行任意操作。
2. 漏洞位置
漏洞位于z-blog 1.8版本的/admin/admin_log.php文件中,具体代码如下:
if(isset($_GET['act']) && $_GET['act']=='del') {
$DB->query("DELETE FROM {$db_prefix}blog_log WHERE logid='{$_GET['id']}'");
echo "";
exit();
}
3. 漏洞原因
代码中使用了$_GET['id']变量来拼接SQL语句,但是没有对这个变量进行过滤或者转义,导致攻击者可以在这里注入恶意代码。
漏洞利用
4. 攻击步骤
攻击者可以通过构造如下的URL来利用这个漏洞:
http://www.example.com/admin/admin_log.php?act=del&id=1%20or%201=1--
其中,1%20or%201=1--是注入的恶意代码,它会使SQL语句变成这样:

DELETE FROM blog_log WHERE logid='1' or 1=1--'
这个SQL语句会删除所有的日志记录,因为or 1=1的条件永远成立。
5. 攻击后果
攻击者可以通过这个漏洞删除所有的日志记录,包括管理员的登录记录。如果管理员没有备份这些记录,那么他们就无法追溯网站被攻击的时间和方式,给后续的安全检查和修复带来困难。
漏洞修复
6. 修复方法
修复这个漏洞的方法很简单,只需要对$_GET['id']变量进行过滤或者转义即可。比如,可以使用mysql_real_escape_string()函数来转义这个变量:
$id = mysql_real_escape_string($_GET['id']);
$DB->query("DELETE FROM {$db_prefix}blog_log WHERE logid='$id'");
7. 修复效果
修复后的代码会将注入的恶意代码转义为普通的字符串,从而防止攻击者利用这个漏洞进行SQL注入攻击。
总之,z-blog 1.8版本的漏洞暴露了程序员在编写代码时忽略输入过滤的重要性,因此在开发过程中一定要注意输入过滤和输出转义的问题,以保障网站的安全性。