[DreamHack] phpreq Write-up

2024. 12. 26. 10:51보안/웹

728x90

문을 열고 step2로 가라고 한다.

Nickname과 Password를 입력하면 문이 열릴 것 같다.

// pw filtering
if (preg_match("/[a-zA-Z]/", $input_pw)) { //pw에 알파벳 필터링
	echo "alphabet in the pw :(";
}
else{
	$name = preg_replace("/nyang/i", "", $input_name); 
	//nyang을 대소문자 구분없이 제거(공백으로 치환)
  $pw = preg_replace("/\\d*\\@\\d{2,3}(31)+[^0-8\\"]\\!/", "d4y0r50ng", $input_pw);
  //일치하는 정규표현식 패턴이 나오면 d4y0r50ng로 치환
if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
//name이 dnyang0310, pw가 d4y0r50ng면 step2로 이동
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>';

정규 표현식으로 나와있다.

name부터보면 dnyang0310이어야 하는데 nyang이 나오면 공백으로 치환하여 제거해주고 있다.

이를 우회하려면 nyang에 nyang을 덮어씌우면 된다.

  • name
  • nynyangang0310

이렇게 쓰면 nyang이 제거되면서 name에는 nyang이 입력되게 된다.

pw를 보면

d4y0r50ng+1+13 이어야 하는데 영어를 필터링하고 있다.

"/\\d*\\@\\d{2,3}(31)+[^0-8\\"]\\!/"
  • \\d*
    • 숫자(\\d)가 0개 이상 나오는 부분
    • 예: "", "123", "45678"
  • \\@
    • 문자 "@" 그대로
    • \\를 붙여 특수문자로 인식하지 않고, 문자 "@"로 처리
  • \\d{2,3}
    • 숫자(\\d)가 2개 이상, 3개 이하 반복
    • 예: "12", "123"
  • (31)+
    • "31"이 1번 이상 반복되는 부분
    • 예: "31", "3131"
  • [^0-8\\"]
    • [^]대괄호 안에 없는 문자
    • 0-8과 "를 제외한 문자에 매칭.
    • 예: "9", "a", "@", "!"
  • \\!
    • 문자 "!" 그대로.
    • \\를 붙여 특수문자로 인식하지 않고 문자 "!"로 처리.

이 조건에 맞는 문자를 써주면 d4y0r50ng로 치환되어 영어를 필터링해도 pw를 알맞게 입력할 수 있다. 맞는 문자는

  • pw
  • @1231@!+1+13

이런식으로 써주면 우회하여 pw를 입력할 수 있다.

 

그럼 이렇게 문이 좀 열린다.

$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";
}

command 입력해서 하는 것 같은데 해보니까 ls, echo 이런 명령어들이 되는 것을 확인하였다.

flag파일에 flag가 있는데 명령어에 flag를 필터링하고 있다.

ls .. 를 해보니 dream디렉토리가 나오는 것도 확인하였다.

그렇다면 cat 명령어로 파일을 확인해주지만 명령어에 flag가 들어가지 않아야 한다.

  • pw
  • cat ../dream/*.txt

이런식으로 정규표현식을 사용하여 해당 디렉토리에 모든 txt파일을 확인할 수 있다. 그래서 flag를 포함하지 않고 flag의 내용을 확인할 수 있다.

'보안 > ' 카테고리의 다른 글

[DreamHack] ex-reg-ex Write-up  (0) 2024.12.26
[DreamHack] Flying chars Write-up  (0) 2024.12.26
[WebHacking.kr]Old-03 Write-up  (1) 2024.12.18
[WebHacking.kr]Old-01 Write-up  (1) 2024.12.17
[WebHacking.kr]Old-07 Write-up  (0) 2024.12.17