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

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

缺陷编号:wooyun-2012-010851

漏洞标题:乌云官方验证码过于简单,可以穷举在线字典猜解用户密码、刷屏等

相关厂商:乌云官方

漏洞作者: seclab_zju

提交时间:2012-08-13 13:46

修复时间:2012-08-18 13:47

公开时间:2012-08-18 13:47

漏洞类型:恶意信息传播

危害等级:中

自评Rank:10

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-08-13: 细节已通知厂商并且等待厂商处理中
2012-08-18: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

乌云现在使用的验证码太过简单了,具体表现在:
1.字符颜色单一,只有纯白和纯黑两个颜色,可以直接通过Grayscale==0 or Grayscale==255对其进行二值化。
2.字符没有经过任何处理,例如放大,加粗,斜体,扭曲,可以直接match到一个特征字符串上,如字符“2”对应的特征串是:
00111100
01100110
11000011
00000011
00000110
00001100
00011000
00110000
01100000
11111111
以这个特征串可以99%正确的识别到这个字符。
3.(存疑)测试中发现如果在极短的时间内加载两个验证码,会出现相同结果。可能是伪随机码生成完全由时间控制。此处不确定。

详细说明:

处于验证码保护状态下的服务将失去保护。其中具有较高价值的是登录页面,可以用密码词典暴力破解。用户名随便google一下就可以搜到很多 “site:wooyun.org gmail.com”,这里也提醒下大家不要随便在网上公布自己的重要邮件。
下面是一个截图,在线猜解密码。顺便表扬一下wooyun,当同一IP短时间发出多次请求时会封禁一小段时间,但是只要自动切换代理就可以轻松绕过(goagent,tor,你们懂的)。这里仅是一个proof of concept,并没有实际攻击任何人的帐号,大家放心。

漏洞证明:

仅使用简单的灰度二值化+特征码识别,正确率可达99%以上:

修复方案:

建议使用更复杂的验证码,最好要带字符扭曲、粘连的。

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2012-08-18 13:47

厂商回复:

漏洞Rank:6 (WooYun评价)

最新状态:

暂无


漏洞评价:

