漏洞源码位于/upload/source/plugin/wechat/wechat.inc.php文件中。在226-246行:
紧张看下代码的逻辑:
第231行:从common_member_wechatmp表查询对应openid的第一条结果,这里openid可以由用户掌握。

$mpmember = C::t('#wechat#common_member_wechatmp')->fetch_by_openid($wxopenid ? $wxopenid : $_GET['wxopenid']);
下面是fetch_by_openid函数。
232行:从common表中取出对应uid的所有结果,array_keys($mpmember)返回的是上一步查询数据的uid值。
$mpmembers = C::t('common_member')->fetch_all(array_keys($mpmember));
234-237行:
取上一步的第一条数据,然后从common_member_archive表里取出对应uid的用户数据,将该用户设置为登录状态。
$memberfirst = array_shift($mpmembers);$member = getuserbyuid($memberfirst['uid'], 1);if($member) { setloginstatus($member, 1296000);
根据上述逻辑,也便是说只要知道用户的openid就能上岸用户的账号。看了下微信接口文档,这个openid是唯一的,并且只有用户授权了之后,"大众年夜众号才可以获取。这里显然得不到openid。
在作者的payload中没有看到openid参数。
实在这个Payload只是上岸了openid为空的第一个用户。openid为空的情形目前创造通过/plugin.php?id=wechat:wechat&ac=wxregister&username={name}这种办法可以使openid为空,但注册的是一个新的账号。
根据作者所说 “如果有用户点了一下绑定微信,但是并没有绑定,会写入common_member_wechatmp”,这里“并没有绑定”的意思便是绑定失落败,openid为空,但作者利用的何种绑定方法说的很模糊。
第二个是越权解除指定uid绑定的微信。同样在webchat.inc.php,判断csrftoken精确后,删除common_member_wechatmp表中对应uid的数据。
根据以上两个洞,可以遍历并且上岸所有openid为空的账户。先登录第一个openid为空的账号->然后解绑->再上岸之后即为第二个openid为空的用户……,脸好的话是可以上岸admin的。
payload
解除指定uid绑定的微信:/plugin.php?id=wechat:wechat&ac=unbindmp&uid={uid}&hash={formhash}
上岸第一个openid为空的账号:/plugin.php?id=wechat:wechat&ac=wxregister
修复在最新版本中作者删除了这段代码。下载最新版即可。
参考
https://gitee.com/ComsenzDiszuz/DiscuzX/issue/IPRUI
本文由白帽汇原创,转载请注明来源:https://nosec.org/home/detail/2256.html
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您供应:网络空间测绘、企业资产网络、企业威胁情报、应急相应做事。