## Easy
### 1. Cookie Monster Secret Recipe
- Mô tả: Cookie Monster has hidden his top-secret cookie recipe somewhere on his website. As an aspiring cookie detective, your mission is to uncover this delectable secret. Can you outsmart Cookie Monster and find the hidden recipe? You can access the Cookie Monster here and good luck
- Đầu tiên khi vào challenge thì xuất hiện 1 form login

- Login 1 account bất kì thì nó trả về response access denied nhưng nó có 1 cái hint hỏi mình rằng gần đây có check cookie của mình không

- Kiểm tra trong burpsuite thig khi login account nó sẽ tự động set cho chúng ta 1 cookie và có về nó đã encode dưới dạng base64. Vậy giờ chúng ta decode nó ra thôi

### 2. Web decode
- Mô tả: Do you know how to use the web inspector? Additional details will be available after launching your challenge instance.
- Bài này có thể flag được dấu trong mã nguồn, đầu tiên quan sát thấy nó có 3 pages, check mã nguồn từng pages xem sao

- Home

- About

- Contact

- Sau khi check xong thấy trong thẻ section của page About có đoạn giá trị của attribute notify_true rất đáng ngờ, nó giống như 1 đoạn mã được encode bởi base64 => Vậy giờ tiến hành decode để thu được flag

### 3. Inspect HTML
- Mô tả: Can you get the flag? Go to this website and see what you can discover.
- Sau khi vào challenge thì ta thu được 1 đoạn nội dung như hình dưới

- Check mã nguồn thử xem thì thấy flag xuất hiện ngay trong comment

### 4. head-dump
- Mô tả: Welcome to the challenge! In this challenge, you will explore a web application and find an endpoint that exposes a file containing a hidden flag. The application is a simple blog website where you can read articles about various topics, including an article about API Documentation. Your goal is to explore the application and find the endpoint that generates files holding the server’s memory, where a secret flag is hidden. The website is running picoCTF News.
- Tóm gọn lại phần mô tả khá dài ở trên thì bài này yêu cầu tìm 1 endpoint hiển thị một file chứa flag. Ứng dụng này là một trang web blog đơn giản, nơi có thể đọc các bài viết về nhiều chủ đề khác nhau, bao gồm cả bài viết về API Documentation.
- Đầu tiên khi vào challenge thì check các page (about us, services) trước và mã nguồn của chúng nhưng không có gì đặc biệt vì chỉ là 1 vài dòng văn bản

- Tiếp theo ở phần các blog thì có thể truy cập vào các hashtag, ở đây có 1 hashtag là API Documentation lúc nãy đề bài có đề cập đến, vậy thử check hashtag này xem có gì

- Ta thấy được Swagger UI (Nó tự động tạo ra một giao diện web từ mã nguồn API, giúp dev có thể dễ dàng xem danh sách các yêu cầu (requests) mà hệ thống hỗ trợ mà không cần đọc code.)
- Và ở đây ta thấy có 1 endpoint khá nhạy cảm là /heapdump, giờ thử gửi request trực tiếp và xem kết quả trả về từ server xem có gì xảy ra không

- Download file về để xem phần body của response => Lấy được flag được dấu trong body

- Cũng có thể dùng burpsuite để xem trực tiếp

### 5. Unminify
- Mô tả: I don't like scrolling down to read the code of my website, so I've squished it. As a bonus, my pages load faster! Additional details will be available after launching your challenge instance.
- Tác giả không thích cuộn xuống để đọc mã nguồn, vì vậy đã thu nhỏ nó lại, giúp load nhanh hơn

- Check mã nguồn bằng inspect để tìm flag => Thành công

