某信中的点击链接实现发送消息的bug

前言

其实写这篇文章已经是该bug修复快两周了,所以有点炒冷饭。不过技术问题还是值得学习的,至少以后说不定哪天你可能会用上的。

发现的现象

如果你点击了这个消息,会发现你的微信自动给发你这条消息的人回复内容(不只是这样,还可以一键闪退,拉起语音通话等等)

解析

其实我们可以发现这个功能就是靠这样一行代码实现的
<a href="weixin://bizmsgmenu?msgmenucontent=text&msgmenuid=1">text</a>

内容功能
weixin://微信内部协议
bizmsgmenu公众号实现点击后用户发送消息到公众号后台实现一问一答的功能
msgmenucontent要发送的内容
msgmenuid菜单内容关联id,和msgmenucontent做关联使用
text用户在前台看到的超链接文字

逆向代码

安卓版(部分)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

class BizMsGMenuUriSpanHandler extends BaseUriSpanHandler {

    @Override

    public int[] a(){

        return new int[]{43}

    }

    ...(没什么用,省略了)

    String msgmenuid = uri0.getQueryParameter("msgmenuid");

    String s1 = "";

    if(msgmenuid == null){

        msgmenuid = ""

    }

    String s2 = msgmenuid.trim();

    String s3 = uri0.getQueryParameter("msgmenucontect");

    com.tencent.mm.plugin.report.service.g0 g00 = com.tencent.mm.plugin.report.service.g0.r;

    Object[] arr_object = new Object[2];

    if (s2 != null){

    s1 = s2

    }

    arr_object[0] = s1;

    arr_object[1] = k30.f;

    g00.c(0x38BA,arr_object)

    if(!n8.J0(s2) %% !n8.J0(s3)){

        HashMan hashMap0 = new HashMap();

可以看到
if(!n8.J0(s2) %% !n8.J0(s3)){
uri0.getQueryParameter("msgmenuid");
uri0.getQueryParameter("msgmenucontect");
里只进行了msgmenuid和msgmenucontect是否为空的判断,并没有其他判断,比如是否在公众号环境下等等,所以只要这条消息发出去就会出发函数功能。
所以msgmenuid没什么太大意义,不为空就可以

附录:J0函数的实际作用

1

2

3

4

public static boolean J0(String s)

{

    return s==null||s.length()<= 0;

}

为什么ios下不会触发呢

iOS代码

1

2

3

4

5

6

v40 = (unsigned int)objc_msgSend(v39,"isBrandContact");

...

if(v40)

{

    ...

}

1

2

3

4

5

6

MMSessionMgr *sessionMgr = [objc_getClass("MMServiceCenter") defaultCenter];

WCContactData *msgContact = [sessionMgr getContect:userName];

if ([msgContact isBrandContact] || [msgContact isSelf]){

    ...

    return ;

}

可以看出来iOS里有额外的公众号环境验证阻止了在普通聊天滥用
而安卓版本缺少关键校验所以出了bug
如果把weixin://bizmsgmenu?msgmenucontent=text&msgmenuid=1这段代码改成其他的还可以实现语音通话拉起等功能。
示例拉起语音通话:<a href="weixin://voip/callagain/?username=ponyma">点我和马化腾打电话</a>

后话

漏洞公布不久TX就启动了应急措施,会把所有a标签的末尾加上空格。例如<a href="weixin://bizmsgmenu?msgmenucontent=text&msgmenuid=1">点我</a>会变成<a href="weixin://bizmsgmenu?msgmenucontent=text&msgmenuid=1">点我</a >加上空格后会导致html语法错误,无法使用

修复方法十分抽象,就是在别人视角里所有的</a> 都会变成</a >(多了一个空格),是的所有的 </a>,单独发一个 </a>也会...

更多推荐