本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
逆向目标目标:某商盟登录
逆向参数:
QueryStringParameters:j_mcmm:faaef3ba8f4dbecdbbf
DOM简介在以前的案列中,我们都是通过直接搜索来定位加密参数的位置的,直接搜索出来的定位通常是比较准确的,但是有个弊端就是搜索的结果可能会非常多,需要人工去过滤,需要一定的经验去判断准确的加密位置,而且对于一些反爬力度较大的站点来说,可能做了很多混淆,根本就搜索不到,那么今天的案列中,我们将介绍另一种方法,即DOM事件断点,需要注意的是,DOM事件断点也是有弊端的,通过这种方法找到的位置通常在加密处理之前,也就是说想要找到准确的加密位置,还需要进一步分析上下文才能确定。
DOM全称DocumentObjectModel,即文档对象模型,是HTML和XML文档的编程接口,定义了访问和操作HTML文档的标准方法。
一个网页其实就是一个HTML文件,经过浏览器的解析,最终呈现在用户面前,一个简单的HTML页面代码如下:
在HTML页面代码中,head、body等标签不是随意排列的,它们有自己的规则。首先,它们是嵌套的,一层套一层,比如html套body,body又套h1,其次,每一层可以同时存在很多标签,比如head和body属于同一层,它们被外面的html套着,这样的结构很像计算机里的文件夹,例如,我的电脑是最外层,里面套着C、D、E、F盘,每个盘里又有很多文件夹,文件夹里又有文件夹,逐个打开后才能看到具体的文件。
为什么要按照这种结构来组织呢?目的其实是方便解析和查询,解析的时候,从外向里循序渐进,好比按照图纸盖房子,先盖围墙,再盖走廊,最后才盖卧室。查询的时候,会遵循一条明确的路线,一层一层地缩小范围,查找效率会非常高。
所以,浏览器在解析HTML文档时,会把每个标签抽象成代码里的对象,按照这种层次分明的结构组织,这就是DOM,HTMLDOM结构如下图所示:
逆向过程本次逆向的目标是某商盟的登录密码,本案例的加密参数为j_mcmm,加密比较简单,直接全局搜索也很容易找到加密的地方,但是本次我们不使用全局搜索,改用DOM事件断点来定位加密位置。
打开开发者工具,点击左上角箭头按钮,再点击登陆按钮,即可定位到该按钮元素的位置,在Elements面板,右边选择EventListeners,即事件监听列表,可以看到一些鼠标点击、鼠标移动、提交、加载等事件:
我们将这些事件展开具体看一下,submit提交事件,定位到div标签,div标签下有一个form表单,form的作用就是为用户输入创建HTML表单,向服务器传输数据,跟进这个submit用到的JS文件,大概率就能够找到加密的地方,这里还有个小技巧,如果事件太多,不太好判断哪个是提交数据的,或者哪个是登录事件的,可以选择性的点击Remove,移除一些事件,再登录,如果登录不能点击,或者Network里没有提交请求,就说明Remove的这个事件刚好就是目标事件。
跟进submit事件用到的JS,会定位到functione()的位置,往下看,就可以找到疑似加密的地方,这里出现了两个j_mcmm,分别是g.j_mcmm和P.j_mcmm,埋下断点进行调试,经过对比可以发现g.j_mcmm是最终需要的值:
在g.j_mcmm=b语句中,b的值就是最终加密后的值,往上找,第和行vare=b;b=F(F(b)+c);,把明文密码赋值给b,c为验证码,经过F这个函数的处理后得到加密值,继续跟进F函数:
可以看到其实就是经过以下函数的处理:
这个函数中,又包含n,e,o,m函数,这里不再每个函数去剥离,直接将这个函数往下所有单个字母的函数copy下来本地调试即可。
完整代码GitHub