phpreg
문제 설명
- Nickname과 Password 찾기
- system() 함수 이용
- ../dream/flag.txt 파일에 플래그 위치
문제 분석
서버에 접속하면 아래와 같은 step1, step2 화면을 볼 수 있다.
우선 개발자도구에는 쓸모있는 게 없는 것 같아서 ... 바로 다운로드 받은 파일을 열어 확인해준다.
index 말고 step2.php 파일을 먼저 열어 확인해본 결과...! 중요할 것 같은 코드를 가져와봤다.
// pw filtering
if (preg_match("/[a-zA-Z]/", $input_pw)) {
echo "alphabet in the pw :(";
}
else{
$name = preg_replace("/nyang/i", "", $input_name);
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';
$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
if ($cmd === "") {
echo '
<p><form method="post" action="/step2.php">
<input type="hidden" name="input1" value="'.$input_name.'">
<input type="hidden" name="input2" value="'.$input_pw.'">
<input type="text" placeholder="Command" name="cmd">
<input type="submit" value="제출"><br/><br/>
</form></p>
';
}
// cmd filtering
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}
else{
echo "<pre>--Output--\n";
system($cmd);
echo "</pre>";
}
}
else{
echo "Wrong nickname or pw";
}
}
}
이 코드를 그대로 적용해보았으나, 아래와 같은 오류 화면이 출력되면서 다음 단계로 넘어갈 수 없었다.
코드를 다시 잘 확인해보니 비밀번호에 필터링이 적용되어 있는 것을 확인할 수 있었다.
첫 번째 필터링을 확인해보도록 하자.
a-z까지 대소문자 포함하여 알파벳이 포함되어있을 경우, "alpabet in the pw :(" 라고 출력된다.
두 번째 필터링을 확인해보도록 하자.
preg_replace()
지정된 패턴을 찾아서 다른 패턴으로 바꿔주는 함수.
preg_replace() 함수를 이용하여 input_name에서 "nyang" 문자열을 공백으로 바꿔주고 있다.
input_pw에서 "/\d*\@\d{2,3}(31)+[^0-8\"]\!/" 문자열을 "d4y0r50ng" 로 바꿔주고 있다.
**
i가 붙는 경우는 대소문자를 구분하지 않는다는 뜻
**
그렇다면 name 필터링을 우회하기 위해서는 " dnynyangang0310 "을 입력하면 될 것 같다.
pw 필터링을 우회하는 건 더 복잡한 듯 하니 천천히 알아보도록 하자.
비밀번호는 d4y0r50ng+1+13" 이어야 하는데, "/\d*\@\d{2,3}(31)+[^0-8\"]\!/" 이 "d4y0r50ng" 을 의미하므로 이를 분석해보도록 하겠다.
\d* : 0~9 사이의 수 0번 이상 반복 ( '\d' : 0에서 9까지의 범위의 한 자리 숫자, '*' : 문자 또는 숫자가 0개 이상)
\@ : 문자 @
\d{2,3} : 0~9 사이의 수 2~3번 반복 ( '\d' : 0에서 9까지의 범위의 한 자리 숫자 , '{2,3}' : 앞에 작성한 표현을 2~3회 반복)
(31) : 숫자 31
[^0-8] : 0 - 8이 아닌 숫자
\! : 문자 !
모든 조건에 부합하는 값 1@12319! 에 나머지 +1+13을 합하여 "1@12319!+1+13"을 입력한다.
다음 단계 step2로 넘어간 것을 확인할 수 있다.
우선 코드를 확인해보면 이와 같은데...
preg_match('/대조 할 문자/','입력한 문자', $matches);
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾아내는 함수
**
i가 붙는 경우는 대소문자를 구분하지 않는다는 뜻
**
system()
php에서 운영체제 명령어를 실행시킬 수 있는 함수
이제 문제에서 주어진 힌트를 적용하여 해결하면 될 듯 하다.system() 함수를 보니 cmd를 flag로 필터링하고 있다. cmd 명령어를 활용하여 플래그를 찾아면 될 것 같다...
문제에서 플래그는 ../dream/flag.txt에 위치하고 있다 하였으므로, cmd 창에서 문서를 검색하는 명령어인 'cat'을 이용하고 flag에 대한 필터링을 우회하기 위해 'cat ../dream/f?ag.txt' 를 입력하였다.
플래그 획득!
번외로.... more을 이용해서 풀어보았는데 똑같이 플래그를 획득할 수 있었다. ls -al을 통해 풀면 아래와 같이 파일 정보만 확인할 수 있었다.
'SWLUG > CTF' 카테고리의 다른 글
[CTF/Dreamhack] pathtraversal (0) | 2024.05.11 |
---|---|
[CTF/Dreamhack] baby-union (0) | 2024.05.06 |
[CTF/Dreamhack] php7cm4re & Flying Chars (0) | 2024.04.27 |
[CTF/Dreamhack] devtools-sources & Carve Party (1) | 2024.04.27 |
[CTF/Dreamhack] cookie & session (2) | 2024.04.27 |