프롤로그
하루 1 드림핵...Level2 정도 풀 실력이 되지 않을까? 하고 찾아봤는데 어림도 없더라... level1 부터 다시 차근차근 해보면서 몇 시간씩 투자해야 겨우 풀 수 있을 것 같다...
일단 base64란 무엇인가?
2024.11.16 - [bandit] - [2024/bandit] bandit level10 -> level11 Write-up
[2024/bandit] bandit level10 -> level11 Write-up
프롤로그bandit 문제풀이저번 비밀번호는 FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey 이다. 문제다음 레벨로 가는 비밀번호는 data.txt 파일 안에 저장되어있는데, 그 파일은 base64 인코딩된 데이터가 포함되어있다
taesan-smj.tistory.com
여기서 한 번 언급했었는데
바이너리 데이터를 텍스트 형식으로 인코딩하는 방법 중 하나.
주로 이진 데이터를 텍스트로 변환하거나, 아니면 네트워크 전송 및 데이터 저장을 할 때 사용된다.
왜 base64냐? 아스키 코드 중에서 [a-z], [A-Z], [0-9] , +, /까지 총 26+26+10+2= 64개, 즉 기본적인 것만 사용한다고 해서 base64라고 불린다.
그래서 base64 인코딩이라고 한다는 것은, 원래 바이너리 데이터를 Base64 형태로 변환한다는 의미이고,
base64디코딩을 한다는 것은, 인코딩된 데이터를 원래 바이너리데이터로 변환한다는 얘기이다
저거를 활용한 문제라는 것을 의미한다.
문제
https://dreamhack.io/wargame/challenges/1785?writeup_page=1
Base64 based
Description Read flag.php to get the flag.
dreamhack.io
드림핵 level 1문제
코드 및 분석
총 3개의 파일이 존재한다.
1. flag.php
<?php
if (!defined('ALLOW_INCLUDE')) {
http_response_code(403);
exit('Direct access is not allowed.');
} else {
$file = file_get_contents('/flag');
echo trim($file);
}
?>
flag.php 에서
만약에 ALLOW_INCLUDE 가 FALSE 라면, 접근 허용이 되지 않는다. 저거 코드가 노빠구로 URL로 본인 파일 접근 자체를 막는 파일이다.
아무튼 저게 true라면, /flag 파일의 내용을 읽고 보여준다. 저기서 플래그 파일을 얻을 수 있구나
2. hello.php
<?php echo 'This is Base64 world'?>
이거 하나 출력해주는 파일이다.
3. index.php
<body>
<div class="container">
<h1>File Content Viewer</h1>
<?php
define('ALLOW_INCLUDE', true);
if (isset($_GET['file'])) {
$encodedFileName = $_GET['file'];
if (stripos($encodedFileName, "Li4v") !== false){
echo "<p class='error'>Error: Not allowed ../.</p>";
exit(0);
}
if ((stripos($encodedFileName, "ZmxhZ") !== false) || (stripos($encodedFileName, "aHA=") !== false)){
echo "<p class='error'>Error: Not allowed flag.</p>";
exit(0);
}
$decodedFileName = base64_decode($encodedFileName);
$filePath = __DIR__ . DIRECTORY_SEPARATOR . $decodedFileName;
if ($decodedFileName && file_exists($filePath) && strpos(realpath($filePath),__DIR__) == 0) {
echo "<p>Including file: <strong>$decodedFileName</strong></p>";
echo "<div>";
require_once($decodedFileName);
echo "</div>";
} else {
echo "<p class='error'>Error: Invalid file or file does not exist.</p>";
}
} else {
echo "<p class='error'>No file parameter provided.</p>";
}
?>
</div>
</body>
GET요청일 떄 file 을 파라미터로 입력받는다. 파일명을 입력받는 거 같은데 만약에 존재하지 않으면 맨 밑의 else 문으로 가서 No file parameter provided 가 실행이 된다.
파일 명이 입력이 될 때, base64로 디코딩을 처리해주기 때문에, 파일명을 base64로 인코딩 한 것을 넣어주어야한다.
다만, 여러 조건을 거쳐야하는데, 첫번째 조건으로
내부에 Li4v 라는 문자가 있으면 허용되지 않는다.
../는 허용되지 않는다는 것이다.
다음 조건을 보면 Zmxhz, aHa= 를 허용하지 않는다고 한다. 문자열 내부에 저게 들어가있으면 탈락이다.
fla 가 허용되지 않는다.
그리고 aHA=도 막는데
php의 hp 저격이다.
즉 fla, ../ 가 없게 flag.php 를 읽어오면 되는 것이다.
풀이전략
문제를 풀기 위해서는 base64로 인코딩 하기 전에 fla, ../ 단어가 없에 인코딩을 하면 된다.
base64는 블록단위로 계산을 한다.
그래서 블록 크기에 맞춰 주기 위해서 맨 뒤에 = 가 붙었다는 것은 패딩이 포함된다는 의미이다.
fla 를 막았다면 flag 까지 막혀있을 것.
그런데 블록의 단위를 조금 다르게 만들어서
맨 앞에 ./flag 를 했다면?
값이 확 바뀌어버린다.
저렇게 ./flag.php 를 base64 인코딩해서 넘겨주면 flag 가 나올 것이다.
풀이과정
먼저 flag.php 를 base64 인코딩을 한다.
Li9mbGFnLnBocA==
이걸 이제
http://host1.dreamhack.games:23948/?file=Li9mbGFnLnBocA==
이렇게 넘겨준다면?
flag 값이 나왔다.
FLAG
플래그 값은 DH{We1c0me_t0_Ba5e64:FR1FuF3pvGwLjC1/B+nhJA==} 이다.
다른 풀이
flag.php 에 접근하기 위한 여러 추가 방법들이 존재한다.
flag.php 를 base64로 인코딩한 ZmxhZy5waHA= 가 있다고 하자.
이거 무조건 걸릴텐데
중간중간에 공백 또는 + 로 연결시켜주면 된다.
Zmxh+Zy5wa+HA= 이런식으로 아니면
Z m x h Z y 5 w a H A = 이런식으로
다른 곳의 경우에는
Li8uLi8uLy4uLy4uLy4uLy4uLy4uLy4uL3Zhci93d3cvaHRtbC9mbGFnLnBocA==
이렇게 넣은 경우도 있었다.
https://dreamhack.io/wargame/writeups/25624
로그인 | Dreamhack
dreamhack.io
에필로그
어렵다
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/워게임] BypassIF - WriteUp (0) | 2025.02.16 |
---|---|
[드림핵/워게임] baby-jwt - WriteUp (1) | 2025.02.15 |
[드림핵/워게임] File Vulnerability Advanced for linux - WriteUp (0) | 2025.02.13 |
[webhacking.kr] old-26 문제 풀이 (2) | 2024.10.01 |
[드림핵/워게임] [wargame.kr] tmitter (웹 해킹) (1) | 2024.09.28 |