picoCTF Web Challenge Writeup
EASY
有一個輸入框 什麼都沒有檔 直接 SSTI
就好
payload :
EASY
有一個上傳頁面 題目沒有限制上傳內容 直接上傳一個簡單的 php shell
題目說 flag 在 /root
嘗試讀取發現看不到 用 sudo -l
查看有沒有不用密碼就可以執行的指令
發現到全部的指令都可以執行 直接以 root
權限開啟 /root
底下的 flag.txt
就可以了
EASY
題目提到和後端有關 猜測是 API
找到 /api-docs
這個路徑
進到頁面後發現有一個叫 /heapdump
可以用來 dump 記憶體
用 curl dump 出來後 再用 grep
過濾出 flag 關鍵字
EASY
一個登入頁面 隨便登入後 cookie 就會多一個 secret_recipe
做 base64
decode 就好了
MEDIUM
這題是一個有關 NAND 電路之類的東西 但其實不用管那麼多 我們只需要知道他在記憶體某個時候會送出第一個 flag
所以我們用爆破的 可以寫個腳本 也可以像我一樣用陽壽換 下面這張圖是我偶然按出來的
MEDIUM
這題有多了一些黑名單 所以直接用一個沒有 {{
}}
_
.
[
]
的 payload 就過了
MEDIUM
這題是一題用 web 包裝的 pyjail 題目 提示說 flag 在 /flag.txt
嘗試直接 open('flag.txt')
但輸出 Error: Detected forbidden keyword
所以可以猜測會擋掉一些字元 經過測試後得出
payload : open(chr(47)+"flag"+"."+"txt").read()
MEDIUM
這題是一個西洋棋的遊戲 根據提示可以知道跟 websocket
有關
嘗試移動棋子後從 burp suite
查看 websocket
紀錄 就可以知道送出的內容
從 source code 可以找到 websocket 的 URL
得到這些資訊後 我們可以自己連接到 websocket
伺服器並傳送訊息
嘗試幾次後發現使用極大的負值就可以出 flag 了
payload : eval -9999999999
MEDIUM
這題是一個登入頁面 根據提示的 backup
emacs
我們可以嘗試在 php 後面加 ~
在 emacs 中
php~
是php
的備份檔案
查看 source code 後會發現最下面多了一行經過混淆的 php 推測是這個登入頁面的原始碼
可以看到程式碼中有很多的 UTF-8
字串 丟到 cyberchef 用 unescape string
後得到
看到有很多 base64
字串 於是把這些字串解密後 再整理一下程式後得到
現在很清楚了 我們可以發現 sha1
碰撞行不通 嘗試用陣列的方式繞過
這可以成功的原因是因為第一個 ==
因為一個的值是 1
一個是 2
所以可以通過
第二個 ===
因為 sha1()
傳入陣列會報錯所以值變成 null
兩個都是 null
就通過了
payload : username[]=1&pwd[]=2
HARD
HARD
EASY
這題很簡單,F12按下去,找到一串hash,直接base64
EASY
這題感覺又更簡單,直接找就有了
EASY
根據題目先開Burp,網站一開始有個註冊頁面,隨便輸入後發現接著要2FA驗證,一樣隨便輸入,從Burp看到他只是送了一行otp=a
,那我們把這行刪掉就可以了!
EASY
把題目給的script跑一次就過了
MEDIUM
這題是一題經典的File upload的題目,先看看他的robots.txt
,發現有兩個路徑
查看/instructions.txt
,發現他只檢查最前面幾個bytes,於是我們就可以製作shell
網路上找一個簡單的php shell最上面加上PNG
來bypass,因為也會檢查檔名,所以我把檔名設為test.png.php
,再到HTML中把限制副檔名那個地方刪掉,成功上傳後透過剛剛發現的路徑進入到/uploads/test.png.php
,就可以執行shell,ls
後發現只有test.png.php
,於是我們執行ls ../
來查看上一層目錄,發現有個奇怪的檔案MFRDAZLDMUYDG.txt
,打開它就得到flag了
MEDIUM
這題給了一個登入的頁面 查看 source code 後發現是用 mongo DB
在根據題目可以知道會是 No SQL Injection
這段程式碼會建立一個用戶
從這裡可以得知 flag 在 token 裡面 而 token 要在登入後才能得到
從登入頁面可以知道是使用 email 和 password 登入
用已知用戶和 payload 登入
email : picoplayer355@picoctf.org
password : {"$ne": null}
成功登入後在 Response 中可以找到 token
Base64 解碼後就可以得到 flag 了
HARD
MEDIUM
題目給了一個網站 發現按下 Details
會做 POST /data
的動作
用 BurpSuite 可以觀察到可能有 XXE Injection
找到 payload 後 再次 POST /data
就可以得到 flag 了
MEDIUM
這題給了一個登入頁面 從標題得知是 SQL Injection 嘗試簡單的 payload 後就可以成功登入了
發現這裡還有一個查詢 可以推測也是 SQL Injection
因為有 City
Address
Phone
這三個欄位
可以推測查詢有三欄 用 UNION
來測試 成功注入後嘗試尋找有哪些表
從提示中得知使用的是 SQL Lite
搜尋到 SQL Lite 可以 dump 出所有 tables 的語法
找到這些 tables 後發現在 more_table
中有 flag
使用語法指定 more_table
這張表來搜尋就可以得到 flag 了
MEDIUM
這題給了一個驗證輸入的框框 通過驗證就會出 flag
找到驗證的這段 js
發現只要開頭為 picoCTF
就可以得到 flag 了
MEDIUM
題目一開始是一個登入頁面 用給定的帳號 test
密碼 test!
登入
登入後捕捉到有兩個網址很特別 發現是兩段 base64 解碼後就可以得到 flag 了
MEDIUM
這題是一個線上書店 用給定的帳號密碼登入後 查看收到的 Response 後發現有一段 jwt token
用 jwt-cracker
和 rockyou.txt
爆破這段 jwt token 找到密碼 1234
後
從這 Role.js
中可以知道 ID 要高一點 現在的是 1 所以我們改成 2
從 BookShelfConfig.java
中可以知道 Admin
的 Email 是 admin
用 jwt token 的編輯器製作 admin 的 token
用這個 token 訪問 flag 頁面即可得到 flag
HARD
HARD
EASY
隨便登入一次後會有secure.js
,裡面就有Admin的帳號和密碼
EASY
F12 –> FLAG
EASY
在style.css
和script.js
裡面各有一半的flag
MEDIUM
這的是一個登入頁面 用最簡單的 payload ' or 1=1 --
就可以登入成功了
flag 就在 source code 裡面
MEDIUM
這題給了 PostgreSQL 的連線資訊 登入進去後使用 \dt
列出所有 tables
使用 \d flags
來列出 flags
中的欄
最後用 SQL 語法讀取 flags
中的內容就可以找到 flag 了
MEDIUM
這題給了一個普通的網站 查看 source code 發現有個 /serect/
路徑
進入這個路徑後找到了另一個路徑 /hidden/
進到這裡後又找到另一個 /superhidden/
進到最後一個就可以找到 flag 了
MEDIUM
這題是一個很普通的網站 看起來沒什麼問題 根據提示說 flag 藏在 source code
按照提示用 httrack
把網站下載下來
用 grep
尋找有 picoCTF
的字串就可以找到 flag 了
MEDIUM
根據題目的 Roboto
推測和 robots.txt
有關
進入 robots.txt
後發現有一行看起來很像 base64
解碼後得到路徑 js/myfile.txt
進入 myfile.txt
就可以找到 flag 了
MEDIUM
題目一進來有個按鈕 按下去後發現 cookie 多了一個 isAdmin
把值改成 1
後重新整理頁面就可以得到 flag 了
MEDIUM
這題是一個讀檔案的頁面 題目說 flag 在 /flag.txt
當前目錄是 /usr/share/nginx/html
使用點點斜就可以得到 flag
HARD
HARD
MEDIUM
index.js
這個網站只有一個功能,他會執行 cowsay
這個指令
在本地測試執行看看指令 發現可以執行 bash command
payload : https://caas.mars.picoctf.net/cowsay/%60cat%20falg.txt%60
MEDIUM
這題是一個登入頁面,查看 index.js
index.js
發現這個登入的邏輯就把帳號密碼寫出來了
把密碼 cGljb0NURns1M3J2M3JfNTNydjNyXzUzcnYzcl81M3J2M3JfNTNydjNyfQ
做base64decode 後就可以得到 flag 了
HARD
app.py
從 server.py
可以發現這個網頁可以建立一個新的頁面,並且會以數入內容的前 128 個字元為檔名的前半部分,後半部分則是字串隨機的數列
但他會過濾掉 _
和 /
因為後面會執行 url_fix
所以可以把 /
改為使用 \
就可以 bypass 了
index.html
在 index.hmtl
中可以發現在 error 的部分會檢查 url 中 /?error=
的參數
在 /templates/errors/
是否有一樣此檔名的 html
如果有就會用模板開啟這個檔案 如果沒有就會直接顯示參數
試著在 errors
建立一個測試檔案 在輸入匡輸入 ..\templates\errors\test
得到 https://notepad.mars.picoctf.net/templates/errors/test-QIRu4cYzeFM.html
後
使用 /?error=
訪問 test 就可以得到我們剛剛在輸入匡輸入的內容
https://notepad.mars.picoctf.net/?error=test-QIRu4cYzeFM
因為知道網站是用 flask 架的,所以可以使用 jinjia2 SSTI
要讓攻擊被模板讀取,就必須確保攻擊字段不會被當作檔名
因為檔名只會取前 128 個字元,所以可以塞一個長度為 128 的 padding 來 bypass
後面再串接上攻擊的語法
payload = `
成功執行後 我們可以從 source code 知道 _
和 /
會被過濾掉 於是用超級 payload 就可以了
這個 payload 可以繞過
{{
}}
_
.
[
]
final payload :
EASY
有兩種解法,一種是自己慢慢try,把cookies try到18就有flag了,另一種是利用Burp的Intruder,把request送到Intruder,把我們要payload的部分變成§0§
,到payload的頁面把數值設定為1~20,逐個去看response,到第18個就有了
EASY
一開始先看html,js和css,HTML中有第一段flag,mycss.css
中有第二段flag,根據myjs.js
中的提示可以推斷是指robots.txt
中有第三段flag,根據robots.txt
中提到apache可以推斷.htaccess
中有第四段flag,根據剛剛.htaccess
中說到是在mac上架的所以可以知道.DS_Store
中有最後一段flag
EASY
這題進去後有兩個按鈕可以改變背景顏色 一個變紅色 一個變藍色
觀察 source code 發現一個是用 GET 一個是用 POST
用 curl
查看 Header 就可以找到 flag
-I
和--head
都可以
MEDIUM
用 index.phps
查看 index.php
的 source code
發現還有cookie.php
和 authentication.php
用 phps
查看他們的 source code
發現 authentication.php
可以直接進入 guest 登入後的頁面
在 cookie.php
發現會驗證 cookie
從上面我們知道他會取得解碼我們的 cookie 但因為我們 cookie 中沒有 is_guest 函數 所以會報錯
報錯後會執行我們送出去的字串 所以可以利用這點來指定要開啟的 log_file
題目說 flag 在 ../flag
自製 payload
按照上面寫的解碼方式加密回去我們要搜尋的 flag
得到 payload 後在 authentication.php
建立一個 login
cookie 並重新整理就可以得到 flag 了
MEDIUM
根據上面的片段,可以知道會隨機從 cookie_names 裡面選一個當作 secret_key
這一個片段又告訴我們訪問 /display
時,會檢查 very_auth
是否為 admin
所以我們可以使用 flask-unsign 這套工具來暴力破解 secret_key
flask-unsign 是一套專門用來解密和破解 flask 的 ssesion cookie 的工具
可以使用預設的字典檔 flask-unsign[wordlist]
也可以不下載字典檔只使用 flask-unsign 即可
把 cookie 寫入 cookie.txt 再把 cookie_names 按照字典檔的方式寫入 wordlist.txt
wordlist.txt
再按照官方文檔使用指令
找到 secret_key 後就可以製作 very_auth
為 admin
的 session cookie
再把瀏覽器中的 cookie 替換為修改後的 cookie,接著只要訪問 /display
即可得到 flag
MEDIUM
查看 filter.php
中被過濾的字元
簡單測試一下 SQL 語法
題目說需要使用 admin
登入,發現串接字元 ||
沒有被 ban
所以可以把 admin
改用串接的方式
在密碼的部分,因為沒辦法使用註解,我們可以從最常見的 payload 來思考
最常見的這個 payload 在指定使用者名稱為 admin
後,確保第二個查詢恆正
所以我們現在需要讓查詢密碼的地方恆正,or
不能用的話改用is not
這樣就可以成功登入了,接著到 filter.php
重新載入就可以得到 flag 了
MEDIUM
這題給了一個檢查 flag 的網站,找到 G82XCw5CX3.js
得到一串 js
美化排版和格式後,看起來像是經過混淆的程式碼,丟到deobfuscate.io後做code review
這邊可以發現他會 fetch 一個檔案
把上面的值代入 _0x4e0e
可以知道到他會回傳 0x1e9 - 0x1d6
也就是 19
的值
因為他還會做一段混淆,把 _0x402c
中的順序打亂,所以直接把這段執行一次就可以得到混淆後的第 19 個值 ./JIFxzHyW8W
把這個 wasm 下載下來 http://mercury.picoctf.net:1896/JIFxzHyW8W
運用線上的 wasm2wat 就可以得到 flag 了
wat = webassembly text (wasm text)
MEDIUM
這題給了一個網站,但完全沒有其他提示,只有一句話
Only people who use the official PicoBrowser are allowed on this site!
根據提示給了一個 HTTP 的文檔可以推測通靈跟 HTTP Header 有關
在 HTTP Header 修改 User-Agent 為 PicoBrowser
這次提示訊息變了,下面我直接把每一關列出來
Only people who use the official PicoBrowser are allowed on this site!
User-Agent: PicoBrowser
I don't trust users visiting from another site.
Referer: mercury.picoctf.net:46199
Sorry, this site only worked in 2018.
Date: Mon, 1 Jan 2018 00:00:00 GMT
I don't trust users who can be tracked.
DNT: 1
This website is only for people from Sweden.
X-Forwarded-For: 102.177.146.0
You're in Sweden but you don't speak Swedish?
Accept-Language: sv-SE
MEDIUM
前面都跟上面那一題一樣的做法,差別在於把 wasm 丟到 wasm2wat 後並沒有直接顯示 flag
原本 flag 這行變成了看不懂的字串,推測是加密後的字串
丟到 cyberchef 的 magic 自動辨識後得到
把多餘的字元刪除就可以得到 flag 了
MEDIUM
一樣先看 filter.php
Filters: or and true false union like = > < ; -- /* */ admin
發現上一次使用的都沒有被 ban 所以使用相同 payload 即可
MEDIUM
其實這題根本就是 Crypto
一進網站就只有要你變成 admin 查看 cookie 後發現有一個 auth
題目敘述:I forgot Cookies can Be modified Client-side, so now I decided to encrypt them!
根據題目敘述 因為有 C B C 三個大寫字母 所以可以推測出跟 CBC mode有關
用 Bit-flipping attack 爆破 admin cookie 後
用這個 cookie 重新載入頁面就可以得到 flag 了
MEDIUM
根據題目敘述我們可以知道 這是一個簡單的 php md5 碰撞
在 collisions 中找到兩個 pdf 後 上傳上去就解開了
HARD
HARD
HARD
MEDIUM
這題要一路過五關的 SQL Injection
OR
admin'--
/<any>
or and like = --
admin'/*
/<any>
or and = like > < --
admin'/*
/<any>
or and = like > < -- admin
ad'||'min';
/<any>
or and = like > < -- union admin
ad'||'min';
/<any>
都通關之後到 /filter.php
就可以看到原始碼了
EASY
這題是一個登入頁面 直接看原始碼就有破碎的 flag 按照順序拼起來就好
EASY
一樣是個登入頁面 隨便登入後會發現多了一個 admin cookie
把 value 改成 True
再重新整理頁面就會出現 flag
EASY
右鍵查看 html
js
css
就可以找到flag 了
EASY
查看 robots.txt
得到另一個路徑 /8028f.html
進去這個路徑就結束了
MEDIUM
先從左邊選單找到登入頁面 /login.html
接著找到了一個隱藏的值叫 debug
把他從 0
改成 1
隨便登入後就可以看到 SQL 的語句 直接 SQL Injection
payload : admin' or 1=1 --#
/<any>
MEDIUM
這題一樣右鍵看 source code 找到下面這段關鍵的片段 這段看起來經過混淆 丟到 deobfuscater
經過解混淆後得到清楚一點的 js 但還是有點亂 我們再手動更改成如下
根據順序就可以回推 flag 例如 (checkpass[_0x4b5b('2')](0, 8)
就可以知道這是 flag 的第 0-7 個字元 因為 _0x4b5b
的順序是亂的
直接用 console
就可以得到我們要的片段
把 (0,8)
(8,16)
(16,24)
(24,32)
拼起來就可以知道 flag
MEDIUM
跟上一題 Irish-Name-Repo 1
一樣 先把 debug
改成 1
嘗試一樣的 SQLi payloa admin' or 1=1 --#
/<any>
卻顯示 SQLi detected.
看來這次有 fliter
嘗試其他的 payload 就可以了
payload : admin'/*
/<any>
MEDIUM
隨便用一個名字登入後可以從 cookie 得到一個 jwt token
使用 jwt-cracker 搭配 rockyou.txt
爆破出 secret
得到 secret 後 使用 jwt.io 製作 admin 的 token
把 cookie 中的 jwt
的值用新的 jwt token
替換後重新整理頁面就會出現 flag了
MEDIUM
頁面打開有一個按鈕 直接按下去顯示我不是 picobrowser
用 burp suite
更改 request 的 User-Agent
為 picobrowser
MEDIUM
跟前面的 Irish-Name-Repo 1
唯一不一樣的是登入頁面只剩密碼的輸入欄位
一樣先把 debug
改成 1 密碼隨便輸入後得到
嘗試了一下發現 a
-> n
, b
-> o
可以按照這個邏輯構造 SQLi
payload
HARD
HARD
MEDIUM
用題目敘述中給的測試帳號 test
/Test123!
登入後可以在 cookie 得到一串 JWT token
丟到 jwt decoder 解密後 發現我們可以更改加密的方法 所以把 alg
改成 none
因為要以 admin
登入 所以 role
也改成 admin
最後因為合法的 jwt
要有兩段 所以我們把加密的部分移除後 分隔的符號要留著
原始 token
更改後的 token
注意最後面務必要有一個
.
才會是合法的jwt token
把 /private
頁面的 token 改成我們更改後的再刷新一次頁面