
view-source가 존재하므로 소스코드를 먼저 확인해 봅시다.
<?php
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
?>
php 부분을 살펴보면 solve를 실행하기 위해서는 $_GET['id']을 admin이란 값으로 변경해야 합니다. GET으로 받기 때문에 ?id=admin으로 넣으면 해결이 될 것 같지만, preg_match로 admin 을 필터링하고 있기 때문에 우회가 필요합니다.
가장 간단한 방법은 admin 중 아무런 알파벳을 %아스키코드로 변경하여 URL 인코딩을 하는 것입니다. 맨 앞 a의 아스키 코드는 0x61이므로 %61dmin을 입력으로 넣으면 해결할 수 있을 것 같습니다.

하지만 url을 확인해보면 admin이라는 평문이 그대로 들어가서 preg_match에 걸리는 것을 확인할 수 있습니다. 이는 php에서 GET으로 입력을 받을 때 자동으로 디코딩을 한 번 수행하기 때문입니다. 실제 수행 순서는 입력(%61dmin) -> PHP 디코딩(admin) -> preg_match 가 돼서 preg_match에 걸리게 됩니다.
이를 해결하기 위해서는 preg_match 아래에 있는 urldecode를 사용해야 합니다. php에서와 동일하게 url decoding을 한 번 더 수행하므로 %를 한 번 더 인코딩 한 %25를 사용하면 해결할 수 있습니다.
실제 수행을 다시 한 번 적어보면 아래와 같습니다.
입력(%2561dmin) -> PHP 디코딩(%61dmin) -> preg_match(통과) -> urldecode(admin) -> solve