[Dreamhack 드림핵] PHPreg WriteUp

2024. 1. 28. 13:41Hacking/WebHacking Wargame Writeup

문제 링크

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

 

phpreg

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

dreamhack.io

 

문제

 

풀이

주어진 서버에 처음 접속하면 이런 화면이 나온다. 이런 화면으로는 할 수 있는게 없으니까 문제에서 주어진 PHP 코드를 살펴보도록 한다.

마지막 부분의 코드를 참고하면, 

name이 dnyang0310이고, PW가 d4y0r50ng+1+13이면 step2로 이동할 수 있다고 되어있다는 것을 확인할 수 있다. 

그 윗부분의 else문을 확인해보면, name의 nyang부분이 필터링 되어있고, pw문자열이 필터링 되어있음을 파악할 수 있다.

따라서 name에서 필터링된 nyang부분을 삽입해주어 name에는 

dnnyangnyang0310

을 삽입해주고, 

PW에는 정규표현식을 통해 필터링된 값을 우회하면 되는데, 위에서 사용된 필터링은 아래와 같다. 

1. \d*: 0개 이상의 숫자

2. \@: 문자 "@"

3. \d{2,3}: 2개 또는 3개의 숫자

4. (31)+: 31이 1회 이상 반복

5. [^0-8]: 0과 8 사이의 숫자를 제외한 문자

6. \!: 문자 "!"

1@123319!+1+13

를 넣어준다. (0개 이상의 숫자 그리고 2개 또는 3개의 숫자라고 했으므로 1@123이 아니어도 다른 문자를 넣어도 통과할 것 같다.) 

위의 PHP 코드를 해석해야 STEP2를 해결할 수 있는데, command 필터링이 되었다는 것을 이 코드 주석에서 확인할 수 있다. 따라서, 플래그 명령어를 우회해서 작성해주어야 하는데 

cat ../dream/flag.txt

cat ../dream/f*.txt

와 같이 우회해서 작성한 후 커맨드 창에 입력을 해주면 플래그 값이 도출된다.

플래그 값