一、为什么会有这次分析
马上要到开学日期了,学校要求所有人去医院🏥做核酸检测,而且要七天内的检测…… 虽然很烦,但是不做也不大行。
更有意思的事儿是当我打开医院的预约系统:

全部号满,猝🤦♂️🤦♂️🤦♂️🤦♂️
二、系统分析
既然这样,为了不半夜抢号,好好研究了一下这个预约系统。
在浏览过程中,我发现只有核酸检测的是可预约未来三天:
但是,其他的科室都是可以预约未来14天。

于是,核酸检测很可能只是临时隐藏掉了其他天数的预约页面,也就是说,如果能将隐藏的页面恢复出来,那么就很有可能可以在预约还没有开放的时候进行预约操作。
三、抓包分析
在以上分析的基础上,开始使用Charles
进行抓包分析。
在手机上配置好代理,电脑上允许手机的链接就可以开始抓包了

不出意外,服务器的返回结果的确是包含未来可预约天数的内容:

进一步的,预约页面的Http请求内容中包含一个字段rq

这个rq
的内容是20200831
,是日期的格式,如果我们想预约9月8日的号,只需要将20200831
修改为20200908
理论上就可以成功到达一个并没有显示的页面。
四、修改测试
这里我们需要给这个地址加一个断点,这样可以在手机访问这个地址时自动截获内容,便于修改

这样,用手机重新访问这个地址,同时在电脑上修改这个日期为20200908


可以看到,返回日期中resourceId
已经显示了九月八日的预约信息。
这样,我们只需要确认挂号就可以成功挂上这一日的核酸检测号。
五、修复建议
这一漏洞的出现主要源于对预约程序没有进行日期的合法校验。
比如可以在后端服务器加上日期的检验,当访问非可预约日期时返回错误。
或者可以在请求数据包内容上加上md5或者其他校验码,这样也可以在一定程度上增加分析难度。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 极客实验室!
评论