评论

  1. 2012-08-13 13:47 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    马克,占位置。

  2. 2012-08-13 13:48 | 饮恨 ( 实习白帽子 | Rank:38 漏洞数:6 | 既然选择了远方就必须日夜兼程)

    嗯。就算法来说可以用细胞染色法来识别是吗?

  3. 2012-08-13 13:58 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  4. 2012-08-13 13:58 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  5. 2012-08-13 13:58 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  6. 2012-08-13 13:58 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  7. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  8. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  9. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  10. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  11. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  12. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  13. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  14. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  15. 2012-08-13 13:59 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    Test. Proof of concept only.

  16. 2012-08-13 13:59 | xiaokinghk ( 实习白帽子 | Rank:82 漏洞数:16 | 【DBA】)

    @seclab_zju 验证码识别技术。。。。。扭曲厉害的能还原吗?

  17. 2012-08-13 14:00 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    @饮恨 这里还没用到那么复杂的算法。乌云的验证码比较简单。

  18. 2012-08-13 14:03 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    对了顺便借楼打个广告,浙大计算机系统结构与网络安全研究所招收信息安全方向研究生,乌云白帽子可以根据面试情况优先录取。具体要求可以给我的微博发私信。

  19. 2012-08-13 14:15 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    @xiaokinghk 我个人觉得扭曲的理论上是可以还原的,只是看有没有人愿意花时间去研究。比如google的reCaptcha就扭曲的很夸张,也可以破解。现在又出现了通过分析音频来读reCaptcha的趋势,这个可以搜索Stiltwalker。

  20. 2012-08-13 14:33 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    @xsser 换成zone的那套吧

  21. 2012-08-13 14:34 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @seclab_zju 小学毕业的收么。你看我行么。

  22. 2012-08-13 14:36 | 蟋蟀哥哥 ( 普通白帽子 | Rank:363 漏洞数:57 | 巴蜀人士,80后宅男,自学成才,天朝教育失败...)

    这个。。我早知道了。。。。

  23. 2012-08-13 14:39 | Vty ( 普通白帽子 | Rank:199 漏洞数:37 )

    @seclab_zju 家里蹲收吗

  24. 2012-08-13 14:46 | possible ( 普通白帽子 | Rank:373 漏洞数:32 | everything is possible!)

    浙大的大牛呀 一看就是专业人士

  25. 2012-08-13 14:49 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @p.z zone的哪套啊 一样的吧

  26. 2012-08-13 14:49 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    管理可以算作修复方案么?譬如发现刷屏之类的给封号 = =

  27. 2012-08-13 14:53 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @xsser 先切了,再封号。

  28. 2012-08-13 14:53 | j14n ( 普通白帽子 | Rank:114 漏洞数:23 | 我是一只小小小小鸟....)

    程冲以前发过!!!

  29. 2012-08-13 14:54 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    @xsser 还真是一样,就后面花了一点。

  30. 2012-08-13 14:54 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    @xsser 登陆爆破怎么封号。

  31. 2012-08-13 15:20 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @p.z - - || 这个......

  32. 2012-08-13 15:36 | Jannock 认证白帽子 ( 核心白帽子 | Rank:2278 漏洞数:204 | 关注技术与网络安全(招人中,有兴趣请私信...)

    先得知道帐号?这个怎么暴?不过wooyun的验证码确定存在ORC。。。呵呵。。

  33. 2012-08-13 15:37 | 0gucci ( 普通白帽子 | Rank:166 漏洞数:33 | 深度值得深入)

    昨天用一个老外的工具对wooyun一直测试反复测试.一直提示登陆页面存在sql注入 0 0

  34. 2012-08-13 15:55 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    @Jannock 先社工,然后忘记密码地方可以验证。

  35. 2012-08-13 16:09 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    社工是个好办法。用google搜索site:wooyun.org gmail.com,可以看到不少同学在站内留下了email。ws....ox@gmail.comim....ao@gmail.com12....dog@gmail.comsn....lue@gmail.comim....2010@gmail.comgu....cn@gmail.comno....000@gmail.comzh....ter@gmail.comsh....tool@gmail.comwc....87@gmail.comco....day@gmail.comc4....3r@gmail.comnet....iy@gmail.com大家还是需要提高个人安全意识,特别是用于登录的邮箱不要随便暴露。

  36. 2012-08-13 16:11 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    至于报考研究生方面,首先需要通过浙大的研究生入学考试。其他的可以优先录取。

  37. 2012-08-13 16:14 | Jannock 认证白帽子 ( 核心白帽子 | Rank:2278 漏洞数:204 | 关注技术与网络安全(招人中,有兴趣请私信...)

    @seclab_zju 研究生不用学历和考试也可以读?@_@

  38. 2012-08-13 16:18 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @seclab_zju 木有学历要求么,亲。

  39. 2012-08-13 16:27 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    可能我前面没有说清楚。“通过浙大的研究生入学考试”=>获得学校认可的本科学历+考研过线。我这里可以做的仅仅是在第二轮面试刷20%的时候优先考虑。

  40. 2012-08-13 16:35 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    @xsser 乌云越做越有名,现在俨然是国内白帽子集散地了。所以与其授人以柄,不如早点补了的好。︶︿︶

  41. 2012-08-13 16:44 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    这辈子都无缘了喔。

  42. 2012-08-13 17:05 | f1eecy ( 路人 | Rank:21 漏洞数:4 | 图书管理员~)

    这个是不是以前爆过~

  43. 2012-08-13 17:33 | f1eecy ( 路人 | Rank:21 漏洞数:4 | 图书管理员~)

    去实验室的页面看了下,有个页面被挂马了,是蜜罐么。。http://ccnt.zju.edu.cn/CCNTAdmission/

  44. 2012-08-13 18:26 | xiaokinghk ( 实习白帽子 | Rank:82 漏洞数:16 | 【DBA】)

    @zeracker 表示从小到大对学历不感冒 zeracker不要叹气 了

  45. 2012-08-13 18:47 | 害虫 ( 路人 | Rank:23 漏洞数:2 | rank 神马的都是浮云)

    @f1eecy 亮了

  46. 2012-08-13 19:24 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    @seclab_zju 我很好奇网络安全的研究生都研究什么方向的?

  47. 2012-08-13 19:31 | 小一 ( 实习白帽子 | Rank:32 漏洞数:13 )

    我靠,膜拜zju的大神啊

  48. 2012-08-13 20:00 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    @p.z 可以参考计算机安全的顶级会议的议程表 http://www.ieee-security.org/TC/SP2012/program.html,这个会除了密码学之外基本涵盖了研究的热门方向

  49. 2012-08-13 20:01 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    @f1eecy 主页不是我们小组负责的,不过应该不是蜜罐吧。汗!

  50. 2012-08-13 22:39 | Henry:bobo ( 普通白帽子 | Rank:104 漏洞数:22 | 本胖吊!~又高又肥2个奶奶像地雷)

    @0gucci ...乌云 现在是所有大牛的想日的

  51. 2012-08-14 06:31 | 斯文的鸡蛋 ( 普通白帽子 | Rank:173 漏洞数:41 | 我在这头,你在那头~)

    @Henry:bobo 所以那些个混蛋日不下就成天在那D

  52. 2012-08-14 11:34 | seclab_zju ( 实习白帽子 | Rank:78 漏洞数:11 | 白帽子土人一枚)

    @xsser 忘记密码页面(http://www.wooyun.org/user.php?action=findpassword)也需要验证码保护,或者加个时间间隔限制,不然可以无限发垃圾邮件。

  53. 2012-08-18 14:21 | headhuanglan ( 路人 | Rank:21 漏洞数:4 | 非科班出身,网络爱好者~~呵呵)

    <?php class gjPhone{ protected $imgPath;//图片路径 protected $imgSize;//图片大小 protected $hecData;//分离后数组 protected $horData;//横向整理的数据 protected $verData;//纵向整理的数据 function __construct($path){ $this->imgPath = $path; } /** * 颜色分离转换... * * @param unknown_type $path * @return unknown */ public function getHec() { $size = getimagesize($this->imgPath); $res = imagecreatefrompng($this->imgPath); for($i=0; $i < $size[1]; ++$i) { for($j=0; $j < $size[0]; ++$j) { $rgb = imagecolorat($res,$j,$i); $rgbarray = imagecolorsforindex($res, $rgb); if($rgbarray['red'] < 125 || $rgbarray['green']<125 || $rgbarray['blue'] < 125) { $data[$i][$j]=1; }else{ $data[$i][$j]=0; } } } $this->imgSize = $size; $this->hecData = $data; } /** * 颜色分离后的数据横向整理... * * @return unknown */ public function magHorData() { $data = $this->hecData; $size = $this->imgSize; $z = 0; for($i=0; $i<$size[1]; ++$i) { if(in_array('1',$data[$i])){ $z++; for($j=0; $j<$size[0]; ++$j) { if($data[$i][$j] == '1'){ $newdata[$z][$j] = 1; }else{ $newdata[$z][$j] = 0; } } } } return $this->horData = $newdata; } /** * 整理纵向数据... * * @return unknown */ public function magVerData($newdata){ for ($i=0;$i<132;++$i){ for($j=1;$j<13;++$j){ $ndata[$i][$j] = $newdata[$j][$i]; } } $sum = count($ndata); $c = 0; for ($a=0;$a<$sum;$a++){ $value = $ndata[$a]; if(in_array(1,$value)){ $ndatas[$c] = $value; $c++; }elseif(is_array($ndatas)){ $b = $c-1; if(in_array(1,$ndatas[$b])){ $ndatas[$c] = $value; $c++; } } } return $this->verData = $ndatas; } /** * 显示电话号码... * * @return unknown */ public function showPhone($ndatas){ $phone = null; $d = 0; foreach ($ndatas as $key => $val){ if(in_array(1,$val)){ foreach ($val as $k => $v){ $ndArr[$d].=$v; } } if(!in_array(1,$val)){ $d++; } } foreach ($ndArr as $key01 =>$val01){ $phone .= $this->initData($val01); } return $phone; } /** * 分离显示... * * @param unknown_type $dataArr */ function drawWH($dataArr){ if(is_array($dataArr)){ foreach ($dataArr as $key => $val){ foreach ($val as $k => $v){ if($v == 0){ $c .= "<font color='#FFFFFF'>".$v."</font>"; }else{ $c .= $v; } } $c .= "<br/>"; } } echo $c; } /** * 初始数据... * * @param unknown_type $numStr * @return unknown */ public function initData($numStr){ $result = null; $data = array( 0=>'000011111000001111111110011000000011110000000001110000000001110000000001110000000001011000000011011100000111000111111100000001110000', 1=>'011000000000011000000000111111111111111111111111', 2=>'001000000011011000000111110000001101110000011001110000011001110000110001111001100001011111100001000110000001', 3=>'001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100', 4=>'000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100', 5=>'111111000001111111000001110001000001110001000001110001100001110001100001110000110011110000111111000000001100', 6=>'000011111000001111111110011000110011110001100001110001100001110001100001110001100001010001110011010000111111000000001100', 7=>'110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000', 8=>'000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110', 9=>'001111000000011111100001110000110001110000110001110000110001110000110001011000100001011111100111000111111110000001110000', ); foreach ($data as $key => $val){ similar_text($numStr,$val,$pre); if($pre>95){//相似度95%以上 $result = $key; break; } } return $result; } } $imgPath = "code.png"; $gjPhone = new gjPhone($imgPath); //进行颜色分离 $gjPhone->getHec(); //画出横向数据 $horData = $gjPhone->magHorData(); echo "===============横向数据==============<br/><br/><br/>"; $gjPhone->drawWH($horData); // 画出纵向数据 $verData = $gjPhone->magVerData($horData); echo "<br/><br/><br/>===============纵向数据==============< br/><br/><br/>"; $gjPhone->drawWH($verData); // 输出电话 $phone = $gjPhone->showPhone($verData); echo "<br/><br/><br/>===============电话==============<br /><br/><br/>".$phone; ?>

  54. 2012-08-18 15:16 | Vty ( 普通白帽子 | Rank:199 漏洞数:37 )

    @headhuanglan 这是啥

  55. 2012-08-18 15:37 | headhuanglan ( 路人 | Rank:21 漏洞数:4 | 非科班出身,网络爱好者~~呵呵)

    @Vty php的验证码识别啊~~改改$data = array后面的部分应该就能识别wooyun的验证码了

  56. 2012-08-18 16:33 | Vty ( 普通白帽子 | Rank:199 漏洞数:37 )

    @headhuanglan 哦哦,在群里吗?

  57. 2012-08-18 16:52 | 黑洞麒麟 ( 路人 | Rank:7 漏洞数:1 | 在校学生,小菜一个。)

    浙大的都来打广告了

  58. 2012-08-18 18:37 | headhuanglan ( 路人 | Rank:21 漏洞数:4 | 非科班出身,网络爱好者~~呵呵)

    @Vty 神马群啊??

  59. 2012-08-18 20:32 | Vty ( 普通白帽子 | Rank:199 漏洞数:37 )

    @headhuanglan 交流群

  60. 2012-08-18 20:38 | headhuanglan ( 路人 | Rank:21 漏洞数:4 | 非科班出身,网络爱好者~~呵呵)

    @Vty qq的??告一下号码~

  61. 2012-08-18 21:01 | Vty ( 普通白帽子 | Rank:199 漏洞数:37 )

    @headhuanglan 139836831进来发个特殊标记,让我找到你

  62. 2012-08-19 09:29 | Sunny ( 路人 | Rank:0 漏洞数:1 | 本人已参加中国共产党!中国共产党是中国工...)

    @f1eecy 25条挂马……

  63. 2012-09-17 16:27 | return ( 路人 | Rank:3 漏洞数:3 | 伪技术爱好者。)

    @headhuanglan 我还奇怪这事跟我啥关系。。。原来我叫 return。。。躺枪

  64. 2012-09-19 01:06 | headhuanglan ( 路人 | Rank:21 漏洞数:4 | 非科班出身,网络爱好者~~呵呵)

    @return 我去~~看到了 哈哈

  65. 2012-11-10 21:02 | 小雨 ( 普通白帽子 | Rank:105 漏洞数:19 | phper)

    哈哈,return来了,param 为啥没过来。。。

  66. 2013-05-30 13:28 | M4sk ( 普通白帽子 | Rank:1199 漏洞数:319 | 国内信息安全任重而道远,还需要厂商和白帽...)

    lz大牛啊.......

  67. 2013-06-12 19:23 | 基佬库克 ( 实习白帽子 | Rank:75 漏洞数:15 | 简介什么的是直接爆菊吧..)

    这种验证码,模板就解决,连复杂的算法都不需要..