JS渗透逆向入门 |4100字深度解析

01

起因和

前言

dfc78e7618b98456e349167744628691.png

        在做爬虫登录和渗透测试挖洞JS逆向的时候,除了一些简单的爬取或者传参,不需要设置太过复杂的参数构造,但是大多数情况下一些网站的用户名或者密码都会在前端进行一次加密,然后传输到后端进行登录,这时候我们可以选择对前端页面登录方式进行逆向分析。

注意:本篇文章主要是讲解在登录时对JS的逆向分析,当然文章中的一些方法,不仅仅是局限与登录调试。

        说到逆向,很多人会想,不会要反编译什么的高级操作吧!事实上,前端的逆向通俗来说就是在浏览器的调试器中,对存在的前端代码(这里的前端代码包括html、js、css)进行分析,通过分析其逻辑获取其中的路由、加密方式、敏感信息泄露等。在前端开发中,前端语言之间的关系类似下面这种情况。

语言比较
Html人类的骨架
JavaScript人类身体各部分之间产生的行为
CSS人类的外形面貌

        可以看出,前端代码的灵活性主要是由JavaScript进行实现的,所以一般来说对前端进行逆向分析,就是对JavaScript进行逆向分析。接着我们需要熟悉以下几个点:

  • 首先我们需要明确前端的加密一定是在JavaScript语言中,所以对前端页面的逆向分析一般是对JavaScript的逆向分析

  • 在浏览器中,提供了两个很好的功能,即:控制台(Console)和调试器(Sources),这两个功能进行在线的Javascript逆向时非常有用,控制台(Console)可以事实运行Javascript的代码,而调试器(Sources)可以快速搜索代码和进行断点调试

  • 在进行登录页面的Javascript逆向分析时,我们一般都是通过分析提交的登录参数或者加解密关键字为切入点,需要确认网站的用户名密码是否加密,如果加密,同一个密码提交后是否改变,以及是否随用户名改变、验证码的变化规律等(需要根据实际情况判断)

02

        关键破局

加密函数定位

6e4c2242fec54b9cd694680aa2a4eb6b.png

  一般我们要想找到加密的函数,有三种方法:

  • 通过页面对使用的方法进行追溯和跟踪

  • 使用关键字进行搜索(推荐)

  • 通过XHR断点进行调试(推荐)

2.1 通过页面对使用的方法进行追溯和跟踪

        当我们对登录页面进行逆向时,我们可以通过页面中的表单提交确认调用的javascript函数,例如下面函数中的loginByPhoneAndPwd

7cefd3550aa5d8f7eb61011e649d300c.png

        接着在javascript代码中搜索该方法的名字,可以发现方法中存在pwd密码关键字并且进行了加密:

9280e751e85926b919100df849e9bdff.png

2.2 使用关键字进行搜索

        如果在登录页面中不好找到表单提交确认调用的函数,可以通过搜索Encryptloginkeypasswdpassword的关键字,来确认使用的加密函数:

ebc958a024337e08a09420e2c0707993.png

        当确认可疑的方法后我们可以通过断点来调试确认该方法是否为登录时加密密码使用的函数:

00d28db76c679caaeca35fb11931860c.png

能看到我们运行后就被拦截,并且传入密码,说明该点十有八九就是密码的加密函数。

2.3 通过XHR断点进行调试

        这里我们需要了解在用户输入数据到后台之前浏览器做了什么?逻辑就是用户输入数据(例如密码)到输入框中,JavaScript会进行检测(当然可能也需要用户点击登录按钮才会检测)是否需要进行一些特殊处理操作,例如:加密、混淆等,最后将处理好的数据通过XHR发送到后端中。可以看到整个流程中,真正需要我们逆向分析的是这个特殊处理操作,那么我们就需要知道这个处理操作的头和尾,头一般就是前面的说的传递参数值,尾就是XHR

  XHR断点进行调试的思想就是头不容易找到,但是尾是可以通过XHR找到的,通过XHR断点反追踪调试到前面的加密方法,接下来就是进行XHR断点调试,首先找到调试器(Sources),选择XHR断点(记得删除所有断点信息):

c264e11a1b8ea48f60dd7bd4402c44c0.png

        然后在登录页面登录抓包,发现密码存在加密,这时我们获取登录请求的路径(这里是/login),将其放到浏览器的调试器(Sources)的XHR断点中(记得burp放包):

ed11655a281e9408216b5832f7e93117.png

        再次尝试登录,发现调试器跳转到了xhr.send中,并且发现调用堆栈出现了一些方法,这些方法就是我们需要回溯翻阅的可能存在加密的方法,我们可以看到这个a参数中有一个data参数存放用户名密码信息,我们就需要对这个a.data参数进行追踪:

b8dd8ffc4677c215ff35279aef13ac8d.png

        尝试回溯,选择send的下个方法ajax,发现ajax中的k就是send中的a,但是没有关于加密的迹象:

c55fdb16e7e24bdcbba9bffbc0b08fd0.png

        接着继续回溯上一个方法模块login,这时候我们就能明显的看到password被加密后的数据,还是没有看到加密函数的尾巴:

f50a51c298320564562ce93544a73aab.png

   接着我们继续回溯,发现密码的加密块就在cs模块中,进行了aes加密:

0fea6f204ba16770f85e3c90e2e2b573.png

这里的分析比较简单的一笔带过,但是实战中还是需要进行详细跟踪的。

03

       破局

解密过程

e1f77568bcd36412e8429eb327337f0b.png

对于已经找到的加密函数,我们可以通过例子方法去运用其加密函数:

  • 通过对加密函数的分析,进行逐步跟踪

  • 通过其他脚本语言调用该JavaScript代码文件

