문제의 메인화면을 보니 view-source 버튼만 딸랑있다. 확인해보자.
중요한 부분만 살펴보았다.
<?php
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); } //get방식의 id 값에 admin이 있으면 "no!"를 출력 후 종료
$_GET['id'] = urldecode($_GET['id']); //id를 url 디코딩해서 재저장
if($_GET['id'] == "admin"){ //id 값이 admin이면
solve(26); //문제해결
}
?>
int preg_match(string pattern, string subject, array[matches]); : subject에 일치하는 pattern이 있으면 참으로 반환, 패턴으로 알리기 위해 앞과 뒤에 슬래시(/)를 붙임
일단, admin을 url인코딩해 id값에 넣으면 문제가 해결될 것 같다. 온라인 상의 url인코딩을 써도 되지만 간단한 것이니 표를 봤다.
admin은 url코드로 %61%64%6d%69%6e인 것을 확인했으니 get방식을 통해 전달해보자.
위와 같이 출력됨을 확인할 수 있다. 코드를 보면 preg_match 함수가 urldecode 앞쪽에 있어 영향을 받을 일이 없어보이는데 위와 같은 결과가 나타났다. 그렇다면 아마도 urldecode가 되기 이전에 자동적으로 디코딩이 되었기 때문에 preg_match가 동작한 것을 보인다.
실제로도, 웹 서버와 브라우저 사이에서 데이터 교환 시 브라우저는 폼에서 입력받은 데이터를 자동으로 인코딩한 값을 php서버로 보내고 php는 받은 인코딩된 값을 자동으로 디코딩한다. 즉, 저렇게 get방식으로 입력한 값은 php에서 자동으로 디코딩한다는 것이다.
따라서 해당 문자열을 한번 더 인코딩하면 문제가 해결될 것 같다.
이번에는 온라인 상의 url인코딩을 찾아 써보았다.
%61%64%6d%69%6e을 인코딩하면 위와 같은 결과가 나온다. 해당 값을 get방식으로 보내보자.
이미 푼 문제이기 떄문에 위와 같은 메세지가 뜨면서 문제가 해결되었음을 확인할 수 있다.
'STUDY > WEB_Hacking' 카테고리의 다른 글
Webhacking.kr 54번 문제(old) (0) | 2021.01.25 |
---|---|
Webhacking.kr 39번 문제(old) (3) | 2019.12.20 |
Webhacking.kr 24번 문제(old) (1) | 2019.12.17 |
Webhacking.kr 18번 문제(old) (0) | 2019.12.03 |
Webhacking.kr 17번 문제(old) (0) | 2019.11.30 |