반응형

1. 문제 설명

 

먼저 문제를 클릭해보자.

 

문제를 클릭하니 다음과 같은 Wrong이라는 문구와 view-source가 있다.

 

역시 아무런 정보가 없으니 view-source를 클릭해보자.

 

다른 코드들은 볼 필요 없이 위의 PHP 소스코드를 분석해보자.

 

먼저 $pat이라는 변수에 어떤 패턴을 저장하였다.

 

따라서 첫 번째 pat이라는 변수에 저장되어 있는 패턴을 분석해야 한다.

 

그 후 preg_match 함수를 이용해 앞에서 정의한 패턴을 기반으로 regex를 수행한다.

 

perg_match에 대한 설명은 여기에 있다. (클릭)

 

regex를 수행하지만 어떤 문자열이나 값이 있어야 패턴을 적용할 수 있다.

 

그 값이 바로 $_GET['val'] 값이다.

 

따라서 GET 형식으로 URL 뒤에 ?val=어떤 값을 넣어줘야 한다.

 

그렇게 패턴에 매칭이 되면 solve(11) 함수가 실행되면서 문제가 clear 하게 된다.

 

여기까지 정리해보면 다음과 같다.

 

GET 형식으로 val을 값을 서버로 넘겨주는데

 

이때 값은 perg_match에 매칭이 되어야 한다. (그래야 solve(11) 함수가 실행)

 

perg_match에 매칭 되기 위해서는 pat이라는 변수에 저장되어있는 패턴을 분석해야 한다.

 

따라서 패턴 분석 후 값을 val에 넣어주면 이번 문제는 clear 할 수 있을 것 같다.

 

2. 문제 풀이

 

/[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/ 패턴을 하나하나 분석해보자.

 

첫 번째로 나오는 것이 [1-3]이다.

 

1-3은 값인 것 같고 먼저 [ ]가 무엇을 의미하는지 살펴보자.

 

 

[ ]은 지정된 두 문자 사이에 문자 코드가 있는 문자를 찾는다는 의미이다.

 

이것이 뭐냐? 쉽게 말해 범위라고 생각하면 된다.

 

[g-s]지정된 두 문자(g,s) 사이에 있는 모든 문자를 주어진 값에서 찾는다는 의미이다.

 

따라서, abcdefghijklmnopqrstuvwxyz에서

 

g, h, i, j, k, l, m, n, o, p, q, r, s만 패턴에 맞게 적용되는 것이다.

 

다음은 [a-f]이다.

 

똑같이 지정된 두 문자(a,f) 사이에 있는 모든 문자를 주어진 값에서 찾는다는 의미이다.

 

그렇다면 [1-3][a-f] 이 두 개를 사용해서 매칭 되는 문자열을 찾아보자.

 

먼저 위에 처럼 주어진 문자열에 [1-3][a-f]을 만족하기 위해서는 첫 글자가 1~3 사이의 숫자여야 한다.

 

1번을 조사할 때 첫글자가 4니깐 패스, 2번을 조사할때 5라서 패스

 

3번을 조사할때 3이고 바로 뒤에 오는 문자가 [a-f] 사이에 포함되니 3a가 매칭이 된다.

 

 

이제 다음은 {5}

 

5는 값이니깐 { }가 먼지 먼저 알아야 한다.

 

Developer에서 정의한 { } 다음과 같다.

 

{5}는 앞 표현식이 5번 나타나는 부분에만 적용된다는 의미이다.

 

적용된 부분인 aabab는 {5}의 앞 표현식 [a-f]가 총 5번 a, a, b, a, b로 매칭이 되는 것이다. 

 

3은 [a-f]의 앞의 표현식 [1-3]에 의해 매칭 되는것이다.

 

그다음은 _ 이건 말그대로 _ 문자를 의미한다.

 

. 은 새로운 개행이 나오기 전까지의 모든 문자를 의미한다.

 

 

*은 앞의 표현식이 0개 이상 연속으로 반복되는 문자를 의미한다.

 

 

 

 

그 다음은 $_SERVER[REMOTE_ADDR] 변수 값인데

 

REMOTE_ADDR은 내가 접속하는 IP 주소를 의미한다.

 

IP 주소는 구글에 what is my ip라고 검색해도 되고 아래의 URL에 들어가서 확인이 가능하다.

 

https://whatismyipaddress.com/

 

그렇다면 여기까지 매칭이 되게 val을 작성해보자.

 

[1-3][a-f]{5}_.*뒤에 원래 $_SERVER [REMOTE_ADDR] 이것이 들어가야 하지만 들어갔다고 가정하고

 

3 abcde_127.0.0.1가 매칭이 되었다.

 

이제 남은 것은 \tp\ta\ts\ts이다.

 

\t은 우리가 알고 있는 탭이다.

 

____p____a____s____s //____은 탭의 공백을 의미함.

 

pass라는 단어가 나온다.

 

따라서 val3abcde_자신의ip\tp\ta\ts\ts를 넣어주면 된다.

 

하지만 GET 방식이다.

 

GET 방식에서 URL 뒤에 ?val=3abcde_자신의ip\tp\ta\ts\ts를 넣어주면

 

\이 문자가 URL encoding이 되어 %5C가 들어가면서 %5Cp%5Ca%5Cs%5Cs가 된다.

 

따라서 탭의 의미를 주려면 %09를 넣어 줘야 한다.

 

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

12. old-12  (0) 2021.11.09
10. old-10  (0) 2021.11.08
9. old-09  (0) 2021.11.08
8. old-08  (0) 2021.11.05
7. old-07  (0) 2021.11.04

+ Recent posts