一言以蔽之:只要URL和TOKEN设置的容易被猜到,ToUsername又不验证。攻击者可以轻易操控存在漏洞的公众平台。
原文作者:Create Chen
原文出处:http://technology.cnblogs.com
申请公众平台开发者模式需要填写一个URL和一个Token, 见下图:
如果这个URL和Token被别人猜中了, 并且你不判断消息中的ToUserName属性是否跟你微信号相配, 那么别人的公众帐号申请开发者时填写你的URL和你的Token, 别人的公众帐号就能把你公众帐号的功能盗用了.
URL
你的微信号有时会要求用户绑定一些信息, 一般都是一个HTML5的网页, 这条微信内容其实就是一段HTML. 问题是复制这条消息到其它文本框中, HTML是暴露的, 你的<a href=”XXX”>XXX</a>会暴露出来, 所以别人可以轻而易举的拿到链接地址.
关键是不要让别人根据你的链接猜到你申请开发者时填写的URL, 在我看来, 以下格式的URL都相对不安全的:
http://www.XX.com/微信号/weixin.aspx
http://www.XX.com/微信号/weixin.ashx
http://www.XX.com/微信号/weixin.php
http://www.XX.com/微信号/微信号.aspx
http://www.XX.com/微信号/微信号.ashx
http://www.XX.com/微信号/微信号.php
等等…
Signature
在群里经常听别人说图省事, 直接把echostr返回, 根本没顾忌这样做所带来的后果. 如果别人知道了你的URL, 随便填一个Token, 他就顺利验证成功了.
Token
Token建议使用随机字符串, 以下格式的Token都是相对不安全的:
123
123456
abc
微信号
微信号123
等等...
如果不巧, 上面两点你都没有注意, 别人可能就会得逞. 上午我就测试了一个, 猜了一次就成功了.
ToUserName
有人说你不是知道了我的URL和Token, 我改一下Token你不就没用了么. 关键问题是别人之前用你的URL和Token验证成功了, 微信一旦认为你成功了, 以后还会再次验证这个URL和Token么? 所以微信每条消息返回的ToUserName属性不是没用的, 你的程序应该判断是否跟你的微信号相配.
如果你的URL和Token暴露了, 又没有判断ToUserName, 那么你的益达就真的是别人的益达了.