🔰[M☆CTF Training 2023] Writeup Web

Ping-Pong

Bài này chỉ nhìn vào đã biết lỗ hổng

Vuln: Command Injection

Tool: Burp suite

Payload: %0acat+/proc/self/environ (%0a->xuống dòng)

Flag: MCTF{k0Mm4Nd_1njeCT10N_1T'5_E45y}

CTF-WIKI and CTF WIKI-2

Hai bài này chung một lỗ hổng, nhưng chỉ khác nhau nơi giấu flag thôi.

Vuln: Directory traversal/path traversal

Tool: Burp suite

Wiki

Bài này flag giấu ở /proc/self/environ có thể dùng payload ../../../proc/self/environ

Có một cái tiện hơn là web này được code bằng php-> check file /proc/self/cmdline.

Có thể LFI to RCE bằng cách sử dụng các wrapper của PHP:

  • PHP cung cấp wrapper là các built-in được sử dụng cho các giao thức kiểu url. Nó sử dụng một số hàm hệ thống như fopen(), copy(), file_exit() và file_size().

  • Các wrapper mà PHP cung cấp: Lưu ý: Để sử dụng các wrapper này thì chúng ta cần phải đáp ứng một số điều kiện môt trường.

file:// — Accessing local filesystem

http:// — Accessing HTTP(s) URLs

ftp:// — Accessing FTP(s) URLs

php:// — Accessing various I/O streams

zlib:// — Compression Streams

data:// — Data (RFC 2397)

glob:// — Find pathnames matching pattern

phar:// — PHP Archive

ssh2:// — Secure Shell 2

rar:// — RAR

ogg:// — Audio streams

expect:// — Process Interaction Streams

Sử dụng wrapper data://

  • Đây là một hàm thực thi code từ xa. Ta có thể inject đoạn mã mà mình muốn thực thi vào url.

  • Payload: ?file=data:,<?php system('cmd'); ?>

Wiki 2

Bài này thì phải rce vì flag có tên file riêng không nằm bất kỳ trong file nào quan trọng của linux.

Lúc này vẫn sử dụng wrapper data để rce.

Payload như cũ: ?file=data:,<?php system('cmd'); ?>

Admin-secret

Bài này lúc đầu cứ nghĩ nó là SQL Injection nhưng không....Nó có source code.

<?php
if (isset($_GET["source"])) highlight_file(__FILE__) && die();
$check = "Wrong!";
if (isset($_GET['username']) && isset($_GET['password'])){
    $username = $_GET['username'];
    $password = hash("SHA256", $_GET["password"]);
    if ($username == 'admin' && $password == 0){
        include'./flag.php';
    }}
?>

Phân tích code thì vuln nhìn đã có: PHP Magic Tricks: Type Juggling.

Password được nhập sẽ được hash theo type sha256 và sau đó so sánh với không nhưng điều đang nói ở đây thay vì so sánh chặt chẽ là === thì lại ==.

Phân tích qua PHP Type Juggling:

  • Toán tử so sánh == nếu như kiểu dữ liệu khác nhau nó sẽ đưa về một kiểu dữ liệu chung để thực hiện việc so sánh

  • PHP Comparisons: LooseValue

    "0000" == int(0)

    TRUE

    0e12" == int(0)

    TRUE

    "0e12345" == "0"

    TRUE

    "0abc" == int(0)

    TRUE

    "abc" == int(0)

    TRUE

    "0e12345" == "0e54321"

    TRUE

    "0e12345" <= "1"

    TRUE

    "1abc" == int(1)

    TRUE

    "0xF" == "15"

    TRUE

Nếu ép kiểu 1 string 1e theo sau là 1 string bất kỳ (ví dụ: 1e219229 ) về kiểu int, thì sẽ là (int) 1

Ở đây có thể dùng var_dump để check. Nếu như sha256 encode dạng 0e23323 thì lúc này nó sẽ ép kiểu về int(0) -> pass

Note: Có thể hiểu như 0^233333 = 0

Khi đó bypass thành công == trong php(Tương tự MD5, SHA1, SHA224 cũng thế)

username:admin&password:34250003024812

Easy JWT

Ở đây có hai chức năng đó là /gettoken và /flag. Ở đây phải làm sao đó để leak flag ra ngoài.

Phân tích qua xíu đoạn token khi nhập username:

Chỗ cần xem xem ở key can_get_token: 0 , ở đây chắc phải thay thành 1 để lấy flag, quan trọng không có secret key. Mình brute force nhưng không được, thấy ảnh cạnh bên có tên là hint.jpg.

Ở đây Secret sẽ viết bằng tiếng ra rồi phiên âm qua tiếng anh, lấy chữ cái đầu và viết hoa.

Мамонт - М Титан - Т Утка - У Сыр - С Изуку Мидория - И

Secret: MTUCI

Sửa lại cookie rồi getflag

Last updated