Dreamhack phpreg 풀이

심야·2023년 12월 13일
0

phpreg

문제의 소스 코드를 보면 패스워드 파라미터에 알파벳이 있으면 안된다. 뿐만 아니라 입력 값에 특정 패턴이 존재하면 치환한다.

image.png

step2로 넘어가기 위해서는 필터링을 우회해 아이디 값 "dnyang0310", 패스워드 값 "d4y0r50ng+1+13"이 서버 측에 전달되어야 한다.

필터링 조건은 총 3가지이다.

  1. 패스워드 파라미터에 알파벳이 존재하면 안된다.
  2. 아이디 파라미터에 nyang 문자열이 존재하면 안된다.
  3. 패스워드 파라미터에 /\d*\@\d{2,3}(31)+[^0-8\"]!/ 패턴이 존재하면 d4y0r50ng 문자열로 치환한다.

따라서 3가지 필터링을 우회하고, 치환한 문자열을 dnyang0310, d4y0r50ng+1+13 값으로 변경하게 만들어 서버에 전달한다.

우선 아이디는 "nyang" 문자열이 존재하면 빈 문자열로 치환한다. 이러한 필터링은 매우 취약한 방식으로 "nyang" 문자열 사이에 "nyang" 문자열을 끼어 넣는다.

공격자가 서버 측에 "nyannyangg" 문자열을 전송하면 서버 측은 중간에 끼어있는 nyang 문자열을 빈 문자열로 만들어 "nyang" 문자열을 완성 시킨다. 이러한 필터링 방식은 블랙 리스트 필터링 방식이며 취약한 방식으로 필터링 하면 XSS, SQL 인젝션 공격을 방어할 수 없다.

비밀번호 필터링 방식을 보자.

특정한 패턴이 존재하면 특정 문자열로 치환한다. 해당 정규표현식 내용은 아래와 같다. 해당 조건에 부합하는 임의의 문자열, 예를 들어 123@45631~! 같은 문자열이 필요하다. 또한 해당 문자열이 d4y0r50ng로 변환되면 뒤에 존재하는 +1+13 문자열이 함께 있어야 한다.

\d*          - 숫자 0개 이상
\@           - "@" 기호
\d{2,3}      - 2 또는 3개의 숫자
(31)+        - "31" 시퀀스 한 번 이상
[^0-8\"]     - 숫자 0에서 8과 큰따옴표를 제외한 모든 문자
\!           - 느낌표

필터링 방식을 모두 설명했다. 이제 우회를 시도하자.

서버에 전송되어야 하는 아이디와 패스워드는 dnyang0310, d4y0r50ng+1+13 이다.

따라서 아이디는 dnyannyangg0310, 비밀번호에 입력할 임의의 문자열은 123@45631~!+1+13 이다.

우회에 성공한 결과, step2 페이지로 넘어갔다. 문제에서는 아래와 같이 system() 함수를 이용해 플래그를 획득하라고 안내한다.

Step 2에서 system() 함수를 이용하여 플래그를 획득하세요.

플래그는 ../dream/flag.txt에 위치합니다.

cat 명령어를 사용해 flag.txt 파일을 읽으려 했으나, 에러가 발생한다.

image.png

image.png

소스 코드를 살펴보니, cmd 파라미터에 flag 문자열이 존재하면 Error를 응답한다.

image.png

따라서 flag 파일이 존재하는 경로에서 모든 텍스트 파일 내용을 출력하도록 와일드 카드 * 명령어를 사용한다.

image.png

해당 명령어를 사용해 경로에 위치한 모든 텍스트 파일 내용을 출력한 결과, Flag 값을 획득하였다.

image.png

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글