type
status
date
slug
summary
tags
category
icon
password
JsRPC原理学习与实践
涉及工具,教程
实操
执行后如图

打开yakit的靶场

注入如下的链接代码,加到f12代码段中执行即可

按照github的教程,建立通信,设定的组是zzz
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz");

在/list接口可以看见连接情况

execjs接口执行自定义js代码
提交js代码到浏览器执行,通过接口
/execjs运行后f12出现test

远程调用1:无参获取值
运行后f12发现方法注册成功

调用注册的方法
/go ,方法在客户端执行
远程调用2:带参获取值


远程调用3:带多个参获 并且使用post方式 取值

调用如下:

HMAC解密+JsRPC配置

通过搜索俩个关键字找到加密点
signature和Encrypt(

配置jsrpc,在控制台直接调用
Encrypt()发现可以成功,说明它是全局函数,全局函数可以在jsrpc的代码直接调用,非全局的需要提升到全局。
jsrpc自定义函数,采用调用方法2:
在JsRpc中,我们需要通过调用
resolve回调来返回结果。而不能return Encrypt(input)最后调用如下链接即可加密,达到免抠代码的结果

接口注册总结
通过如下python脚本自定义代码添加
以下三种方法注册时均可调用原网页的全局函数
单参数加密如下注册
多参数加密如下注册
原生base64加解密函数
处理当输入需要
&等特殊符号的情况,需要改方法注册代码拿到参数直接解密
var param = atob(param);
注册后即可跟正常传参一样,传参直接传base64后的结果即可


yakit热加载
官方操作文档:
调用方式:
{{yak(funcname|param)}} 函数名|参数|参数|……代码:跟yak runner一样,除了新定义一个函数
signRequest,它接受一个参数result。将输入的result字符串按照竖线"|"分割成两部分(最多分割成两部分),然后对分割后的第一部分进行某种基础处理(base_word函数),接着将处理后的结果和本地地址127.0.0.1以及端口12080一起传递给handleCheck函数,最后返回handleCheck的结果。
配置好后fuzz成功,但是设置俩个fuzz位置需要选择
交叉/同步 ,默认交叉乘积 。选择的字典有511个,交叉乘积就会触发
511*511请求,选择同步会1对1 ,一共511请求