### 6. Bookmarklet
- Mô tả: Why search for the flag when I can make a bookmarklet to print it for me? Additional details will be available after launching your challenge instance.
- Tại sao phải phải tìm flag khi có thể tạo bookmarklet và in ra màn hình (Bookmarklet là một đoạn mã JavaScript nhỏ được lưu trữ dưới dạng một dấu trang trong trình duyệt web. Thay vì đưa bạn đến một trang web mới như bookmark thông thường, khi bạn nhấp vào một bookmarklet, nó sẽ thực thi mã lệnh trực tiếp trên trang web bạn đang xem.)

- Check mã nguồn để xem đoạn javascript kĩ hơn

- Copy đoạn javascript đó sang programiz để chạy và thu được flag

### 7. Includes
- Mô tả: Can you get the flag? Additional details will be available after launching your challenge instance.
- Sau khi start challenge thì để ý 1 button say hello

- Click vào đó thì có 1 đoạn script hiện liên với hint là code này nằm trong 1 file riêng biệt

- Vậy có thể flag được dấu trong các file chứa source code. Tiếp theo check mã nguồn

- Check từng file css, jss => Tìm được 2 part của flag


### 8. Local Authority
- Mô tả: Can you get the flag? Additional details will be available after launching your challenge instance.
- Trong challenge có 1 form login như hình dưới

- Login 1 acc bất kì thì trả về login failed

- Check mã nguồn tại /login.php luôn

- Phát hiện thêm 1 file js có tên là secure.js => Lấy được username và account của admin


### 9. SSTI1
- Mô tả: I made a cool website where you can announce whatever you want! Try it out! I heard templating is a cool and modular way to build web apps! Check out my website here!
- Ngay từ cái tên thì nó đã cho ta thấy rằng bài này dính lỗ hổng Server side template injsction, vậy giờ bắt đầu khai thác ssti thôi
- Sau khi thử qua bước đầu để xác định template engine nó sử dụng: twig(php) vì kết quả trả về là 7777777


- Tiếp theo ta khai thác ssti bằng paylaod sau:{{ self.__init__.__globals__.__builtins__.__import__('os').popen('ls').read() }}. Trong đó
- {{ ... }}: Đây là cú pháp đặc trưng của Jinja2 để yêu cầu máy chủ xử lý biểu thức bên trong và in kết quả ra màn hình.
- self: Trong Jinja2, self là một đối tượng tham chiếu đến chính template hiện tại. Nó là "điểm tựa" để chúng ta bắt đầu truy cập sâu vào các đối tượng hệ thống của Python.
- .__init__: Truy cập vào phương thức khởi tạo (constructor) của đối tượng self. Phương thức này luôn tồn tại trong các đối tượng Python.
- .__globals__: Đây là một từ điển (dictionary) chứa tất cả các biến, hàm và module mà hàm hiện tại có thể truy cập. Nó là "cửa ngõ" để thoát ra khỏi phạm vi hạn chế của template.
- .__builtins__: Đây là một từ điển chứa các hàm mặc định của Python (như print, len, int,...). Một trong những hàm quan trọng nhất nằm ở đây chính là __import__.
- .__import__('os'): Gọi hàm import để nạp thư viện os vào bộ nhớ. Thư viện này cho phép Python tương tác trực tiếp với hệ điều hành.
- .popen('ls'): Sử dụng hàm popen của thư viện os để chạy lệnh hệ thống. Trong trường hợp này, chạy lệnh ls để liệt kê các tệp trong root

- Cuối cùng đọc flag trong hàm .popen()

### 10. IntroToBurp
- Mô tả: Try here to find the flag
- Sau khi vào challeng thì có 1 form đăng kí như dưới, đăng kí thử

- Sau khi đăng kí xong nó redirect đến /dashboard để xác nhận OTP

- Nhập 1 OTP bất kì thử xem => Invalid OTP

- Vậy nếu vào burpsuite xóa param otp này trong body request thì có được không


