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

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

缺陷编号:wooyun-2015-093537

漏洞标题:UWA 2.X v2.1.5 多处sql注入。

相关厂商:asthis.net

漏洞作者: roker

提交时间:2015-01-30 15:28

修复时间:2015-05-01 00:42

公开时间:2015-05-01 00:42

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-30: 细节已通知厂商并且等待厂商处理中
2015-01-31: 厂商已经确认,细节仅向厂商公开
2015-02-03: 细节向第三方安全合作伙伴开放
2015-03-27: 细节向核心白帽子及相关领域专家公开
2015-04-06: 细节向普通白帽子公开
2015-04-16: 细节向实习白帽子公开
2015-05-01: 细节向公众公开

简要描述:

rt。
2.1.5.2521 官网下的最新版

详细说明:

看看这个函数
/core/lib/core/Db.class.php

protected function parse_value($value) {
if(is_string($value)) {
$value = '\'' . $this->escape_string($value) . '\'';
}
elseif(isset($value[0]) && is_string($value[0]) && strtolower($value[0]) == 'exp') {
$value = $this->escape_string($value[1]);
}
elseif(is_array($value)) {
$value = array_map(array($this, 'parse_value'), $value);
}
elseif(is_null($value)) {
$value = 'null';
}
return $value;
}


这是一个数据库操作时 对字段进行处理的函数。 可以看到当字段 为数组 且 第一个值为exp时,
没有了单引号的包裹。(咋和tp有点像。。)
何处调用了呢?
例如

protected function parse_set($data) {
foreach($data as $key => $val) {
$value = $this->parse_value($val);
if(is_scalar($value)) { // filter non-scalar
$set[] = $this->parse_key($key) . '=' . $value;
}
}
return ' SET ' . implode(',', $set);
}


往上跟进,

public function update($data, $options) {
$sql = 'UPDATE '
.$this->parse_table($options['table'])
.$this->parse_set($data)
.$this->parse_where(isset($options['where']) ? $options['where'] : '')
.$this->parse_order(isset($options['order']) ? $options['order'] : '')
.$this->parse_limit(isset($options['limit']) ? $options['limit'] : '')
.$this->parse_lock(isset($options['lock']) ? $options['lock'] : false);
return $this->execute($sql);
}


那么当我们 ->update($data);时 ,满足条件时,就能绕过单引号注入了。
调用这个函数的还有很多,insert之类的。
不一一举例了。
两个注入以证实其可注入.
# 1
/lib/ctrlr/Member/ArchiveCtrlr.class.php
add_archive_do 函数。

public function add_archive_do() {

.........
$data = array();
$data['archive_channel_id'] = intval(ARequest::get('archive_channel_id'));
............
$data['a_title'] = AFilter::text(AFilter::plain_text(ARequest::get('a_title'), 85));
$data['a_keywords'] = AFilter::text(AFilter::plain_text(ARequest::get('a_keywords'), 85));
$data['a_description'] = AFilter::text(ARequest::get('a_description'), 200);
$data['a_cost_points'] = intval(ARequest::get('a_cost_points'));
$data['member_id'] = ASession::get('member_id');
$data['m_username'] = ASession::get('m_username');
$data['a_add_time'] = time();
$data['a_edit_time'] = $data['a_add_time'];
$data['a_add_ip'] = AServer::get_ip();
$data['a_edit_ip'] = $data['a_add_ip'];
$data['a_rank'] = 50;
$_o = M('Option')->get_option(array('core', 'interaction'));
$_aci = M('ArchiveChannel')->where(array('archive_channel_id' => array('EQ', $data['archive_channel_id'])))->find();
......
/* insert to main table */
$result = M('Archive')->add_archive($data);
if(!empty($result['error'])) {
$this->error(L('PUBLISH_FAILED'), Url::U('archive/list_archive?archive_model_id=' . $data['archive_model_id']));
}
/* insert to addon table */
$data['archive_id'] = $result['data'];
$data = array_merge(ARequest::get(), $data);
/* delete external links */
if(isset($data['delete_external_links']) and !empty($data['delete_external_links'])) {
foreach($data['delete_external_links'] as $field) {
if(MAGIC_QUOTES_GPC) {
$data[$field] = stripslashes($data[$field]);
}
$data[$field] = str_replace(__HOST__, '#basehost#', $data[$field]);
$data[$field] = preg_replace("/(<a[ \t\r\n]{1,}href=[\"']{0,}http:\/\/[^\/]([^>]*)>)|(<\/a>)/isU", '', $data[$field]);
$data[$field] = str_replace('#basehost#', __HOST__, $data[$field]);
if(MAGIC_QUOTES_GPC) {
$data[$field] = addslashes($data[$field]);
}
}
}
$result = M('Archive')->add_archive_addon($data);

...........
}


添加文章,抓包

1.png


数据出来了

2.png


#2
edit_archive_do函数。
代码和add_archive_do的差不多
抓包修改出数据。。

3.png


漏洞证明:

3.png


修复方案:

修复

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2015-01-31 00:41

厂商回复:

多谢关注,已确认。

最新状态:

暂无