0x00 前言
之前一直有爆破学校学工网系统密码的念头,错过了用户名和密码都是学号的大好时机。
经过一番安全审查后,默认密码更改为身份证后六位,考虑了一下,还是可以爆破的,增加了时间成本。
知识点:
- selenium 使用
- tesserocr 识别图形化验证码
- python 命令行参数 getopt 提取
http://www.runoob.com/python/python-command-line-arguments.html
0x01 分析
之前的思路,抓取登录的请求包然后更改密码参数就可以实现爆破,但这个网站实际上并没有这么简单。
密码传输采取了 RSA 加密,__VIEWSTATE
和 __EVENTVALIDATION
两个参数也是随着每次访问刷新的。服务器采用的 java 架构,猜测可能和验证网页访问有关。
测试了一下,对输入的密码进行 RSA 加密,然后在 burp 里提交,刚开始几次还可以提交,连续几次或隔了一段时间后服务器提示 500 错误。
对于此类 js 处理输入参数,可以将其加密逻辑改为 python 代码同样处理参数,也可以用调用第三方模块运行 js 代码获取结果。
其余两个动态参数的分析还有服务器 500 的错误搞的很心烦,最后改用了 selenium 爆破的方式。
0x02 核心代码
大概思路:访问登录界面 -> 输入用户名密码 -> 提取验证码识别并输入 -> 点击登录判断验证结果
难点大概在于密码的生成,和身份证有关还有验证码的识别。身份证编码可以参考这篇文章:
https://zhuanlan.zhihu.com/p/27056281
后四位的前三位为顺序码,对应该区域同一天出生的婴儿的个数,单数对应男孩,双数对应女孩。以顺序码作为轮询生成密码
调用 tesserocr 识别验证码
0x05 问题记录
5.1 验证码定位
对网页内容进行截图,获取验证码元素在 html 页面的位置,根据这个位置裁剪截图。但是实际运用的时候,截取出的验证码位置大小不对,最后还是只有一点一点调整截取,猜测可能可 html 元素 margin,padding有关
5.2 判断弹框
密码或验证码输入错误会弹窗提示,提示的时候不能对 brower 对象进行操作,否则会报错,使用了网上的代码对弹框进行判断
0x04 to be continue
实际测试的时候发现 tesserocr 识别的准确率还是有点低
- 不打开浏览器窗口,是否还能正确截图
- 多线程优化