探索教务系统中提交表单的密码加密方式

一、写在前面
承接上一篇文章python模拟登录教务系统

之前实现登录时只是知道提交表单时密码是经过加密的,但是并不知道具体的加密方式,所以是采用抓包的方式直接得到加密以后的密码。但是这样通用性就很差,不能直接输入账号密码进行登录。还需要抓包,所以想要尝试一下找到加密的方法。(其实本来只是想试试,结果谁知道这个加密这么明显,这么草率)

二、处理密码的时间
根据经验来看的话,既然是发送表单才能登录,那么这个表单的处理应该是在前端完成的吧。
用burpsuite来抓包,发现确实是在前端就已经处理了密码(意料之中),所以就是我们在点击了登录以后进行的密码处理。

三、找到处理密码的代码的位置并分析
因为是点击了登录以后进行的表单修改和表单提交,那么直接在源代码里搜索onclick(javascript中的鼠标点击事件)应该就能找到些线索

总共找到三个有onclick的语句。

第一处<td rowspan="2"><input type="submit" value="" id="loginBtn" tabindex="4" onclick="beforsubmit()"></td>
第二处<a class="i18n change-captcha "  onclick="change()" style="line-height:30px;margin-top:10px;font-size:13px;font:宋体;" href="javascript:void(0);" name="verifyingCode"></a>
第三处<a href="javascript:void(0);" class="i18n" name="forgetPassword" onclick="forget()"></a>

第二处有个change-captcha,肯定与验证码有关,经后来观察发现是当你看不清验证码点击换一张的时候触发.
第三处的有个forgetPassword,凭借超凡的英语能力,肯定是忘记密码的操作.
所以排除法,我们要的肯定是第一条语句,(其实也写了submit, loginbtn)
我们看到他跳转到执行beforsubmit函数。那我们就去看这个函数。(他的before竟然还拼错了)

也就得到了下面这个好长但是杂乱无章的代码。

function beforsubmit(){
if (window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x70\x77\x64"]["\x76\x61\x6c\x75\x65"] !=""){
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x70\x77\x64"]["\x76\x61\x6c\x75\x65"] = hex_md5(window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x70\x77\x64"]["\x76\x61\x6c\x75\x65"]);}
var vBGOiwPqc1 = new window["\x44\x61\x74\x65"]();
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x74\x69\x6d\x65\x73\x74\x61\x6d\x70"]["\x76\x61\x6c\x75\x65"] = vBGOiwPqc1["\x67\x65\x74\x54\x69\x6d\x65"]();
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x78\x64\x76\x66\x62"]["\x76\x61\x6c\x75\x65"] = encodeURI(window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x78\x64\x76\x66\x62"]["\x76\x61\x6c\x75\x65"]);
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"] = "\u6b66\u5927\u672c\u79d1"+
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"]+"\u7cfb\u7edf";
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"] = encodeURI(window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x66\x6f\x72\x6d\x31"]["\x6a\x77\x62"]["\x76\x61\x6c\x75\x65"]);        }

凭借着一点点js的知识和编码的知识,这个window表示调用js中的全局变量,那么这个\x64啥的肯定是ascii码了,用python稍加处理和整理。
得到下面的代码

function beforsubmit(){            if (window["document"]["form1"]["pwd"]["value"] !=""){                window["document"]["form1"]["pwd"]["value"] = hex_md5(window["document"]["form1"]["pwd"]["value"]);}            var vBGOiwPqc1 = new window["Date"]();            window["document"]["form1"]["timestamp"]["value"] = vBGOiwPqc1["getTime"]();            window["document"]["form1"]["xdvfb"]["value"] = encodeURI(window["document"]["form1"]["xdvfb"]["value"]);            window["document"]["form1"]["jwb"]["value"] = "武大本科"+ window["document"]["form1"]["jwb"]["value"]+"系统";            window["document"]["form1"]["jwb"]["value"] = encodeURI(window["document"]["form1"]["jwb"]["value"]);        }

稍加分析, 就是一个判断条件,如果密码不为空,就把表单中的时间戳怎么样,把密码怎么样,之类的,所以折腾了半天其实密码就是个简单的md5加密

那么我们就只需要在原来的爬虫代码中添加对密码的md5操作就行了
详情可以看下面的博客
python3中的md5操作

当然我也帮你复制过来了。来自大佬 “曾记否?”(侵删)

# 由于MD5模块在python3中被移除
# 在python3中使用hashlib模块进行md5操作import hashlib# 待加密信息
str = 'this is a md5 test.'# 创建md5对象
m = hashlib.md5()# Tips
# 此处必须encode
# 若写法为m.update(str)  报错为: Unicode-objects must be encoded before hashing
# 因为python3里默认的str是unicode
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes
b = str.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()print('MD5加密前为 :' + str)
print('MD5加密后为 :' + str_md5)# 另一种写法:b‘’前缀代表的就是bytes
str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest()
print('MD5加密后为 :' + str_md5)

再懒一点就是直接下面的代码

import hashlib
pwd = '123456'
pwd_md5 = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()

四、代码分享
修改过后的代码还是在原来的那个repo里

https://github.com/blue-vegetable/whu_score_spider

