天天看点

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

        注:以下方法只针对电子科技大学-BBS(清水河畔)

       针对问题:如何用代码实现在论坛上自动登陆/反复发贴/抢楼?

一.  登陆到发贴的流程图

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

二.  对论坛的分析

1.    登陆页http://bbs.uestc.edu.cn/member.php?mod=logging&action=login

    检查HTTP的Response Headers,发现设置了如下cookie字段:

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

    大胆猜测:这个带HTTP-Only属性的cookie是关键cookie.后面也证实了我的想法

2.    输入账号密码登陆

    查看登陆请求,登陆请求成功后的cookie是这样的

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

    那再大胆猜测:这个 v2hW_2132_auth是授权字段,因为auth应该是authorization的缩写,且这个属性又带有HTTP-Only属性.后面也证实了我的想法

    再来查看登陆请求发了些什么数据出去

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

    其中answer是连续几次登陆不了时的图片验证码答案.

    怎么会有个formhash字段呢?网上搜索了下这是用来防止CSRF的.那么这个字段是什么时候填加进登陆请求的呢?

    再去查看登陆页的HTML

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

    原来是在进入登陆时,后台为了防止CSRF,返回的HTML里就有.随着form表单的填交而自动提交.那么我把这个formhash记录下来.

    小结:这一步需要记录 formhash, cookie中v3hW_2132_auth与v3hW_2132_saltkey字段

3.    登陆后发贴

    随便打开一个帖子:

    http://bbs.uestc.edu.cn/forum.php?mod=viewthread&tid=1721267

    先查看 HTML中form表单里是不是也有formhash,果然,也有formhash值. 不过要注意的是 发贴时的formhash与登陆时的formhash不同,

     随便输入些内容,点发表回复,查看HTTP请求.

    HTTP Request Headers中的Cookie与刚才获得的Cookie相同.

    HTTP 提交数据中:

UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析

    posttime是当前时间的UTC格式的秒数.

    usesig以及subject是固定值,暂时不知道用处.

    message是发贴的内容. 这里论坛前端没有做处理,但是传入后台时做了一些XSS的过滤.

    小结:记录下发贴时的formhash,即可发贴

三.  对论坛安全性的分析

    BBS在登录时为了防止CSRF,做了token校验。

    登录后重置token

    在发布信息时过滤危险字段,后台做了XSS防范。嗯,这样无法从前端代码寻找过滤规则的漏洞.

    对关键cookie设置了Http-Only属性。但正是设置了Htpp-Only属性,更容易暴露关键属性。

    在实践中,发现后台没有Session机制,导致任何一次的授权码不存在过期时间。也就是説,账户的登陆状态是靠加密实现的。这无疑会带来很严重的安全问题。

    无Referer验证

四.  论坛如何用最小的代价做出防范:

    同一账号连续发贴超过预设频率,直接禁言一段时间.

    启用Session机制.

五.  代码的改进:

1.因为没有Session机制,对关键参数只请求一次即可,保存在文件中。下次直接读取,可以减少HTTP请求次数。

2.因为涉及到多次异步HTTP请求,每个请求后需要提取相应参数,再发起HTTP请求。无疑会涉及很多个异步行为的顺序执行。通通放入callback里代码会极其的丑陋,可以考虑放入一个队列里,用Promise顺序执行。