3.1通过对加密函数的分析,进行逐步跟踪

        这里我们选取一个只进行密码加密,没有验证码的例子进行说明,首先我们打开网络查看功能(windows按F12),尝试提交一个用户名密码是as\as的用户信息,然后查看网络功能,网络功能会将我们提交到服务端的信息显示出来(有些网站由于会进行交互刷新,不好查看,我们可以用BP抓包,这里这个网站不进行交互刷新可以直接在网络功能查看payload:

e54c06a08bce7dffc1b4df2f7d44af49.png

as/as加密后的信息是:
as/df211ccdd94a63e0bcb914bf38a016980503b40f46df1665b8a9f96878e9e3079814ffa29cb98375261bfc130c74d4f716f6f23f6ecf2d754f985b2eca6152dcc15c3fe1158b33892e0fe6ae427a249484a49d60

接着我们到调试器去查找password这个变量,在javascript逆向中,变量一般会用:或者=进行赋值,所以我们可以通过搜索password:或者password=查找:

7a62ea74a9bff177d71a5466ae5cd85f.png

可以看到,有两个赋值给password的操作,第一个是空列表,明显不是我们需要的,所以我们进入第二个,查看源代码,进到第二个代码文件中,我们可以发现存在encrypt这种加密的字样函数,初步推断这个是加密函数,这里我们可以尝试打断点进行分析,点击下图中左边的数字即可:

348deede9866bcd3c2c0f2e8f392206a.png

我们进一步分析encryptString函数,进入函数后,看到n=as,说明n就是我们传递的密码,接着打断点,进到第一个pu函数中:

77418ebcba5b7566cee17988bef35bca.png

发现pu函数是一个sha1加密,加密后将其赋值给l

41603460f344d7c8ad441339211133b9.png

接着进一步调试,发现下面两个操作是将l进行切割分别赋值给tu

f3859d33c22ad4a89e4b351b767dec4b.png

接着就是进行hmac哈希加密,并拼接前面得到的qu,返回其值:

d4fca2167f9a8c7edbad0cf2aec0c0a4.png

这时由于没有变量查看返回的值,但是我们可以到控制台处运行加密函数:

883abfceb6de1aabc10f2ef37a4d8329.png

bd8d5e86acb4978d457f88990709fd2b.png

可以看到对应的值与前面加密后的值一样,至此分析结束,我们可以去构造对应的脚本生成密码进行登录。

3.2 通过其他脚本语言调用该JavaScript代码文件

912ea4fcb8515703daf5a3a6847a9f98.png

然后使用node.js运行,在运行过程中,会出现很多报错,通过对应的报错信息进行修补即可,下面这个是没有引入CryptoJS,直接百度,引入即可:

f7ccc63b6788d24f1db878ca54702f7d.png

接着直接执行看是否有报错,没有报错说明环境是没有问题了,通过在jsconsole.log打印加密后的信息。

ef449683e038818e2317a34e0c0cf962.png

最后使用第三方脚本语言pythonexecjs库进行调用即可:

# 引入方法import execjs,requests,os# 读取js文件with open("main.js",errors='ignore') as f:    js_data = f.read()key = "as"# 加载文件js_com = execjs.compile(js_data)# 调用方法print(js_com.call("encryptByAES","as",key))

779991de4f94838295aec32f47ef9721.png

04

        完毕

小结

bdc2879ce56bb6851f63073840fbe4ef.png

  • 了解熟悉javascript的基本语法

  • 当我们需要查看指定变量的变化时,我们可以在右边添加一个对应的变量,查看其变化:

2547545251dcefb3a0747089d749f5e5.png

  • 我们可以通过提交的payload进行分析其参数,也可以通过关键字的搜索,例如搜索Encryptloginkeypasswdpassword这种关键字

  • 需要注意,如果需要在控制台运行类里面的方法,只有在javascript运行的时候才可以在控制台运行

  • 熟悉常用的加密方法,例如:DES3DESRSAmd5

  • 有些网站会用到网上现成的加密函数,例如:Crypto-JS,这是一个非常常用的javascript密码库:crypto-js-develop.zip

        js逆向相对于其他语言的逆向来说,不算太难,因为不需要使用ida这种工具进行反汇编,就一个简单的浏览器即可。例子上登录分析,我们可以看出,js逆向代审更多的是通过提交的payload进行一步一步分析,只要了解js的基本语法,都能看到个大概,然后结合控制台进行运行调试,可以看出,js逆向相对于其他语言的逆向来说,不算太难,因为不需要使用ida这种工具进行反汇编,就一个简单的浏览器即可。

        js逆向的应用场景不单单只是用于爬虫的登录,假设有这么一个场景,有一个登录框,没有验证码或者验证码复用,但是密码被前端加密了,我们可以通过对其进行分析,获得对应的加密算法进行构造,从而进行爆破。在做信息收集时,我们同样可以通过js发现一些蛛丝马迹,因为js是前端,需要与后端进行交互,这时候,很多开发会将大量的接口显示在前端,我们就可以收集这些接口,对网站进行进一步渗透:

7580b20da6dc68689d0954ece8ebdb75.png

        开发前端时也会使用一些公开的js框架,例如:Vue、jQuery、node等,这些框架同样会有漏洞,例如:CVE-2021-21315的NodeJs命令注入等。

生活笔记

    愿我们都能以轻盈的姿态,越过生命中的山丘,通往更加辽阔的明天。

              34f517e3b55127400d84a479a41f5058.png7b1a7985bde83dc70ddb2568358920fa.png

点赞鼓励一下

c320176f4ef0ac056f3563eb4089835a.gif

ac548c2bc94140d0b9df1e57c3bd4d9c.png

点个 「在看」 你最好看

2cd08caa587607488ba467cad652391b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值