### 11. Crack the gate 1
- Mô tả: We’re in the middle of an investigation. One of our persons of interest, ctf player, is believed to be hiding sensitive data inside a restricted web portal. We’ve uncovered the email address he uses to log in: ctf-player@picoctf.org. Unfortunately, we don’t know the password, and the usual guessing techniques haven’t worked. But something feels off... it’s almost like the developer left a secret way in. Can you figure it out?
- Bài này đã gợi ý cho chúng ta địa chỉ mail là ctf-player@picoctf.org, và giờ ta tìm cách để login vào tài khoản này
- Đầu tiên check mã nguồn thì thấy có 1 đoạn comment khá lạ

- Sau khi resarch thì được biết đây là 1 đoạn plain text được encrypt bởi rot13, vậy giờ decrypt để xem có hint gì không

- Nó gợi ý là dùng header "X-Dev-Access: yes" để bypass, vậy giờ thử thêm header đó vào request POST /login => Lấy được flag

### 12. Cookies
- Mô tả: Who doesn't love cookies? Try to figure out the best one.
- Như đề bài thì bài này chỉ cần tìm đúng cookie là lấy được flag
- Đầu tiên thử với 1 cookie bất kì mà nó đã gợi ý là sneakerdoodle


- Lúc này tại cookie hiện tại chứa param name có giá trị 0 => Đổi nó thành 1


- Vẫn không có gì xảy ra nhưng quan sát được nó trả về laoij bánh khác, nhớ lại đề bài yêu cầu tìm ra loại ngon nhất, vậy có nghĩa là cookie này không phải theo dạng 0-1 (false-true) mà sẽ là các số bất kì => Dùng intruder để brute force


### 13. logon
- Mô tả: The factory is hiding things from all of its users. Can you login as Joe and find what they've been looking at?
- Sau khi thử login 1 tài khoản bất kì để check request thì thấy cookie có 1 param khác là trường admin lúc này đang là false

- Đổi giá trị admin thành true để solve bài lab

### 14. Scavenger Hunt
- Mô tả: There is some interesting information hidden around this site. Can you find it?

- Thử check mã nguồn của challege thì tìm được part1 của flag

- Tiếp tục check file css thì tìm được part2

- Vậy part3 có thể nằm trong file js?

- Nó có 1 hint hỏi rằng làm thế nào để ngăn google indexing my web => Vậy câu trả lời có thể là file robots.txt đã ngăn không cho googlebot vào cửa
- Internet là một thành phố với hàng tỷ cuốn sách (trang web) nằm rải rác.
- Googlebot (Con bọ) là các nhân viên thư viện đi khắp thành phố để tìm sách mới hoặc sách vừa được sửa đổi (Crawling - Thu thập dữ liệu).
- Indexing (Lập chỉ mục) chính là hành động nhân viên đó mang sách về, đọc nội dung, phân loại và xếp lên kệ của thư viện Google.
=> Check thử robots.txt

- Tìm thấy được part3 của flag, nhưng vẫn chưa hết, nó có 1 hint nghĩ rằng là apache server. Nếu google indexing là nhân viên thư viện đến lấy sách thì apacher là 1 kho sách, nó sẽ tìm trang web đó ở đâu trong ổ cứng máy chủ, sau đó gói và gửi cho google bot, nó kiểm soát được ai truy cập vào trang web thông qua .htaccess => Check .htaccess thì tìm được part4

- Tiếp tục có 1 hint nữa là nó thích làm web trên Mac và nó lưu được nhiều thông tin trong đó. Sau 1 lúc research thì mình có biết được là khi làm web trên Mac thì thường tạo ra file .DS_Store để ghi nhớ cách bạn sắp xếp thư mục => Check .DS_Store sẽ thấy được part cuối cùngcùng

### 15. GET aHEAD
- Mô tả: Find the flag being held on this server to get ahead of the competition
- Nó kêu tìm flag để vượt lên đối thủ, đây là giao diện của nó

- Thử chọn red thì trên URL của nó có thêm /index.php?

- Check mã nguồn thì thấy khi chọn red thì method là GET còn chọn blue thì method là POST


