Cookie and Milk - Bánh quy và sữa

Chào tuần mới cả nhà!! :heart_eyes: Vừa mới tổ chức Bánh quy Đấu trường mùa 2 xong có bài Magic Login (đã có writeup) hay quá, lại cũng có tí liên quan đến Type Juggling nên mình làm writeup cho bài này luôn, tiện giải đáp thắc mắc cho các gà đang mãi không biết làm sao để giài bài này :pleading_face: :pleading_face: :pleading_face:

Các gà có ý kiến gì cứ còm xuống bên dưới cho sôi động nhé :heart:

Link bài lab

Trước khi cắm đầu vào giải bài lab, có lẽ chúng ta nên đọc qua note của bài lab này để thu thập tí thông tin và hiểu qua về những gì mình sẽ làm chứ nhẻ?

Có 3 từ khóa và mình sẽ gộp vào và giải thích luôn bên dưới:

Type Juggling (Trong bài này sử dụng PHP nên mình sẽ nói nhiều hơn về PHP Type Juggling nhé): là 1 lỗi bảo mật thường gặp trong quá trình code; khi so sánh 2 biến thứ cần chú ý là kiểu dữ liệugiá trị, đối với toán tử so sánh ===, PHP sẽ kiểm tra kiểu dữ liệu của 2 biến trước rồi mới so sánh giá trị, trong khi với toán tử == (Loose Compare chính là tên này - các toán tử so sánh không tuyệt đối như =, ==, !=, <, >, <=, >= ) thì PHP (và vài ngôn ngữ khác :hear_no_evil: ) chả quan tâm kiểu dữ liệu là gì luôn. Nếu 2 biến khác kiểu dữ liệu, hắn sẽ convert về cùng 1 kiểu dữ liệu là numbers và thực hiện so sánh như không có gì xảy ra, từ đó dẫn đến lỗ hổng Type Juggling.

Còn Magic Hash thì sao ạ? Đối với các hàm băm như MD5, SHA-1, SHA-224, SHA-256 sẽ có những chuỗi khi được hash sẽ tạo ra 1 chuỗi bắt đầu bằng ‘0e’ hoặc ‘00e’ và theo sau toàn số là số, không có kí tự và chữ cái nào xen giữa, PHP lúc đó sẽ hiểu đấy là phép toán 0^x và kết quả trả về sẽ bằng 0. Các Magic Hashes này sẽ được tận dụng để khai thác lỗ hổng Type Juggling bên trên :see_no_evil:

Note nhỏ cho các chiến binh gà, hãy tạo thói quen fact check thông tin nhé, đó cũng là 1 cách để ghi nhớ thông tin lâu hơn đó. Ngoài ra thì lên mạng đừng có tin ông nào 100% các gà ạ, có thể mấy dòng trên là mình bịa ra để lừa các bạn đấy hehe :see_no_evil:

OK bắt đầu giải lab nào
Khởi động nhanh con lab ta có được giao diện chính


Do you know what time is it? It’s PHÂN TÍCH CODE time!!
include(__DIR__."/flag.php"); Dòng này đại ý là flag sẽ được trả về đúng ở trang này luôn :))
extract($_GET); Dòng này chạy hàm extract() trong PHP để lấy các giá trị được truyền vào theo phương thức GET

tiếp theo là vòng lặp if else

if (isset($_COOKIE['magic']) && isset($_SESSION['magic']))  {
***
} else {
    highlight_string(show_source(__FILE__));
}

Lệnh if chỉ chạy khi tồn tại giá trị $_COOKIE$_SESSION, nếu không tồn tại 2 giá trị này thì chạy lệnh else trả về source của file này…

Tiếp đến là vòng lặp nhỏ bên trong vòng lặp lớn

if ($_SESSION['magic'] === $_COOKIE['magic']) {
        echo "I love Cookie Han Hoan";
    } else if (sha1($_SESSION['magic']) == sha1($_COOKIE['magic'])) {
        echo $flag;
    }

Nếu 2 tham số $_COOKIE === $_SESSION thì trả về dòng chữ “I love Cookie Han Hoan”, còn nếu giá trị hash sha1($_SESSION) == sha1($_COOKIE) thì trả về flag => đây sẽ là nơi khai thác lỗi Type Juggling

Thử với 2 giá trị $_COOKIE$_SESSION bằng nhau (cùng kiểu và cùng giá trị)

Tiếp theo, dựa vào bảng Magic Hash SHA-1 và các lí thuyết đã trình bày bên trên, điền vào 2 giá trị và nhận về flag

Với bảng Magic Hash trên mình điền chuỗi nào cũng ok, riêng chuỗi CZbnUtm/wD+0 thì lại không trả về flag, bạn nào biết lí do không dùng được chuỗi đó trong bài này có thể comment xuống dưới giải ngố cho mình nhéeeeeeee :monkey: luv u guys

3 Likes