JsRpc:提升前端渗透测试效率
Rpc概述
什么是RPC
全称 Remote Procedure Call——远程过程调用。
在网站的控制台新建一个WebScoket客户端链接到服务器通信,调用服务器的接口 服务器会发送信息给客户端
客户端接收到要执行的方法执行完js代码后把获得想要的内容发回给服务器 服务器接收到后再显示出来
在js加密中JsRPC有什么作用?
比如在访问网站时,我们想直接替换参数,查看有无sql注入或者想枚举密码、挖掘逻辑漏洞替换参数。但是发现参数值是加密的。此时,阅读js代码、补环境很费时费力。上手难度较大。
这时候就可以使用JsRPC。
RPC的优点:免去扣取代码和补环境的步骤。。。
基本流程
用户找到加密函数的位置【最重要】
在浏览器的console中输入env.js(包中自带的)
cmd中运行jsrpc程序
工具介绍
下载地址
https://github.com/jxhczhl/JsRpc
目录结构
-- main.go (服务器的主代码) |
介绍
运行服务器程序和js脚本 即可让它们通信,实现调用接口执行js获取想要的值(加解密)
实现原理
原理:在网站的控制台新建一个WebScoket客户端链接到服务器通信,调用服务器的接口 服务器会发送信息给客户端 客户端接收到要执行的方法执行完js代码后把获得想要的内容发回给服务器 服务器接收到后再显示出来
【说明】本方法可以https证书且支持wss
在https的网站想要新建WebSocket连接如果是连接到普通的ws会报安全错误,连接本地(127.0.0.1)不会报错~ 可以用本地和wss 你自己看着玩
- 无https证书者。直接编译main.go 使用本地ip(127.0.0.1)可以在https的网站直接连接ws使用 默认端口12080
- 有https证书者。修改main.go文件 把r.Run()注释掉,把r.RunTls注释取消掉 并且参数设置证书的路径 直接输入名字就是当前路径 默认端口:12443
使用方法
1、打开编译好的文件,开启服务release下载,如下图所示:
api简介:
- /list:查看当前连接的ws服务(get)
- /ws:浏览器注入ws连接的端口(ws|wss)
- /wst:ws测试使用,发啥回啥(ws|wss)
- /go:获取数据的接口(get|post)
- /execjs:传递jscode给浏览器执行(get|post)
说明:接口用?group和name来区分任务,如”ws://127.0.0.1:1280/ws?group={}&name={}”//注入ws的例子 group和name都可以随便起名(必填) http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={} //这是调用的接口 group和name填写上面注入时候的,action是注册的方法名,param是可选的参数 接口参数暂定为这几个,但是param还可以传stringify过的json(字符串) 下面会介绍。
2、注入JS,构建通信环境(/resource/JsEnv.js)
打开JsEnv 复制粘贴到网站控制台(注意:可以在浏览器开启的时候就先注入环境,不然要放开调试断点才能注入)
3、连接通信
// 注入环境后连接通信 |
I 远程调用0
接口传入JS代码让浏览器执行
浏览器已经连接上通信后 调用execjs接口就行
import requests |
II 远程调用:浏览器预先注册JS方法 传递函数名调用
远程调用1:无参获取值
|
访问接口,获得js端的返回值
http://localhost:12080/go?group=zzz&name=hlg&action=hello
远程调用2:带参数值获取
//写一个传入字符串,返回base64值的接口(调用内置函数btoa) |
访问接口,获得JS的返回值。
远程调用3:带多个参获 并且使用post方式 取值
//假设有一个函数 需要传递两个参数 |
访问接口,获得js端的返回值
url = "http://localhost:12080/go" |