🔰[M☆CTF Training 2023] Writeup Web
Last updated
Last updated
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}
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
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'); ?>
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'); ?>
Bài này lúc đầu cứ nghĩ nó là SQL Injection nhưng không....Nó có source code.
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
"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ế)
Ở đâ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