PHPreg

Analysis
인덱스 페이지 접근 시 입력 폼에 임의의 값을 입력한 후 제출 버튼을 누르면,
패스워드에는 알파벳을 입력할 수 없다는 메시지가 출력됩니다.

패스워드에 알파벳을 제외하고 숫자만 입력하면 ID/PW 가 잘못됐다는 메시지가 출력됩니다.

응답(출력 텍스트) 값만으로는 분석이 어려우므로, 주어진 소스파일을 통해 분석을 이어나가겠습니다.
주목해야 할 부분은 2번 박스인데요.
1번째로, 정규식을 통해 ID, PW 값을 필터링하고 있습니다.
- (1) 대소문자를 구분하지 않고 아이디에 “nyang” 값이 온 경우에 이를 공백으로 치환합니다.
- (2) 패스워드 필터링 로직은 다음과 같습니다.
- (2-1)
\d*: 숫자 여러개 - (2-2)
@: @ 문자 1개 - (2-3)
\d{2,3}: 숫자 2~3개 - (2-4)
(31)+: 31 조합 1개 이상 (EX; 31, 3131, 313131, …) - (2-5)
[^0-8\"]: 0~8, \ 문자를 제외한 나머지 문자 - (2-6)
\!: ! 문자 1개- 예를 들어, 123@45319! 라는 값이 입력되면 d4y0r50ng 로 치환됩니다.
- (2-1)
(3) 2번 박스의 마지막 조건문을 살펴보면 /step2.php 경로로 접근하기 위한 조건을 확인할 수 있는데요.
정규식 필터링 규칙에 의해 입력한 값 중 일부가 임의의 값으로 치환되므로 이 규칙을 활용하면 됩니다.

조건을 만족하기 위해서는 아이디/패스워드에 각각 아래와 같은 값을 입력하면 됩니다.
$name : dnyannyangg0310 - - - > preg_replace(…) - - - > dnyang0310
$pw : 123@123319!+1+13 - - - > preg_replace(…) - - - > d4y0r50ng+1+13

문제 DESCRIPTION을 살펴보면 플래그는 ../dream/flag.txt 경로에 존재한다고 되어있는데요.
현재 step2.php 소스에서 $cmd 파라미터에 flag 문자열이 사용되는지 검증하고 있습니다.
때문에, cat ../dream/flag.txt 와 같이 flag 문자열을 사용해서 직접 플래그를 확인하긴 어렵습니다.

약간의 꼼수를 써서 문자열 검증을 우회하는 과정이 필요한데요.
아래와 같이 /dream 경로의 전체 텍스트 파일을 출력하면 쉽게 우회가 가능합니다.

- 홈페이지에 접속하면 아래와 같이 먼지가 둥둥~ 떠다닙니다.
- `http://host8.dreamhack.games:21059/` 접근 시 자바스크립트 코드를 살펴보면 다음과 같다. - 1번 박스의 반복문에서 anim(...) 함수가 20번 호출된다. - 호출된 anim(...) 함수 내부에서는 move() 함수를 호출한다. - move() 함수 내부에서는 임의 랜덤 값`Math.randm()*60 + 20`
🐛.. 🐛.. 🐛..