來自船山院士網(wǎng)絡(luò)安全團隊核心成員SRC大佬:月 的原創(chuàng)。 滲透測試中當(dāng)頁面功能點過少無處可測,或者攻防、SRC 場景下開局一個登錄框嘗試弱口令、爆破、注入無果后針對JS 接口尋找未授權(quán)信息泄露成為了得分關(guān)鍵。 前端Webpack接口Vue 框架并且使用Webpack 打包更容易產(chǎn)生未授權(quán),不是框架本身未授權(quán)而是開發(fā)者大多使用前后端分離,接口較多更容易出現(xiàn)不鑒權(quán)情況。
反編譯js.map Vue 使用webpack (靜態(tài)資源打包器)的時候,如果未進(jìn)行正確配置,會產(chǎn)生一個app.js.map 文件,而這個js.map 可以通過Node.js 環(huán)境安裝reverse-sourcemap 工具來反編譯還原Vue 源代碼。
Webpack源碼泄露反編譯教程 reverse-sourcemap -o aaa -v app.9fbea7c7.js.map
還原源代碼JS 文件中,直接找關(guān)鍵的api 目錄、config 目錄從中提取出新的接口進(jìn)行拼接測試未授權(quán)漏洞。 Python腳本提取JS接口 import re
# 讀取文件內(nèi)容 file_path = '1.js' with open(file_path, 'r', encoding='utf-8') as file: js_code = file.read()
# 使用正則表達(dá)式提取路徑 # 匹配 GET 或 POST 請求的路徑,支持單引號或雙引號 pattern = r'''(D\.post|D\.get)\(['']([^'']+)['']''' matches = re.findall(pattern, js_code)
# 打印匹配到的路徑 if matches: print('Matched paths:') formatch in matches: method, path = match print(f'{method.upper()}: {path}') else: print('No paths matched.')
Packer-Fuzzer 尋找新接口API
Webpack 打包站點手工審計JS 尋找接口往往慢人一步,生成的JS 文件數(shù)量異常之多并且總JS 代碼量異常龐大(多達(dá)上萬行),這給我們的手工測試帶來了極大的不便,利用此工具可以很好解決此問題。
Packer-FuzzerGithub地址 工具會對Webpack 打包站點自動API 模糊匹配與漏洞檢測,掃描所有JS 文件存在的接口并拼接訪問測試未授權(quán)等漏洞。 結(jié)束后會生成報告文件參考。 // -t adv 代表使用高級版進(jìn)行掃描
python3 PackerFuzzer.py -t adv -u http://baidu.com
根據(jù)報告審查是否有未授權(quán)接口或其他漏洞產(chǎn)生。 JS接口構(gòu)造插件工具熊貓頭熊貓頭插件針對前端顯示到的接口或者其他銘感信息進(jìn)行捕獲顯示,復(fù)制粘貼到BP 爆破器GET POST 兩種請求方式都測試,接口未鑒權(quán)就可以發(fā)現(xiàn)一些信息泄露以及未授權(quán)漏洞,包括內(nèi)網(wǎng)的IP等。 但是插件顯示是不完整的,針對熊貓頭提取出的接口可以手工篩選一遍,例如:findsomething 顯示接口。 第一個接口應(yīng)該將冒號去掉添加個數(shù)據(jù),第二個接口也應(yīng)該加入?yún)?shù),一般也都是這樣處理將 ,雜亂參數(shù)去除需要值的參數(shù)就賦值。 /user/getInfo/:uid -----> 修改 /user/getInfo/uid
/user/getInfo?uid -----> 修改 /user/getInfo?uid=xxxx
URLFinderURLFinder工具地址 相比熊貓頭插件提取更加全面,會深入頁面JS 文件做二層深度掃描不會局限當(dāng)前頁面JS 文件,會對JS 文件中引入的JS 文件做三次的掃描接口拼接,尋找未授權(quán)接口或未授權(quán)功能點。 baidu.com
app.js confif.js url.js app.xxx.js config.xxxxxx.js url.xxxxxx.js app.sdqew2324.js config.jkjk767.js url.vcbvcj213.js api/user/info /api/getSharingJson /api/custommap/
baidu.com/api/user/info baidu.com/api/getSharingJson baidu.com/api/custommap/
如遇到站點銘感無法利用使用掃描器, 利用-t 參數(shù)減少線程或者利用二開URLFinder 規(guī)避。 https://github.com/N-Next/URLFinder-x //掃描域名并指定輸出200狀態(tài)和403狀態(tài)碼接口 -m 安全深入抓取
URLFinder.exe -u https://baidu.com/ -s 200,403 -m 3
// 線程20
URLFinder.exe -u https://baidu.com/ -s 200,403 -m 3 -t 20
經(jīng)典開局登錄框并且插件也沒有探測出有效接口,可以利用工具深度掃描頁面JS 文件。 通過二層探測JS 拼接接口size 大小判斷是否有新的數(shù)據(jù)產(chǎn)生,如果size 大小跟未登錄狀態(tài)一致那肯定是頁面沒有變化也不需要額外去看, size 數(shù)字非常大那么響應(yīng)出的內(nèi)容更豐富。 使用URLFinder 可以很好的發(fā)現(xiàn)隱藏的未授權(quán)頁面,那么進(jìn)入功能點了就可以到處點點點,測試是否可以未授權(quán)增刪改查。 SRC 信息泄露
開局登錄框,功能點無法利用URLFinder 深入抓取JS拼接,找到一處下載接口,訪問下載xls 泄露網(wǎng)站部門人員工號+姓名,簡單快速尋找未授權(quán)漏洞。 https://xxxxx/index.php/c/core_user_export/json?__request_data=
文件上傳接口XSS 同樣開局登錄框,熊貓頭短暫測試沒有效果使用此工具二次對JS深度抓取接口拼接。 探測到隱藏文件上傳功能點,成功利用收獲文件上傳XSS。 Fuzz 功能接口
構(gòu)造功能如果網(wǎng)站功能點只能允許查看 info 那么在查詢接口功能抓包構(gòu)造其他參數(shù), 因為常見業(yè)務(wù)接口格式如果js 文件中只有查詢的接口,那么自己可以嘗試一下構(gòu)造添加、修改和刪除接口多觀察接口,推測其功能,然后根據(jù)功能去FUZZ ,畢竟你要實現(xiàn)一個web 功能,基本都要有對應(yīng)的增刪改查接口。 api/info?id=1// 正常查詢接口
api/ delete ?id=1// 構(gòu)造刪除接口
/api/v1/api-docs
// 嘗試替換數(shù)字
/api/ v2 /api-docs /api/ v3 /api-docs
-----------------------------------------------------
查詢(獲取信息) search list select query get find
刪除(刪除某個數(shù)據(jù)) del Delete remove
編輯(更新某個信息) Update Up edit Change
添加(增加某個信息) add create new
// 查詢接口
GET /api/模塊名/list
/api/模塊名/all
注意 增刪改在實際Fuzz中盡可能不攜帶參數(shù)測試,這些操作涉及到業(yè)務(wù),萬一誤打誤撞影響到了真實用戶就脫離了測試安全的意義了,攜帶參數(shù)也是利用小號的值。 // 添加 POST /api/模塊名/add
// 刪除接口
DELETE /api/模塊名/id
GET /api/模塊名/del?id=
POST /api/模塊名/
// 修改接口
POST /api/模塊名/modify
POST /api/模塊名/
接口信息泄露除了構(gòu)造增刪改查外,泄露點更多是在查詢處,查詢處沒有做好鑒權(quán)及易導(dǎo)致查詢不當(dāng)全站信息泄露,針對查詢功能只要是查詢的地方記住刪除全部參數(shù)以及置空參數(shù)或者輸入% 。 GET /api/demo/query=xxxxxx
GET /api/demo/ or querylist orlist# 刪除查詢參數(shù)構(gòu)造list列表
GET /api/demo/query= # 置空
GET /api/demo/query=%/* # 模糊查詢
假設(shè)一個接口是,如下,正??隙ㄊ腔仫@自己的,我們可以自行構(gòu)造多余的功能,按照語義輸出列表,并且前置的信息需要刪除 small )翻譯也是微小意思推斷一下就是只輸出小部分的,那么可以嘗試這個參數(shù)刪除發(fā)包測試, /prod-api/system/info/small/userId ------> 個人信息
/prod-api/system/info/small/userId/list ------> 報錯
/prod-api/system/info/userId/list ------> 全站用戶信息
無權(quán)限URL混淆添加資源后綴繞過微信文章學(xué)習(xí)到的思路功能點Fuzz出來后但是無權(quán)限利用此方法進(jìn)行繞過。SRC挖掘-URL混淆的利用 https://mp.weixin.qq.com/s/PoXSeckX0iwBSkIr02zYoQ URL混淆漏洞是指服務(wù)器和解析URL時,由于不同組件或系統(tǒng)的解析規(guī)則不一致,可以利用這種不一致來繞過安全控制或獲取敏感信息,對路徑進(jìn)行編碼添加后綴的方式從而進(jìn)行繞過。 正常接口無權(quán)限。 對最后的接口后面添加混淆,利用字典去Fuzz 添加.json繞過,測試鑒權(quán)相關(guān)的漏洞時,可以嘗試url混淆,接口多個位置fuzz 資源文件。 /api/user ----> 未授權(quán)403 /api/user.json/css/png --- 200 ok
白名單../繞過權(quán)限接口社區(qū)師傅文章關(guān)于繞權(quán)限 基于未授權(quán)的滲透測試技巧總結(jié) 接口未授權(quán)測試,提示了未授權(quán)的狀態(tài)嘗試添加../ 使得權(quán)限過濾?認(rèn)為我們當(dāng)前訪問的接?為白名單接口前置的接口,需要是正常的白名單接口比如/login ,因為登錄不需要權(quán)限校驗,前面用正常的白名單后面接入未授權(quán)的接口。 /login/ ----> 200 ok /system/user -----> 403 未授權(quán) /system/**logn**/../user ------> 添加白名單接口未授權(quán)成功
利用分隔符 ; 讓后端以為文明訪問的接口不是業(yè)務(wù)接口,和上面添加 .json 差不多一致切割分隔符繞過。 有些像之前學(xué)習(xí)的shiro 權(quán)限繞過 但shiro 是 ../; Fuzz 接口參數(shù)
無論是熊貓頭還是其他工具得到的接口Path 其實是不完整的,直接拼接的話缺少參數(shù)是無法訪問接口會報錯,需要構(gòu)造參數(shù), 如果響應(yīng)包直接提示缺少哪些參數(shù)對攻擊者是很友好的,請求包構(gòu)造發(fā)包就可以測試。 /api/demo/test HTTP2 --------> '缺少deviceId'
提示缺少參數(shù)我們拼接
/api/demo/test? deviceId =xxx HTTP2 ------> {最好情況直接顯示數(shù)據(jù)}
但更多的情況下是直接提示缺少參數(shù)也不說什么參數(shù),那么需要可以JS 源碼里面找一下它的調(diào)用代碼,找到請求中用到的參數(shù)進(jìn)行構(gòu)造, 先是找接口找到,沒有辦法Fuzz 參數(shù)是最后的底牌。 BP搜索參數(shù)BURP 作為挖洞小伙伴善加利用功能點可以事倍功半,站點功能會自動記錄加載過的所有JS 文件,我們只需要做的是進(jìn)入網(wǎng)站后點擊一切能點擊處讓BP 加載更多,避免緩存影響瀏覽器需要關(guān)閉緩存,這樣可以保證JS 文件被BP 加載。
加載頁面JS 后點擊站點地圖的過濾,輸入框輸入提示缺少參數(shù)的Path 左側(cè)目錄,就會過濾出不存在此接口的文件,保留存在此接口的文件。 /api/
再從下面搜索框搜索對應(yīng)缺少參數(shù)的的Path 找到它的調(diào)用位置。 找到接口了,但是不懂參數(shù)如何構(gòu)造可以提交給AI 給予明確的指示就會構(gòu)造好示例的請求反饋給我們。 我從js里面找到了這個請求 請幫我構(gòu)造好原本的請求參數(shù)是如何放置的,構(gòu)造好請求參數(shù)值反饋給我
$.getJSON('/getLineLocalPromotion/demo/',{
lineIdstr:a,sid:b,rand:(new Date()).getTime() },
/getLineLocalPromotion/demo?lineIdstr=123&sid=456&rand=1642678901234
BP 站點地圖尋找參數(shù)的方法和瀏覽器全局搜索大差不差,但瀏覽器查找如果相似的接口匹配行數(shù)過多,不利于查找,BP 會首先進(jìn)行一次過濾減少了范圍,那個容易達(dá)到目的使用哪個方式。
字典Fuzz參數(shù)缺少參數(shù)響應(yīng)包更多的情況是模糊提示, 只會提示缺少參數(shù),也不會說是什么參數(shù),我們首先是可以按照上面的手法全局找接口,看看構(gòu)造的是什么參數(shù),找不到接口構(gòu)造參數(shù)那么可以上字典Fuzz 參數(shù)。 /api/demo/getuserinfo------> Missing parameter // 無提示
/api/demo/getuserinfo? {fuzz} =
后端無提示,那么根據(jù)請求的語義,我們雖然不知道參數(shù)的具體值,但是能很大程度上縮小范圍的,請求是獲取用戶的信息,那么代表傳入的參數(shù)是用戶參數(shù),搜集常見的用戶參數(shù)作為字典,根據(jù)接口需要實現(xiàn)什么功能,在這個思路基礎(chǔ)上推斷出參數(shù)。 id userid user_id uid userId google_nid
文件上傳參數(shù)名肯定是file files filesname, 查詢接口參數(shù)肯定也會是query q ,根據(jù)接口語義推斷。 如果想不出合理的參數(shù)名畢竟我們不是開發(fā)出身,日常沒有足夠接口參數(shù)積累,可以以一個開發(fā)者的視角詢問ai 通過此接口可以傳遞哪些參數(shù),有些情況參數(shù)存在多個,這個需要依照功能點來進(jìn)行填充,顯示功能點的可能需要pageSize pageNum 上傳功能點需要時間戳、文件名等等,思路也是找不到就Fuzz /api/demo/upload?{ file/files/filesname }=
/api/demo/query?{ q/name/id }=
接口語義參數(shù)拼接原理是Web 開發(fā)的思路和習(xí)慣,尤其是大部分MVC 框架,我們對功能點操作實際上是對后端進(jìn)行增刪改查,MVC 存在映射關(guān)系,根據(jù)面向?qū)ο笏枷耄瑸榱颂峁┐a的復(fù)用性, 增刪改查雖然不同功能但實際上操作的還是一個類中的參數(shù),類中的屬性肯定是高度類似,很多情況是還是完全相等。
在一個接口缺少參數(shù),響應(yīng)不出數(shù)據(jù),可以回過頭找到其他**'輸出'**功能點顯示的參數(shù) 拼接到請求包。 假設(shè)需要構(gòu)造接口語義是edit 編輯,那么肯定需要的是編輯的信息,ID 、名稱這些參數(shù)信息,根據(jù)這一點可以找**'輸出'** info 信息的功能點。 /api/demo/edit/ -----------> 缺少參數(shù)
/api/demo/edit
找到輸出info 功能點 ,把數(shù)據(jù)體復(fù)制到edit 編輯請求使用修改,GET POST JSON 均提交。 存在用戶ID 編號的參數(shù)值最好有兩個賬戶進(jìn)行測試,是否可以達(dá)到越權(quán)或未授權(quán)目的!結(jié)合此方法在上文Fuzz 功能接口的地方,找到隱藏功能二次根據(jù)語義判斷隱藏參數(shù)做拼接測試。 Fuzz 功能點和Fuzz 參數(shù)原理都是一樣的,推測出開發(fā)的語義化,因為他們的命名肯定是會有規(guī)律的,增刪改查功能和和需要的參數(shù)都是這樣,尋找 輸入 輸出 方法只是也是站在開發(fā)思維尋找參數(shù)。
功能點Fuzz 增刪改查即可,參數(shù)尋找有響應(yīng)包有提示直接拼接,無提示全局找,找不到根據(jù)請求語義找其他功能點輸出參數(shù)位置拼接猜測,滲透測試講究一個測,有可能性的話就測一下。 Fuzz JS文件
攻防有時會遇到比較古老的站點PHP/ASP.NET, 同樣是開局一個登錄框 JS 都是直接引入的,提取不到可以利用的接口,并且沒有Webpack 打包技術(shù)這個時候可以嘗試Fuzz JS 文件, 這些比較古老的站點的JS目錄一般就是/js /script /plugins /content 等等,很容易找到 JS的名字也比較簡單,不像用Webpack 打包的JS ,名字中可能會帶有隨機字符。遇到這種還是能去FUZZ 一下JS文件的。 嘗試對JS 文件名Fuzz 有些情況下JS 文件并沒有顯示在當(dāng)前目錄 但確實是用到了這些文件,利用好字典對JS 文件名進(jìn)行爆破,如果響應(yīng)了新的JS 文件再從響應(yīng)包中審計提取新的接口進(jìn)行二次測試未授權(quán) 總結(jié)文中借鑒了一些其他師傅的文章思路結(jié)合Fuzz場景,如能為師傅們提供一些新的思路那最好不過,不足之處還請批評指出,希望各位大佬日日出0day?。?! 掃碼進(jìn)群,別打廣告,發(fā)任何和技術(shù)無關(guān),立馬送飛機票。純技術(shù)交流,歡迎加入船山網(wǎng)安戰(zhàn)神宗!
|