[WebSec] Level 17
Information Gathering
Như thường lệ, bước đầu tiên chúng ta ngó xem qua phần giao diện, có chỗ input và button Submit.
Nó yêu cầu mình đoán flag, nên thử nhập đại gì đó, và xem response trả về thế nào. Không có gì đáng chú ý hơn link tới source code.
Challenge cho sẵn luôn source code, chúng qua và để ý đến 2 phần code PHP.
1 |
|
Đoạn code trên chỉ là hàm để delay trong quá trình thực thi chương trình. Khi nào gọi lại hàm sleep_rand()
thì đoạn xử lí đó sẽ delay.
Thời gian delay lâu hay mau phụ thuộc vào hàm random ở dòng 8. Hàm openssl_random_pseudo_bytes()
sẽ tạo ra random string pseudo_bytes từ param $bytes ở dạng binary.
Sau đó hàm bin2hex()
sẽ convert binary sang dạng hex. Tiếp theo hàm hexdec()
sẽ convert hex sang dạng decemal.
Đại khái là hàm trên cũng không ảnh hương tới challenge nhiều, vì hàm usleep()
sẽ delay chương trình với param là micro second. Ví dụ usleep(2000000)
thì sẽ delay 2s.
Tiếp đến source code còn lại:
1 |
|
Quan sát thấy thì đoạn code phía trên sẽ so sánh giá trị của flag
khi input từ user vào và giá trị $flag
đã assign trong chương trình.
Nhưng để so sánh thì dùng hàm strcasecmp()
, điều đáng nói hơn ở đây là dấu chấm thang ở phía trước hàm.
Hàm
strcasecmp($str1, $str2)
sẽ nhận vào 2 string để so sánh. Kết quả trả về là:
- > 0: Nếu như $str1 > $str2.
- < 0: Nếu như $str1 < $str2.
- = 0: Nếu như $str1 = $str2.
Dấu chấm thang ở phía trước có nghĩa là $str1
và $str2
bằng nhau.
1 |
|
Hai dòng code trên là tương tự nhau về mặt chức năng và bản chất.
- So sánh
==
thì sẽ so sánh giá trị, nếu không cùng kiểu dữ liệu thì sẽ ép về cùng kiểu dữ liệu.- So sánh
===
thì sẽ so sánh cả giá trị và kiểu dữ liệu cùng lúc.
Khi so sánh ==
thì lại để ý tới lỗi Type Jugling và tham khảo hai hình bên dưới.
`
Exploit
Khi mà so sánh trong hàm strcasecpm()
sẽ cho ra kết quả là False
. Tiếp theo False
so với 0
thì sẽ là True
.
Từ đó, sẽ tìm ra được flag.
Payload: flag[]=1
Kết quả: