1. 문제 설명
문제 링크에서 view-source를 클릭해 바로 소스 코드를 얻을 수 있다.

아래 php 코드를 살펴 보면, id의 값이 'admin'이면 풀린다는 사실을 알 수 있다.

2. 문제 풀이
1. preg_match 우회
하지만 preg_match() 함수에서 id의 값에 'admin'을 넣으면 exit()가 실행되어
solve()가 있는 if문에 도달할 수 없게 된다.
그러나 다음 라인에서 urldecode 함수가 실행되고 있으므로,
'admin'을 인코딩한 값을 넣으면
preg_match를 우회하면서 urldecode에서 'admin'으로 디코딩될 수 있다.
따라서 id의 값으로 admin을 인코딩한 값(%61%64%6D%69%6E)을 대입한다.
하지만 다시 'admin'으로 디코딩되며 아래와 같이 막힌다.

이는 php 서버가 인코딩된 값을 자동으로 디코딩하기 때문이다.
따라서 인코딩을 이중으로 하면, preg_match를 우회할 수 있다.
from urllib.parse import quote
str = "%61%64%6D%69%6E"
encoded_res = quote(str)
print(encoded_res) # %2561%2564%256D%2569%256E
2. 정답 URL 접속
id에 %2561%2564%256D%2569%256E을 대입하면 문제가 풀리게 된다.

1. 문제 설명
문제 링크에서 view-source를 클릭해 바로 소스 코드를 얻을 수 있다.

아래 php 코드를 살펴 보면, id의 값이 'admin'이면 풀린다는 사실을 알 수 있다.

2. 문제 풀이
1. preg_match 우회
하지만 preg_match() 함수에서 id의 값에 'admin'을 넣으면 exit()가 실행되어
solve()가 있는 if문에 도달할 수 없게 된다.
그러나 다음 라인에서 urldecode 함수가 실행되고 있으므로,
'admin'을 인코딩한 값을 넣으면
preg_match를 우회하면서 urldecode에서 'admin'으로 디코딩될 수 있다.
따라서 id의 값으로 admin을 인코딩한 값(%61%64%6D%69%6E)을 대입한다.
하지만 다시 'admin'으로 디코딩되며 아래와 같이 막힌다.

이는 php 서버가 인코딩된 값을 자동으로 디코딩하기 때문이다.
따라서 인코딩을 이중으로 하면, preg_match를 우회할 수 있다.
from urllib.parse import quote
str = "%61%64%6D%69%6E"
encoded_res = quote(str)
print(encoded_res) # %2561%2564%256D%2569%256E
2. 정답 URL 접속
id에 %2561%2564%256D%2569%256E을 대입하면 문제가 풀리게 된다.
