반응형
문제설명
Topic: LFI
분야: Web
난이도: Medium
Hero of Justice, Alpaca Rangers!
코드분석
<?php
$publicDir = realpath(__DIR__) ?: __DIR__;
$targetPath = $_GET['img'] ?? '';
$errorMessage = '';
$dataUri = '';
if ($targetPath !== '') {
if (str_starts_with($targetPath, '/') || str_starts_with($targetPath, '\\') || str_contains($targetPath, '..')) {
$errorMessage = 'Invalid path.';
} else {
$contents = @file_get_contents($targetPath);
if ($contents === false) {
$errorMessage = 'Not found.';
} else {
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($contents) ?: 'application/octet-stream';
$dataUri = 'data:' . $mimeType . ';base64,' . base64_encode($contents);
}
}
}
?>
- URL의 ?img= ... 값을 가져옴 없으면 공백
- img의 값이 있을 때 수행
- / 또는 \\로 시작하면 차단, ..이 포함되어도 차단 → 차단할때 에러메시지 출력
- 사용자 입력 경로의 파일 내용을 읽음 @는 에러메시지를 숨김
- 만약 파일 읽기 실패 시 not found 출력
- 파일 내용을 base64로 인코딩해서 data: URL 문자열로 만듦
결과적으로 브라우저는 서버 파일 내용을 <img src="data: ...">로 렌더링
<?php if ($errorMessage !== ''): ?>
<p class="error"><?= htmlspecialchars($errorMessage, ENT_QUOTES | ENT_HTML5) ?></p>
<?php endif; ?>
<?php if ($dataUri !== ''): ?>
<figure>
<img src="<?= $dataUri ?>" alt="<?= htmlspecialchars($targetPath, ENT_QUOTES | ENT_HTML5) ?>" />
<figcaption><?= htmlspecialchars($targetPath, ENT_QUOTES | ENT_HTML5) ?></figcaption>
</figure>
<?php endif; ?>
- htmlspecialchars()로 XSS 차단
- 데이터가 있으면 <img src ="<?= $dataUri ?>">로 화면에 표시
취약점분석
- /, \\, .. 만 막음
- 사용자가 입력한 파일 경로를 그대로 읽음
- stream wrapper 기반 우회 가능성
익스플로잇
먼저 wrapper가 가능한지 테스트를 하기 위해
?img=data://text/plain,hello
URL에 다음과 같은 코드를 삽입해 준다.

정상적으로 작동하는 것을 확인
?img=php://filter/convert.base64-encode/resource=/flag.txt
- /flag.txt의 내용을 base64로 인코딩해서 가져오라는 뜻
다음과 같은 페이로드를 작성해주면

인코딩 된 상태로 파일내용을 가져오는 것을 알 수 있음
총인코딩을 2번 거쳤으므로 디코딩을 2번 해주면

반응형
'Alpacahack' 카테고리의 다른 글
| Alert my Flag (0) | 2026.03.05 |
|---|---|
| Rock Paper Scissors Lizard Spock (0) | 2026.03.03 |
| omikuji (0) | 2026.02.23 |
| Emojify (0) | 2026.02.20 |
| Log Viewer (0) | 2026.02.20 |