- Nhớ lại đề bài là GET aHEAD và các thông tin cũng xoay quanh các method, vậy thử đổi method thành HEAD => Lấy được flag

### 16. dont-use-client-side
- Mô tả: Can you break into this super secure portal?

- Đầu tiên check mã nguồn thì thấy 1 cái hint to đùng như dưới

- Sắp xếp lại và submit flag thôi, flag cuối cùng là picoCTF{no_clients_plz_2e02b45}
### 17. Insp3ct0r
- Mô tả: Kishor Balan tipped us off that the following code may need inspection
- Bài này chỉ đơn giản là check mã nguồn là thấy được flag



### 18. Where are the robots
- Mô tả: Can you find the robots?

- Check robots.txt


### 19. Old session
- Mô tả: Proper session timeout controls are critical for securing user accounts. If a user logs in on a public or shared computer but doesn’t explicitly log out (instead simply closing the browser tab), and session expiration dates are misconfigured, the session may remain active indefinitely. This then allows an attacker using the same browser later to access the user’s account without needing credentials, exploiting the fact that sessions never expire and remain authenticated. Additional details will be available after launching your challenge instance.
- Sau khi register và login thì thấy 1 dãy các comment như dưới

- Để ý comment thứ 2 thấy có hint /session

- Tiến hành thay thê value session mình thành admin


## Medium
### 1. Crack the gate 2
- Mô tả: The login system has been upgraded with a basic rate-limiting mechanism that locks out repeated failed attempts from the same source. We’ve received a tip that the system might still trust user-controlled headers. Your objective is to bypass the rate-limiting restriction and log in using the known email address: ctf-player@picoctf.org and uncover the hidden secret. The website is running here. Can you try to log in?. Download the passwords list here.
- Bài này được nâng cấp hơn từ bài trước, nó có cơ chế giới hạn tốc độ đăng nhập, ngăn chặn các lần đăng nhập sai từ cùng 1 nguồn, đọc đến đây thì có idea bypass bằng cách brute force password và ip.
- Đầu tiên login email đề cho rồi login thêm lần nữa => Chắc chắn cơ chế chặn từ nguồn trên sẽ được kích hoạt nếu login thất bại

- Tiếp theo dùng header X-Forwarded-For để tạo 1 ip mới login vào => Thành công bypass cơ chế khóa 20p

- Brute force ip và password với pitchfork attack

- Thành công thu được flag với password là axTtBLvc

### 2. SSTI2
- Mô tả: I made a cool website where you can announce whatever you want! I read about input sanitization, so now I remove any kind of characters that could be a problem :) I heard templating is a cool and modular way to build web apps! Check out my website here!
- Bài này là nâng cao của SSTI1, nó đã được escape các kí tự như dấu chám và dấu 2 gạch dưới. Thế nên không thể khai thác bằng cách thông thường được

- Sau khi research thì biết được rằng có thể thay dấu chấm bằng |attr() (Hàm attr trong Jinja2 được dùng để truy cập thuộc tính của một đối tượng bằng tên thuộc tính dưới dạng chuỗi (string), thay vì dùng cú pháp dấu chấm truyền thống object.attribute. Nó rất hữu ích khi tên thuộc tính được lưu trong một biến hoặc được tạo động.)
- Và sau đó bypass dấu 2 gạch dưới bằng cách hexademical encoding là \x5f\x5f
- Cuối cùng ta có payload như sau:
`{{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')('id')|attr('read')()}}`
- Sau đó dùng các command để khai thác và đọc flag



### 3. Secrets box
- Mô tả: This secret box is designed to conceal your secrets. It's perfectly secure-only you can see what's inside. Or can you? Try uncovering the admin's secret. Additional details will be available after launching your challenge instance.
- Bài này cho chúng ta 1 hint là SQLi
- Đầu tiên thử đăng kí và login xem

- Tiếp theo check src code thì thấy nó cho chúng ta xem cả database:

