본문 바로가기

DreamHack

PHPreg

 

https://dreamhack.io/wargame/challenges/873

 

phpreg

Description php로 작성된 페이지입니다. 알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다. Step 2에서 system() 함수를 이용하여 플래그를 획득하세요. 플래그는 ../dream/flag.txt에 위치합니

dreamhack.io

 

 

 

결론 먼저 얘기하자면, 정규표현식 문제이다.

 

 

 

step1의 이름(input_name)에서는 정규표현식을 우회해야 하고, 비밀번호(input_pw)에서는 정규식에 부합하는 문자열을 써넣어야 한다.

 

step2에서는 " flag"문자열을 탐지하는 정규 표현식을 우회해야 한다.

 

 

 

 

 

우선 step1 부터 살펴보자.

 

 

 

 

1) "//pw filtering"이라고 쓰인 곳에서는 사용자가 입력한 비밀번호에 대/소문자 알파벳이 하나라도 들어있는 지 체크하고, 만약 있다면 "alphabet in the pw :(" 라는 문자열을 표시한다.

 

 

이를 통해, 비밀번호에는 알파벳이 하나도 없어야 한다는 점을 알 수 있다.

 

 

 

 

2) "$name" : 사용자가 입력한 name에서 "nyang" 라는 문자열을 빈 문자열("")로 대체한다. 하지만 밑에 보면 name이 "dnyang0310"이어야 한다.

 

그말인 즉슨 "nyang"를 제거한 다음에도, "nyang"이 들어있어야 한다는 얘기이다.

 

 

이를 위해 "nyang"를 2번 넣되, "nyang" 사이에 한번 더 "nyang"을 넣어주면 된다.

 

 

예를 들어 name이 "dnnyangyang0310"을 살펴보자.

 

가운데에 "nyang"이 들어있는 것을 알 수 있고, 이는 정규표현식으로 필터링하는 부분인 preg_replace에서 제거된다. 

 

 

하지만 그 다음의 name은 "dnyang0310"이 되어, 정규표현식으로 점검하는 부분을 우회할 수 있다.

 

 

 

 

3) "$pw": 정규표현식에 맞는 문자열을 "d4y0r50ng"로 변경한다.

 

이를 위해, 우리는 정규 표현식을 충족시키는 문자열을 찾아야 한다.

 

주어진 정규 표현식을 부분 별로 살펴보자

(사용한 툴: regex101)

 

 

\d* \@ \d{2, 3} (31)+ [^0-8] \!
0~9사이의 숫자를
1회 이상 반복
문자 @ 0~9사이의 숫자를
2회 이상,
3회 이하 반복
문자 31이
1회 이상 반복
0~8 사이의 숫자가
없음
문자 !

 

 

위의 조건에 맞춰서 문자열을 만들어보면, "1@34531319!" 처럼 만들 수 있다.

 

하지만 pw의 뒤쪽에 "+1+13"이 붙어있는 지도 체크하므로, 위에서 만든 문자열의 맨 뒤에 "+1+13"를 붙여주면 된다.

 

 

실제로 "1@34531319!+1+13"를 입력한 경우, 어떻게 진행되는 지 살펴보자.

 

주어진 pw에서 정규 표현식을 만족시키는 부분인 "1@34531319!"는 "d4y0r50ng"로 변경된다.

 

궁극적으로 pw는 "d4y0r50ng+1+13"으로 변하게 된다.

 

 

id, pw를 입력한 모습

 

 

step2로 넘어온 모습

 

 

 

 

마지막으로 step2를 살펴보자.

 

Command창에 ls를 써넣으면 아래와 같이 명령이 실행되는 것을 알 수 있다.

 

 

 

 

"../dream/flag.txt"라는 명령어를 써넣으면 flag를 출력해줄 것 같은데, 정규표현식으로 "flag"라는 단어를 필터링한다.

 

 

 

 

그렇다면, "flag"라는 문자열을 전달할 때 2개의 변수에 나눠담은 후 전달해보자.

 

이 방식이면 "flag"가 있는 지 검사하는 코드에 안걸리고도, "flag"를 보낼 수 있을 것이다.

 

 

a = "f";
b = "lag";
cat "../dream/$a$b.txt"

// 가독성을 위해 3줄에 나눠썼습니다

 

 

위의 코드를 한줄로 만들어서 써넣어보면, flag를 얻을 수 있다!

 

코드를 써넣은 모습

 

flag가 나온 모습

 

 

이번엔 정규식을 이용하는 문제라 php에 대한 이해 없이도 풀 수 있었다.

 

하지만 php를 이용해서 문제를 풀어야 할 경우를 위해, php를 공부해야 할 것 같다

'DreamHack' 카테고리의 다른 글

XSS-1  (0) 2024.02.05
cookie  (0) 2024.01.30
Switching Command  (1) 2024.01.25
simple_sqli_chatgpt  (0) 2023.09.19
DreamHack) ex-reg-ex  (0) 2023.09.14