yakit热加载常用API学习
codec快捷加解密
(这块要注意codec可以直接用在热加载中,但不能在yakit runner中调用)
在yakit中定义一个热加载函数 enc_hex_aes:
(1)codec中创建对应加密模块,保存命名为enc_hex_aes
(3)热加载代码中定义对应函数,调用:
yakit热加载有一个相较于其他工具很显著的优点:
可以定义codec模块中的样例模版,用来在热加载代码中直接调用
yakit热加载常用的API
定义函数
enc_md5 = func(p) { |
//函数调用这块和其他的Python、java等类似 |
请求数据包req相关用法
req:=`POST /user/traditionlogin HTTP/1.1 |
(1)获取请求方法
req_method = poc.GetHTTPRequestMethod(req) |
(2)获得请求体内容-针对POST类型的表单请求
//获取请求体 |
(3)获取请求体中某个具体参数(适用于json格式)
修改req参数的请求头为JSON格式,如下:
req:=`POST /user/traditionlogin HTTP/1.1 |
(4)获取get请求中的参数体
修改请求包如下:
req:=`GET /traditionlogin?appkey=J7zqYf&appsecret=2ABFny&appversion=2.12.2&certNo=CE827B3602E47F849DC7E7B259F56BCD&certType=03ED54D53C234F988561F19CFAFC2CD2&channel=ZHH5&lPlatform=756F68AD2A17DF1B918FD7840B5B5204&lType=E1B1D6DD80C1624FCE09215AE112C2B5&market=0&requestNo=9D7D2C8FD692F030EDEB24436AE5233867389B26C0BEFBBF21549CD7C3356CFC&sign=jAZR7b&verifiCode=88237E379E6C325DEC3E3483FB44ECBC&zy_requestno=D2025062813225745166 HTTP/1.1 |
可以使用如下方法获取到请求头内容
path = poc.GetHTTPRequestPath(req) |
(5)获取请求头中某个具体参数
//获取User-Agent请求头的值 |
(6)获取所有的请求头
headers = poc.GetHTTPPacketHeaders(req) |
这块输出的是一个map的字典,可以像Python一样直接获取对应字段的值
//获取User-Agent请求头的值 |
(6)获取请求体中某个具体参数(适用于form表单)
方法一:直接获取
post_param = poc.GetHTTPPacketPostParam(req,'verifiCode') |
方法二:间接获取(适用GET和POST类型的form表单)
①获取请求头对应键值对
②获取具体参数值
post_param = poc.GetAllHTTPPacketPostParams(req) |
方法三:直接获取(适用GET和POST类型的form表单)
param1 = poc.GetHTTPPacketQueryParam(req, 'verifiCode') |
(7)修改请求头参数内容
①删除某个请求头
req = poc.DeleteHTTPPacketHeader(req, 'User-Agent') |
②增加请求头
req = poc.AppendHTTPPacketHeader(req, 'aaa', '1111') |
③修改请求头
req = poc.ReplaceHTTPPacketHeader(req, 'aaa', '123456') |
(8)获取请求的URL
url = poc.GetHTTPRequestPathWithoutQuery(req) |
(8)修改请求头参数
①GET请求
//将certNo参数值修改为123456 |
②POST请求-form表单形式
//将certNo参数值修改为123456 |
③POST请求-JSON格式
//获取json请求体 |
body_json.Delete('certNo') //删除json中某个字段 |
响应rsp相关用法
定义响应体如下:
rsp := `HTTP/1.1 200 |
常规用法
body = poc.GetHTTPPacketBody(rsp) // 响应体 |
实战案例
前面介绍了一些主要的API接口,下面结合实战项目来利用yakit热加载实战加解密&前面
某金融项目众测,抓包,发现数据包如下:
通过观察数据包,可以得到如下信息:
- 响应包加密—>需要做解密处理
- 请求包中有参数sign—>需要破解前面
JS逆向
具体逆向过程就不分析了,主要逻辑如下:
(1)响应包解密
打断点可以定位到使用了AES加密,找到对应的key和iv,成功解密:
(2)请求参数sign
通过跟栈,定位到sign参数生成逻辑为:
①获取所有的请求参数
②按照键值中的键进行排序
③对排序后的字符串做MD5
④再对MD5结果进行处理得到sign
热加载代码
响应包解密
可以现在yakit runner
中写对应的代码来做测试
rsp=`HTTP/1.1 200 |
对响应包进行解密为了方便观察返回包的内容,所以,这块可以将解密代码写到如下两个热加载方法中:
- hijackSaveHTTPFlow(不会影响原始的请求和响应,只会在history中展示为明文)
- afterRequest(在响应从服务器返回到yakit过程中做处理,可以在web Fuzzer中显示为明文)
decode_aes_hex = func(data){ |
效果展示:
计算签名
由于yaklang代码只了解部分API的使用方式,计算签名这块的逻辑比较复杂,所以,这块借助flsask+yakit
实现签名计算。
(1)flask代码
function encryptSign(e) { |
使用yakit runner进行测试,成功获得sign值
req = poc.DeleteHTTPPacketQueryParam(req, 'sign') |
(2)yakit热加载代码
这块的代码只需要添加到beforeRequest
魔术函数中就行
// beforeRequest 会在请求到达服务器之前被调用,可以通过该函数对请求做最后一次修改 |
查看效果,当携带有正确的sign时,返回内容如下:
修改custNo参数值/直接删除sign值,这个时候签名就不对了,返回如下:
启用yakit热加载代码后,就算删除了sign的值,借助代码,也可以成功计算签名,正确输出