- Ở đây ta thấy được id của admin và owner_id là khóa ngoại tham chiếu đến id của admin, xác định bí mật này thuộc về ai.
- Check tiếp src code thấy có đoạn xử lý công việc tạo secrets như sau:

- Thấy biến content không được xử lý mà truyền thẳng vào query string SQL
- Bây giờ ta thử khai thác SQLi ở create new secret xem lỗi của nó như nào


- Tiếp theo bypass lỗi bằng các đóng dòng insert đó và loại bỏ string đằng sau bằng comment


- Để ý ở lỗi trước đó có thể thấy nó xuất hiện id của chúng ta, vậy giờ chỉ cần insert thêm 1 dòng với id đó và content thay bằng query string content của bảng secrets và owner id của admin: `hihi'),('744dfed7-c043-4175-aefb6151e492f74b',(select content from secrets where owner_id='e2a66f7d2ce6-4861-b4aa-be8e069601cb'));--`


### 3. North-South
- Mô tả: I've set up geo-based routing - can you outsmart it?
You're trying to retrieve the flag, but there's a catch: access to the real service is restricted based on your geographic location. Only requests from a specific region are routed to the server that holds the flag. Everyone else is sent somewhere... less interesting. Additional details will be available after launching your challenge instance.
- Hint: How does a server figure out where in the world you're connecting from?
How does a server figure out where in the world you're connecting from? Can you "travel" to another location without ever leaving your chair?
- Source:

- Workflow của nó như sau:
- Người dùng gửi yêu cầu đến cổng 80.
- Nginx nhìn vào IP user, tra bảng GeoLite2-Country.mmdb.
- User từ Iceland (IS): Đi tới máy chủ cổng 9000.
- User từ Việt Nam (VN) hoặc bất kỳ đâu khác: Đi tới máy chủ cổng 8000.
- Đầu tiên với bài này thử thêm header X-Forward-For để fake ip sang iceland nhưng không thành công
- Cuối cùng sau khi research thì thấy Urban VPN có free ip ở iceland -> Download về và fake sang iceland

### 4. SQL Map 1
- Mô tả: You’ve been hired by a shadowy group of pentesters who love a good puzzle. The system looks ordinary, but appearances lie. Somewhere inside, sloppy code and legacy hashing practices left a tiny, perfect doorway for an attacker. Your mission — should you choose to accept it — is to slip through that doorway, act as a legit user and retrieve the secret flag. Additional details will be available after launching your challenge instance.
- Đầu tiên dùng sql map để quét scan thì thấy có lỗ hổng ở chức năng search


- Biết được DB của nó là SQLite, tiếp theo yhử query string với điều kiện đúng thì nó cho ra 10 flag như trên nhma tất cả đều là fake flag

- Vậy khai thác union attack để xác định số cột của nó -> 2



- Tiếp theo khai thác các bảng có trong hệ thống -> có 3 bảng là flags, sqlite_sequence, users (không cần quan tâm flags vì nó chứa các fake flags lúc nãy)

- Khai thác bảng users -> Thấy các password đã được hash bằng MD5

- Có account admin -> crack hash password của admin -> Không thành công

- Tiếp theo thử crack pass của ctf-player -> Thành công tìm được pass dưới dạng plaintext

- Tiếp theo login thử account ctf-player -> Lấy được real flag

### 5. Fool the lockout
- Mô tả: Your friend is building a simple website with a login page. To stop brute forcing and credential stuffing, they’ve added an IP-based rate limit: exceed the attempt threshold and your IP is blocked for a while. They’re convinced this makes guessing credentials impossible. To test their defense, they’ve: Created a dummy account with a random username–password pair from public credential lists. Given you those username and password lists.
Shared the full source code. Can you bypass the rate limit, log in, and capture the flag? Additional details will be available after launching your challenge instance.
- Bài này sẽ áp dụng 1 cơ chế chặn là block ip nếu 1 vượt quá điều kiện gì đó của nó (lab cho chúng ta 1 src và 1 file chứa usr, pass). Nó thuộc vul authentication

