A ship in harbor is safe, but that is not what ships are built for.

STUDY/WEB_Hacking

Webhacking.kr 26번 문제(old)

플리피나리 2019. 12. 18. 11:01
반응형

 

문제의 메인화면을 보니 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