[WebSec] Level 28

https://websec.fr/level28/index.php

Information Gathering

Thôi, bài này mình không test kiểu BlackBox nữa… Vì test có ra lỗi đâu =))

Vào đọc source code thôi. Các challenge CTF thường thì họ đều cho mình source để đọc.

Các bạn có thể theo dõi đoạn code bên dưới.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
if(isset($_POST['submit'])) {
if ($_FILES['flag_file']['size'] > 4096) {
die('Your file is too heavy.');
}
$filename = './tmp/' . md5($_SERVER['REMOTE_ADDR']) . '.php';

$fp = fopen($_FILES['flag_file']['tmp_name'], 'r');
$flagfilecontent = fread($fp, filesize($_FILES['flag_file']['tmp_name']));
@fclose($fp);

file_put_contents($filename, $flagfilecontent);
if (md5_file($filename) === md5_file('flag.php') && $_POST['checksum'] == crc32($_POST['checksum'])) {
include($filename); // it contains the `$flag` variable
} else {
$flag = "Nope, $filename is not the right file, sorry.";
sleep(1); // Deter bruteforce
}

unlink($filename);
}
?>

------------------------------------------------------------------------------------------

<?php if (isset($flag)){ echo $flag; } else { echo 'Can you guess it?'; }?>

Phân tích về source code:

  • Từ dòng 1 - 5: Hàm if() kiểm tra mình đã submit hay không? Nếu có thì file upload của mình lên có nặng quá 4096 kb hay không? Nếu nặng quá 4096 kb thì sẽ báo lỗi là Your file is too heavy.die chương trình.

  • Dòng 6: $file_name sẽ được gán bằng giá trị như trên source code, với md5($_SERVER['REMOTE_ADDR']) sẽ là giá trị IP mình đang truy cập được encrypt md5.

    • ./tmp/ae018b12db79741c0b9026378e0be6d5.php
      nslookup ip
  • Dòng 12: nội dung trong file được upload sẽ được gán cho $file_name.

  • Dòng 13: Trong hàm if() kiểm tra md5($file_upload) phải trùng với nội dung trong file flag md5(flag.php). Kết hợp việc việc loose compare giữa checksum mình nhập vào và crc32('checksum').

  • Để bypass qua được loose compare của checksum thì mình sẽ dùng array() để so sánh.

nslookup ip


Exploit

Upload file flag.php với nội dung như sau:

1
2
#FILE flag.php
<?php show_source("flag.php"); ?>

File flag.php

Để ý thấy khi upload file lên, file sẽ được gán bằng tmp_name ở server. Và chỉ được tồn tại sau 1 giây (dòng 17 sleep(1)). Nên không thể nào truy cập vào file mới gọi được.

Không thể truy cập file flag.php

Để có thể truy cập được file flag.php vừa upload lên, mình sẽ cho chạy 150 reuqests trong intruder Burp Suite, với thời gian giữa các request là 900 mili giây.

Request in Intruder
Repeat 150 times
900 miliseconds between requests

Sau khi Start, mình upload lại file flag.php và có thể truy cập được file. Nhưng không hiện ra flag :(

Nothing

Stuffing …


[WebSec] Level 28
https://dovankha.github.io/2022/08/04/lv28/
Author
Khado
Posted on
August 4, 2022
Licensed under