step 1에서 id, pw를 입력해야 한다.
주어진 파일 중 step2.php를 보면 어떤 id,pw를 입력해야 step2로 넘어갈 수 있는지 알 수 있다.
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>';
id는 dnyang0310, pw는 d4y0r50ng+1+13를 만족하면 Step 2로 간다.
그러나, preg_replace에서 필터링이 존재한다.
$name = preg_replace("/nyang/i", "", $input_name);
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
name에 nyang이 있으면 없앤다. 그러나 정확히 nyang인 경우에만 없애므로 이 부분만 우회하면 된다.
즉, 아래와 같이 nyang을 넣고 양 옆에 nyang을 나눠놓으면 된다.
dnnyangyang0310
패스워드의 regex는 더 복잡하다.
\d* 0~9 숫자 0회 이상 반복
\@ @이 옴
\d{2,3}(31) 0~9가 2,3회 반복 후 31이 옴
[^0-8] 0-8 이외 문자가 옴
! !이 옴
위 조건을 모두 만족하는 경우 d4y0r50ng으로 대체된다.
즉, 위 조건을 만족시키는 문자를 입력한 후, +1+13을 주면 d4y0r50ng+1+13을 만들 수 있다.
9@99319!+1+13
필자의 경우 위와 같이 패스워드를 구성했다.
// cmd filtering
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}
else{
echo "<pre>--Output--\n";
system($cmd);
echo "</pre>";
}
Step 2에서는 cmd를 입력받는데, flag가 매칭되면 에러가 발생하고, 그렇지 않으면 system으로 명령어를 실행한다.
즉, command injection이 가능하다.
preg_replace가 없기 때문에 id를 우회한 것과 같은 방법은 사용하지 못한다.
이때 flag를 주지 못해도, *lag, f*lag와 같이 패턴에 매칭되는 게 있으면 플래그 파일을 출력할 수 있다.
위와 같은 원리이다.
따라서 위 사진과 같이 명령어를 주면 플래그를 획득할 수 있다.
Dreamhack CTF Season 7 Round #7 (🚩Div1) Pybrid write up (0) | 2025.04.07 |
---|---|
[Dreamhack] baby-ai (0) | 2025.04.01 |
[Dreamhack] csrf-1 (0) | 2022.12.10 |
[Dreamhack] file-download-1 (1) | 2022.11.24 |
[Dreamhack] proxy-1 (0) | 2022.01.04 |