https://dreamhack.io/wargame/challenges/873
문제
php로 작성된 페이지입니다.
알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다.
Step 2에서 system() 함수를 이용하여 플래그를 획득하세요.
플래그는 ../dream/flag.txt에 위치합니다.
플래그의 형식은 DH{...} 입니다.
풀이
1. 서버를 생성한 후에 웹해킹 링크로 들어간다.
2. 문제 파일을 받아 index.php 와 step2.php 를 확인한다. index.php를 보면 크게 얻어갈 단서는 없는 듯 하고 step2.php에서 본격적인 단서 들이 나온다
<?php
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_name = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
// 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>';
유심히 봐야할 코드만 추려서 올렸다.
- 단서1 : pw filtering이 걸려있다 "/[a-zA-z]/" 알파벳을 pw로 적을 시 alphabet in the pw :( 라는 문구가 떨어진다
- 단서2 : prge_replace 로 인해 "/nyang/i" "" nyang 이라는 문자열이 인식이 되면 빈 공백으로 replace 되는 코드가 보인다
- 단서3 : 정규 표현식 ("/\d*\@\d{2,3}(31)+[^0-8\"]\!/"을 입력하게 되면 -> "d4y0r50ng" 이런 문자열로 replace되는 점
- 단서4 : name은 dnyang0310 이 되어야하고 pw는d4y0r50ng+1+13 이런 형식으로 되어야 step2로 넘어갈 수 있다
이 단서들을 활용하여 문제를 풀면된다 단서4 에서 d4y0r50ng+1+13 이것은 큰 따옴표에 묵여있기 때문에 113 이 아니라 "+1+13" 그대로 입력을 해야한다.
3. 단서를 이용해서 해석한 후에 문제를 풀어보자
- 우선 name에 대한 부분이다
- /i => 대소문자를 무시하는 플래그
- nyang를 입력하면 공백("")으로 인식하니 출력이 정답에 맞게 적어주면 된다
- dnyangnyang0310 -> replace 되면 d0310 이 된다
- dnynyangyang0310 -> replace 되면 dnyang0310 정답이다!
- pw 정규 표현식 해석
- \d* => 0개 이상의 숫자
- \@ => @
- \d{2,3}(31) => 2~3자리 숫자 후에 31이 오면 된다
- +[^0-8\"] => ^표시는 뒤에 주어진 값을 제외하고 라는 뜻이므로 0~8 그리고 " 를 제외한 나머지 문자
- \! => 마지막은 !로 나와야한다
- 이렇게 정규식에 맞게 적는다면 보이진 않지만 d4y0r50ng 로 replace 될것이고 마지막으로 뒤에 +1+13을 적어주면 된다
- 123@31319!+1+13
- 123@54319!+1+13
- 여러 가지로 pw를 테스트 해보았다.
4. step2
step2에서는 flag를 찾으면 된다 step2.php 코드를 보면 cmd filtering도 되어있다.
// cmd filtering
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}
else{
echo "<pre>--Output--\n";
system($cmd);
echo "</pre>";
}
cmd filtering은 flag 라는 문자를 대소문자 구분 없이 사용한다면 Error! 라는 출력 값을 우리에게 선사한다
하지만 이미 문제에서 flag 경로를 우리에게 알려주었다
../dream/flag.txt 이 경로에 있다고 한다.
cat ../dream/f?ag.txt 또는 cat ../dream/*.txt 를 사용하여 직접적인 flag를 적지 않고도 다양한 방법으로 flag를 획득할 수 있다
DH{ad866c64dabaf30136e22d3de2980d24c4da617b9d706f81d10a1bc97d0ab6f6}
flag 획득!!
'Dreamhack' 카테고리의 다른 글
[Dreamhack] session-basic Write-Up (0) | 2024.03.16 |
---|---|
[Dreamhack] cookie Write-Up (1) | 2024.03.16 |
[Dreamhack] ex-req-ex Write-Up (2) | 2024.03.15 |
[Dreamhack] blue-whale Write-Up (3) | 2024.03.15 |
[Dreamhack] baby-linux Write-Up (1) | 2024.03.14 |