phpreg | Write-Up

0xqury·2025년 4월 28일

WebWriteups

목록 보기
1/8

1. 문제



2. 풀이

문제에서 주어진 PHP 코드를 분석해보면,
Nickname과 Password를 preg_replace()를 통해 가공한 뒤 특정 문자열과 일치하는지 비교한다.

$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")

Nickname 분석

  • 입력받은 $input_name에서 "nyang" 문자열을 대소문자 구분 없이 제거한다.
  • 제거 후 결과가 "dnyang0310"과 같아야 한다.
  • 따라서 Nickname은 "dnnyangyang0310" 이런식으로 입력하면 된다.

Password 분석

  • 입력받은 $input_pw에서 특정 정규표현식 패턴이 "d4y0r50ng"으로 치환된다.
  • 이후 남은 문자열이 "d4y0r50ng+1+13"과 같아야 한다.

정규표현식 분석 결과, Password는 아래 패턴을 만족해야 한다:

  • [숫자 0개 이상]@[2~3자리 숫자][31반복][9][!] 패턴을 먼저 매칭시킨다.
  • 그 뒤에 +1+13이 붙어야 한다.

따라서 입력할 Password 예시는 다음과 같다:

0@993131319!+1+13
  • 0@99 → 숫자@2자리숫자
  • 313131 → (31)+
  • 9! → 9와 느낌표
  • +1+13 → 그대로 남기기

이제 Nickname과 Password를 올바르게 입력하여 Step 2로 넘어갈 수 있다.

Step 2: system() 이용

Step 2로 넘어가면 명령어를 입력해 실행할 수 있다.
하지만 명령어 안에 flag라는 단어가 들어가면 Error가 발생한다.

else if (preg_match("/flag/i", $cmd)) {
    echo "<pre>Error!</pre>";
}

따라서 cat ../dream/flag.txt처럼 직접 입력할 수 없다.


Step 3: 필터 우회 - 와일드카드 사용

Linux에서는 *(와일드카드)를 사용해 파일 이름을 대체할 수 있다.
따라서 "flag"라는 글자를 직접 입력하지 않고, 경로를 패턴으로 우회할 수 있다.

실제 사용한 명령어 예시:

cat ../dream/fla*
  • fla*flag.txt를 매칭시킨다.
  • flag라는 문자열을 직접 쓰지 않았기 때문에 필터를 통과한다.
  • 정상적으로 플래그를 읽을 수 있다.

3. 정리 및 느낀점

이 문제는 PHP의 preg_replace, preg_match를 통한 입력 가공과 필터링을 정확히 이해하고,
그 위에서 Linux 명령어의 유연성(와일드카드 사용)을 활용해 우회하는 사고를 연습할 수 있었다.

특히 "flag" 문자열이 금지되어 있을 때, 직접적인 문자열 입력 대신 쉘 특성(패턴 매칭, 와일드카드)를 이용해서 문제를 우회하는 발상이 매우 중요했다.

실제 실무나 해킹 실전에서도 필터링은 항상 뚫린다는 관점에서 다양한 우회법을 빠르게 떠올릴 수 있어야 한다는 교훈을 얻었다.


profile
지망생

0개의 댓글