- Đầu tiên phân tích src code

- Ở đây nó cho phép tối đa 10 request lỗi, nó cần 30s để tính toán giới hạn và nếu quá 10 request lỗi thì nó sẽ khóa 120s
- Có 1 đoạn xử lý cứ sau 30s thì bộ đếm yêu cầu được đặt về 0

- Ở bài này có thể nghĩ ngay đến việc brute force cả ip với header X-Forwarded-For nhưng sau khi quan sát ở biến client_ip = request.remote_addr thì nó connect ip trực tiếp từ tầng TCP (từ máy chủ của chúng ta) nên nó không đọc các http header trong X-Forwarded-For

- Vậy ý tưởng của chúng ta là viết 1 đoạn code mà ở đó khi chạm ngưỡng 10 requests (giới hạn của server), nó sẽ dùng time.sleep() để giới hạn thời gian nghỉ. Khoảng nghỉ sẽ là 31 giây này đảm bảo hàm refresh_request_rates_db trên server sẽ thực hiện phép tính curr_time - epoch_start_time > 30 và reset bộ đếm về 0


- Sau khi tìm ra thì login và lấy flag

### 6. Hashgate
- Mô tả: You have gotten access to an organisation's portal. Submit your email and password, and it redirects you to your profile. But be careful: just because access to the admin isn’t directly exposed doesn’t mean it’s secure. Maybe someone forgot that obscurity isn’t security... Can you find your way into the admin’s profile for this organisation and capture the flag? Additional details will be available after launching your challenge instance.
- Tóm lại nó kêu là chỉ admin mới nhìn thấy được flag còn user thường thì không
- Khi vào thì thấy chỉ có 1 form login như này và thử login 1 vài account thì không đúng

- Vậy check mã nguồn thử xem

- Tìm được mail và pass, login vào thì thấy có 1 thông báo đây là guest với id:3000, chỉ admin mới xem được flag

- Nhưng thứ mà chúng ta nên để ý là đoạn mã md5 ở URL, thử crack hash xem nó ra gì -> ra được 3000

- Vậy ý tưởng của chúng ta là brute force id được hash MD5. Vậy chúng ta sẽ viết 1 đoạn code để hash MD5 với giá trị từ 1 đến 4000

- Brute-force -> Tìm được id 3012 là id của admin



### 7. Byp4ss3d
- Mô tả: A university's online registration portal asks students to upload their ID cards for verification. The developer put some filters in place to ensure only image files are uploaded but are they enough? Take a look at how the upload is implemented. Maybe there's a way to slip past the checks and interact with the server in ways you shouldn't. Additional details will be available after launching your challenge instance.
- Đối với mô tả của bài này thì ta có thể xác định được nó dính file upload vulnerbality
- Đầu tiên nó có thông báo chỉ chấp nhận các file ảnh như png, jpg, fig

- Tiếp theo ta thử test với 1 file php xem sao

- Nó không được chấp nhận để upload => đã có cơ chế validate trong BE
- Sau khi xem hint 1 thì ta biết nó liên quan đến .htaccess, nó giống như 1 bài trong portswigger
- Đầu tiên ta viết 1 file .htaccess với nội dung là AddType application/httpd-php .lmao => Có nghĩa là bất kì file có extension là .lmao thì nó sẽ xử lý php

- Tiếp theo upload file .htaccess

- Sau khi upload xong viết payload với $_GET để có thể query string trên URL


- Sau khi vượt qua được cơ hế validate thành công thì thực hiện tìm flag


- Kết hợp khai thác path traversal để tìm và đọc flag


### 8. No FA
- Mô tả: Seems like some data has been leaked! Can you get the flag? You can get started here to find the flag! The application code can be found here. The leaked data can be found here.
- Dựa vào mô tả thì có lẽ bài này liên quan đến factor authen
- Trong đề bài thì nó có cho 1 file src và 1 file db, c