五、写在后面

以上就是本次的全部内容啦,不过不得不说,这个老教务系统的反爬做的比较普通,不过因为不用在老教务系统抢课了,而且新教务系统也比较丝滑,平时也没有人没事去爬一个没啥软用的教务系统,所以没有设太多防吧。
不过最后知道加密方式就是一个md5的时候,内心还是忍不住就这了一下。
后面或许会去了解一下新教务系统的登录,相信有了这次经验,应该会轻车熟路,不过据说新教务系统用的是rsa加密,好家伙,上流。

枯燥的寒假生活(二) 武汉大学老教务系统提交表单时的密码加密方式相关推荐

  1. HTML5 学习总结(二)——HTML5新增属性与表单元素

    一.HTML5新增属性 1.1.contextmenu contextmenu的作用是指定右键菜单. <!DOCTYPE html> <html><head>< ...

  2. 枯燥的寒假生活(一) python爬虫模拟登录whu老教务系统获取期末考试成绩(已失效 , 老教务系统增加了新的反爬, 老教务系统已停用)

    python模拟登录老教务系统(2021.6.24更新) 一.写在前面 之前用爬虫爬取的都是静态网页html中的内容,但是大多数时候需要动态处理网页爬取数据.因为学校出成绩太慢了,每次都自己打开浏览器 ...

  3. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据...

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  4. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  5. Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交

    在Java EE应用编程中Servlet是基础,JSP是建立在Servlet基础之上的,其他Web框架如Struts.WebWork和Spring MVC都是基于Servlet的.本文主要讲述MyEc ...

  6. python-flask(二)集成bootstrap、集成web表单、集成邮件发送

    文章目录 一.flask集成bootstrap 1. 什么是Bootstrap? 2. Flask中如何集成Bootstrap? 3. Flask-Bootstrap实现了什么? 二.Flask中集成 ...

  7. layuiajax提交表单控制层代码_究竟怎么用Restful风格编代码必看这篇。(二)

    点击上方"IT咸鱼",星标公众号每天分享技术栈,开发工具等 简单急记几个小点:RequestMapping注解的使用和里面涉及到的参数用途和写法 @RequestMapping(& ...

  8. Web开发(一)·期末不挂之第三章·HTML基础二(html实现表格和表单)

    HTML基础二 一. 表格✪✪✪ 二.表单 插入表单 输入标签✪✪ 多行文本域 下拉菜单 三.其他 label标签 内联框架 一. 表格✪✪✪ 插入表格: < table>< /ta ...

  9. extjs 提交表单给php,JavaScript_Extjs学习笔记之二 初识Extjs之Form,Extjs中的表单组件是Ext.form.Basic - phpStudy...

    Extjs学习笔记之二 初识Extjs之Form Extjs中的表单组件是Ext.form.BasicForm,不过最简单最常用的是Ext.form.FormPanel控件,它继承自Panel,具有一 ...

  10. HTML(二)列表、表格、表单元素

    一.列表 1. 有序列表(<ol> </ol>) 第一层嵌套内只能包含 <li></li> 列表项标签,列表项标签可以包裹任何标签和文本,属于块级元素. ...

最新文章

  1. TM:宿主-细菌界面的MicroRNA:宿主防御或细菌攻击
  2. iOS---A valid provisioning profile for this executable was not found
  3. Studio右键选项中没有Git?
  4. Cannot assign to 'self' outside of a method in the init family
  5. 在生产中配置和使用AWS EKS
  6. JavaScript学习系列之执行上下文与变量对象篇
  7. Kali学习笔记5:被动信息收集工具集
  8. KETTLE6.0版本体验小结
  9. android Launcher——ui框架
  10. oracle列表分区ADD VALUES或DROP VALUES包含数据变化
  11. 插件开发之360 DroidPlugin源码分析(一)初识
  12. SpringBoot法律知识分享问答论坛 lawbbs.liuyanzhao.com
  13. 博朗x乐高全球限量型趣宝盒首发
  14. xcode 配置wechat_Xcode 真机调试微信支付 提示 mainfest.json配置APPID和订单的appid 不一致...
  15. 高德地图实现仿qq,微信发送位置功能实现逻辑
  16. 沃尔玛积极助农,2月全国范围直采滞销蔬菜近500吨
  17. 智能聊天机器人实现(源码+解析)
  18. Python操作Neo4j图数据库的两种方式
  19. Apollo代码学习(五)—横纵向控制
  20. JS模块化的前世今生

热门文章

  1. Chapter 1 贝叶斯推断的思想
  2. 【工具】我的键盘(机械键盘)快捷键设置
  3. python太极代码_旋转的太极图动画源代码
  4. python身份证号码共18位_Python实现身份证号码解析
  5. 诺瓦面试(一面和二面)总结
  6. 基于Bootstrap模板创建门户网站vue项目01
  7. JAVA合并两个PDF文件
  8. 在团购网上空手赚钱项目,你敢做就敢赚!
  9. 免费且快速搭建个人www服务器的教程
  10. 两个向量叉乘表示什么意思_为什么两个空间向量的向量积的摸等于以这两个 – 手机爱问...