在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考
1. 漏洞描述 这个漏洞的成因简单来说可以归纳为如下几点 1. 类似于ECSHOP的的模版代码编译功能,QIBO允许在文章中添加指定格式的模版代码 2. 在显示文章的时候,QIBO会使用: eval("\$rs2[title]=\"$rs2[title]\";");方式对模版动态变量进行赋值 3. 黑客可以通过XSS、CSRF劫持管理员向数据库中注入恶意代码: ${@fwrite(fopen('ali.php', 'w+'), 'test’)} 4. 由于PHP的动态执行特性,eval赋值的时候,在双引号中的代码会被动态执行,从而导致原本的变量赋值变成了代码执行入口 Relevant Link:
攻击向量 1. 黑客需要向{$pre}jfabout数据表注入恶意代码 1) 黑客直接拿到管理员密码,登录了后台 2) CSRF 3) XSS攻击 2. 文章显示的时候,对模版变量进行解析,未对模版内容本身进行有效的过滤、恶意判断 0x1: POC http://localhost/qibo/admin/index.php?lfj=jfadmin&action=addjf POST: title=test&content=${@fwrite(fopen('ali.php', 'w+'), 'test’)}&list=1 或者普通用户访问/do/jf.php,即可在do目录下生成ali.php文件
/do/jf.php <?php require(dirname(__FILE__)."/"."global.php"); $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]); $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list"); while($rs = $db->fetch_array($query)) { $fnameDB[$rs[fid]]=$rs[name]; $query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list"); while($rs2 = $db->fetch_array($query2)) { /* 1. 用于变量赋值的客体用双引号包裹,PHP curl syntax(${${}})可以执行 2. 未对模版内容进行转义处理,存在闭合注入的可能 */ eval("\$rs2[title]=\"$rs2[title]\";"); eval("\$rs2[content]=\"$rs2[content]\";"); $jfDB[$rs[fid]][]=$rs2; } } require(ROOT_PATH."inc/head.php"); require(html("jf")); require(ROOT_PATH."inc/foot.php"); ?> /hack/jfadmin/admin.php //通过这个向量黑客可以向{$pre}jfabout数据表注入恶意代码 .. elseif($action=="addjf"&&$Apower[jfadmin_mod]) { $db->query("INSERT INTO `{$pre}jfabout` ( `fid` , `title` , `content`, `list` ) VALUES ( '$fid', '$title', '$content', '$list' )"); jump("添加成功","index.php?lfj=jfadmin&job=listjf&fid=$fid",1); } ..
/do/jf.php <?php require(dirname(__FILE__)."/"."global.php"); $lfjdb && $lfjdb[money]=get_money($lfjdb[uid]); $query = $db->query("SELECT * FROM {$pre}jfsort ORDER BY list"); while($rs = $db->fetch_array($query)){ $fnameDB[$rs[fid]]=$rs[name]; $query2 = $db->query("SELECT * FROM {$pre}jfabout WHERE fid='$rs[fid]' ORDER BY list"); while($rs2 = $db->fetch_array($query2)){ //eval("\$rs2[title]=\"$rs2[title]\";"); //eval("\$rs2[content]=\"$rs2[content]\";"); $rs2[title] = addslashes($rs2[title]); $rs2[content] = addslashes($rs2[content]); eval("\$rs2[title]='$rs2[title]';"); eval("\$rs2[content]='$rs2[content]';"); $jfDB[$rs[fid]][]=$rs2; } } require(ROOT_PATH."inc/head.php"); require(html("jf")); require(ROOT_PATH."inc/foot.php"); ?> 代码防御的关键点主要如下 1. 将eval赋值语句内的双引号改为单引号,禁止其PHP动态执行特性 2. 在参数外层包裹addslash,防止黑客注入进行闭合
Copyright (c) 2015 LittleHann All rights reserved
|
2022-08-30
2022-08-15
2022-08-17
2022-11-06
2022-08-18
请发表评论