https://dreamhack.io/wargame/challenges/873
생성된 웹에 접속하면 다음과 같은 화면이 나온다
그리고 주어진 문제 파일도 확인해보자
index.php 파일에서는 어떤 특이점 없이 웹을 구성하는 코드로만 되어있으므로 step2.php 파일을 살펴보자
여기에 ID와 PW를 판별하는 코드가 있다!
preg 함수는 php에서 사용하는 정규식과 문자열을 비교하는 함수이다.
preg_match 함수를 통해 비밀번호에 영문 대소문자가 들어가지않는 것을 확인할 수 있고,
preg_replace가 중요한데, 정규식과 매치되는 문자열 영역을 작성된 문자열로 변환시킨다.
정규식 패턴은 주로 /패턴/ 꼴로 주어질 수 있다
그리고 /패턴/ 뒤에 붙는 문자는 플래그로 검색의 옵션을 지정해준다
/패턴/i
: 패턴 문자 영문 대소문자 상관이 없다
이러한 옵션에 의해 nyang또는 Nyang, NyanG, ... 등 무조건 nyang이 들어가기만 하면 된다.
그런데 nyang이 들어간 문자열을 공백으로 대체하게 되므로 ID가 일치할 조건인 "dnyang0310"을 붙여 nyangdnyang0310을 입력해주면 될 것이다!
이미 정규식에 대한 문제를 하나 풀었는데, 해당 문제 에서 중복되는 내용을 제외한 패턴에 대해서 해석해보자
*
: 앞 문자나 숫자가 0개 이상 존재하면 매치한다
(31)
: 괄호로 쌓여있는 내용은 문자열이 묶음으로 존재해야만 매치한다. 따라서 31이 그대로 존재해야한다. 만약 여러개를 요구하는 경우 3131 같이 묶음단위로 존재해야한다.
[^0-8\"]
: [^~]
는 대괄호 안의 내용을 제외한 나머지 문자나 숫자와 매치한다. 따라서 숫자 9만 매치되거나, 이스케이핑 된 " 문자열을 제외한 나머지 문자가 매치된다.
그리고 정규식에 매치될 내용은 d4y0r50ng
로 대체하게 되므로 뒤에 +1+13
을 붙여 입력하면 될 것이다!
이제 이러한 정보를 토대로 ID에 nyangdnyang0310
을, PW에 @47319!+1+13
을 입력해주자.
뭔가 맞지않다 무엇이 잘못된걸까?
입력한 ID를 다시보면 nyangdnyang0310
에서 nyang
이 존재하는 부분이 2군데이다!
따라서 preg_replace를 거치면 d0310
을 전달하게 되어 틀리게 되는 것이다!
이 문제를 피하기 위해 nyang을 중간에 삽입해 없애버리면 될 것이다.
따라서 dnynyangang0310
으로 바꾸면 문제가 해결된다!
성공적으로 step 2에 도달했다!
문제에서 system()를 이용해 문제를 해결하라고 언급한다
php에서 system(명령 문자열)
을 통해 리눅스 셸에 명령 문자열을 전달한다.
그리고 step2.php를 마저 보면 다음과 같은데
php 코드에서 입력한 내용을 cmd 변수로 전달해주므로 리눅스 사용하듯이 flag의 내용을 cat 명령을 통해 확인해주면 끝나게 된다!
그런데 여기서도 flag라는 단어가 들어가게 되면 정규식 표현에 의해 Error라는 문자열을 받게 될 것이다.
flag라는 단어를 우회하면서 flag파일을 확인하는 방법은 이미 와일드카드라는 기법으로 해결한 전적이 있다.
따라서 웹 입력창에 cat ../dream/fl?g.txt
를 작성하면 플래그 내용을 볼 수 있게 된다!