# 문제링크 : https://dreamhack.io/wargame/challenges/873
phpreg
Description php로 작성된 페이지입니다. 알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다. Step 2에서 system() 함수를 이용하여 플래그를 획득하세요. 플래그는 ../dream/flag.txt에 위치합니
dreamhack.io
문제 파일
웹페이지
닉네임과 패스워드를 획득하려면 소스코드를 봐야할 듯?
index.php 파일을 메모장으로 열어보았다.
음... 모르겠다. 닉네임과 비번 관련한 부분이 없다. step2.php를 보자.
step2.php에는 관련 부분이 있는 것 같다.
이 부분을 살펴보면 name이 dnyang0310이고 pw가 d4y0r50ng+1+13면 스텝 2로 넘어간다.
근데 이 부분을 또 보면 pw에는 알파벳이 들어가면 안되고 name에는 nyang이라는 문자열이 들어가면 안된다. nyang이 필터링된다는 의미이다. 또한 pw 부분은 /\d*\@\d{2,3}(31)+[^0-8\"]\!/ 이 정규표현식을 충족하면 d4y0r50ng로 치환된다고 한다.
정리하자면,
닉네임은 dnyang0310이지만 nyang을 필터링한다. 따라서, nyang 필터링을 우회해줘야 한다.
패스워드는 d4y0r50ng+1+13이지만 알파벳이 들어가면 안된다. 따라서, /\d*\@\d{2,3}(31)+[^0-8\"]\!/ 이 정규표현식을 충족하는 새로운 숫자열을 만들어서 d4y0r50ng을 치환해줘야 한다.
정규표현식 /\d*\@\d{2,3}(31)+[^0-8\"]\!/은
- \d*: 0개 이상의 숫자
- \@: @ 기호
- \d{2,3}: 2자리 또는 3자리의 숫자
- (31)+: "31"이라는 문자열이 하나 이상 반복
- [^0-8\"]\!: 0부터 8까지의 숫자와 쌍따옴표(")를 제외한 다른 문자, 그리고 느낌표(!)
라는 의미이다.
이를 충족하는 숫자열을 하나 만들어보자면, 2@12319!가 될 수 있다.
닉네임에는 dnnyangyang0310, 패스워드에는 2@12319!+1+13을 넣어보자.
스텝 2로 넘어갔다. system() 함수를 이용하라는데 코드를 살펴보자.
이 부분을 살펴보면 Command창은 flag를 필터링하고 있다. flag를 제외한 명령어를 입력하면 그 명령어를 system 함수를 통해 그대로 실행시키는 걸 알 수 있다.
플래그는 ../dream/flag.txt에 있으니 원래라면 Command창에 cat ../dream/flag.txt를 입력해야 하지만 flag가 필터링되므로 cat ../dream/f*.txt로 대체해서 입력해준다.
플래그가 출력된 걸 볼 수 있다.
문제 해결!
+) 새싹 치고 어려운 문제였다.... 휴
'문제풀이' 카테고리의 다른 글
[Dreamhack] baby-linux 문제풀이 (0) | 2024.02.20 |
---|---|
[Dreamhack] xss-1 문제풀이 (0) | 2024.02.06 |
[Dreamhack] 64se64 문제풀이 (1) | 2024.01.30 |
[Dreamhack] ROT128 문제풀이 (0) | 2024.01.23 |
[Dreamhack] dreamhack-tools-cyberchef 문제풀이 (0) | 2024.01.23 |