漏洞概述
zabbix是一个开源的企业级性能监控解决方案。近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限。
官方网站:
影响程度
攻击成本:低
危害程度:高
是否登陆:不需要
影响范围:2.2.x, 3.0.0-3.0.3。(其他版本未经测试)
漏洞测试
在您的zabbix的地址后面加上如下url:
jsrpc.php?type=9&method=screen.get×tamp=1471403798083&pageFile=history.php&profileIdx=web.item.graph&profileIdx 2=1+or+updatexml(1,md5(0x11),1)+or+1=1)%23&updateProfile=true&period=3600&stime=20160817050632&resourcetype=17
输出结果,如下表示漏洞存在:

补充
以上为仅为漏洞验证测试方式。
攻击者可以通过进一步构造语句进行错误型sql注射,无需获取和破解加密的管理员密码。
有经验的攻击者可以直接通过获取admin的sessionid来根据结构算法构造sid,替换cookie直接以管理员身份登陆。
修复方案
尽快升级到最新版,据说3.0.4版本已经修补。
安全提示
监控系统监控着每个企业的核心资产,一旦被黑客入侵控制,等同帮助黑客进一步渗透企业敞开了大门。
请大家务必重视,并尽快修补此漏洞。
引用来自“alan-”的评论
乌云网还有复活的希望么?引用来自“宏哥”的评论
必死, 手脚不干净, 必杀引用来自“alan-”的评论
乌云网还有复活的希望么?引用来自“宏哥”的评论
必死, 手脚不干净, 必杀引用来自“alan-”的评论
乌云网还有复活的希望么?//保护用户密码的盐
$salt = sha1( uniqid(getmypid().'_'.mt_rand().'_', true) );
//数据库保存的用户密码($pwd_user是用户输入的密码明文)
$pwd_db = sha1($salt.sha1($pwd_user));
//cookie里的盐
//其中$global_salt是配置里定义的全局盐,用来保护用户的盐,一旦修改,所有用户的cookie都将失效.
$cookie_salt = sha1($global_salt.sha1($salt));
//最终生成的cookie内容
$cookie = base64_encode($user_id.'|'.$cookie_salt);
//如果你需要高安全性,还可以使用MCRYPT_BLOWFISH对整个cookie的内容做一次加密.
$cookie = mcrypt_blowfish($cookie, $key);
//设置cookie,这里把过期时间设为604800秒(60*60*24*7,一周)
setcookie('sessid', $cookie, time()+604800, '/', '', false, true);
//解密cookie
$cookie = mdecrypt_blowfish($_COOKIE['sessid'], $key);
//解码分割后拿到里面的$user_id和$cookie_salt
$cookie = explode('|', base64_decode($_COOKIE['sessid']));
list($user_id, $cookie_salt) = $cookie;
$stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES (?, ?)');
$stmt->execute(array($title, $content));
两句代码的事,为什么Zabbix还会犯这样的错误.
用于认证用户身份的cookie被伪造也不应该呀,这个cookie有加密算法比如BlowFish加密和全局盐哈希保护,你拿不到私钥和全局盐这两个定义在配置文件里的值,你怎么伪造这个cookie?
Apache:
#生成文件.htpasswd
htpasswd -cmb /etc/htpasswd/.htpasswd username password
#/path/to/phpmyadmin/.htaccess规则
AuthType Basic
AuthName "Authentication Required"
AuthUserFile "/etc/htpasswd/.htpasswd"
Require valid-user
Nginx:
location ^~ /phpmyadmin/ {
auth_basic "Authorization Required";
auth_basic_user_file /etc/htpasswd/.htpasswd;
}
如果真的要非常安全,那就配置ssh端口转发,
也就是在ssh客户端配置转发本地端口13306到服务器的3306,
这样本地用MySQL客户端连接13306就可以管理远程服务器MySQL数据库,
这种方式不需要MySQL开放远程访问权限,也不需要防火墙开放3306端口,是最安全可视化操作方法.
这里以ssh命令(客户端)为例,示意转发操作:
ssh -L 13306:127.0.0.1:3306 user@ip -N