[WebSec] Level 10
Information Gathering
Challenge này thuộc về dạng lỗi Type Jugling. Các bạn có thể tham khảo challenge tương tự và các giải thích tại đây.
Để nói một cách ngắn gọn thì lỗi này xảy ra do trong source code sử dụng ==
để so sánh thay vì ===
.
Người ta gọi ==
là loose compare
và ===
là strict compare
.
Khác nhau ở 2 cách so sánh này là ==
thì nó sẽ convert về cùng kiểu giá trị để so sánh.
Ví dụ:
- “1” == 1 –> True
- “123a” == “123” –> True
- md5(0e91238) == md5(0) –> True
Còn so sánh ===
thì phải đúng 100% kiểu dữ liệu thì mới cho kết quả True:
Ví dụ:
- “1” === “1” –> True
- 1 ===1 —> True
- False === False –> True
Source code
Đoạn code trên kiểm tra nếu tồn tại 2 parameters là f
và hash
thì sẽ thực thi code bên trong.
Nhưng có 2 vấn đề cần chú ý là dòng 7 và dòng 10.
Dòng 7
: filename của parameter f
sẽ được nằm giữa 2 biến $flag
. Sau đó sẽ encrypt md5 chuỗi đó và sẽ cắt lấy 8 ký tự đầu tiên.
Dòng 10
: So sánh $hash
của dòng 7 và cái hash
của mình nhập vào.
Mục tiêu của mình sẽ đọc file flag.php
và cái hash
của mình phải so sánh ==
với $hash
.
Exploit
Để khai thác bài này sẽ có 2 cách, đều là brute force
cả.
Cách 1
Brute force
giá trị hash
(cách này không khả thi vì abcdefghijklmnopqrstuvwxyz0123456789
là 36 ký tự, chọn ngẫu nhiên 8 ký tự của 36 ký tự là 30260340
trường hợp cần thử).
Cách 2
Brute force
filename.
Ủa alo??? Filename là flag.php
mà đi brute force
chi cha nội =))
Nàiii, filename flag.php
cũng chính là ./flag.php
mà cũng chính là .//flag.php
hay là ./////flag.php
.
Khi đó, số lượng / (forward slash)
đủ lớn thì sẽ đem lại giá trị md5 hash
dưới dạng <number>e<alphabet numerals>
Ví dụ mình có 1 file test.php
.
Run file test.php
và .//////////test.php
vẫn ra kết quả như nhau.
Bắt intercept gửi vào intruder Burp Suite. Chọn payload là character blocks
với base string là /
.
Kết quả là 881 /
Và flag là:
Sau khi có flag, mình thử lại cách so sánh của code thử có đúng không?
1 |
|