-
[Wargame] - phpreg정보보안 2024. 10. 4. 01:19
메인 화면

step1에서는 위 input에 들어간 Nickname과 Password를 알아내야한다.
이를 위해 문제에서 제공해준 step2.php 파일을 분석해보자.
// pw filtering if (preg_match("/[a-zA-Z]/", $input_pw)) { echo "alphabet in the pw :("; } else{ $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") {위 php코드에서 name과 pw를 대놓고 알려주고 있었지만, preg_match()라는 정규표현식으로 이를 필터링을 해주고 있었다.
이를 분석해보자.
1. preg_replace("/nyang/i", "", $input_name);
닉네임에 nyang가 들어온다면, 이를 모두 ""으로 공백처리가 되기 때문에 nyang을 한번 더 쓰면 되겠다 라는 걸 알 수 있다.
따라서 해당 필터링을 피하기 위해 "dnyanyangng0310"을 작성하면 됨.
2. preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
위 정규표현식에 맞게 값을 넣으면 정답인 pw를 반환한다고 한다.
해당 정규표현식을 분석하면 아래와 같다.
1. \d : 0개 이상의 숫자
2. \@ : "@" 문자
3. \d{2,3} : 2개 또는 3개의 숫자
4. (31)+ : "31"문자열이 한번 이상 반복함
5. [^0-8] : 0부터 8사이의 숫자를 제외한 문자
6. \! : "!" 문자
정규표현식에 맞는 값을 매칭해보면 1@23319!+1+13가 나온다!
지금까지 구한 name, pw를 값으로 넣고 제출을 눌러보자.
Step 2

이 또한 php 코드를 분석해보자.
// cmd filtering else if (preg_match("/flag/i", $cmd)) { echo "<pre>Error!</pre>"; } else{ echo "<pre>--Output--\n"; system($cmd); echo "</pre>"; }/flag라는 필터링을 설치해놓은 것을 볼 수 있다.
그럼 문제 설명에서 ../dream/flag.txt에 플래그 값이 있다고 했으니 이를 참고해서 문제를 풀면 될 것 같다.
일단 .txt 파일 속 값을 가져와야하니 cat 명령어를 쓰도록 하고, 문제에서 정의해준 경로를 적어보면 아래와 같다.
cat ../dream/flag.txt
하지만 flag 문자에 필터링이 존재하기 때문에 이를 피하기 위해 *.txt로 파일명(flag)을 입력하지 않아도 출력되도록 처리하면 될 것 같다.
cat ../dream/*.txt

'정보보안' 카테고리의 다른 글
Lab: DOM XSS in document.write sink using source location.search (0) 2025.04.12 [Wargame] - CSRF Advanced (0) 2024.10.09 [Wargame] - cookie (0) 2024.10.08 [Wargame] - what-is-my-ip (0) 2024.10.07 [Wargame] - xss-1 (0) 2024.10.07