본문 바로가기
웹 해킹(WebHacking)/CTF(webhacking.kr)

Challenge(old) - Challenge 26번 문제풀이

by LIZ0904 2020. 11. 27.
반응형

문제

문제를 보면 아무것도 없이 view-source만 확인할 수 있다.

 

 

 

view-source

view-source를 확인해보자!

 

 

if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }

GET 방식으로 넘어온 id의 값이 admin이면 'no!'라는 문구를 출력한다.

 

 

 

$_GET['id'] = urldecode($_GET['id']);

id를, id를 urldecode()한 값으로 초기화 해준다. urldecode() 함수는 주어진 문자열을 디코드한 문자열을 반환한다.

 

 

 

if($_GET['id'] == "admin"){
    solve(26);
  }

만약 이 디코딩 된 id 값이 admin이면 문제가 풀린다.

 

 

 

 

 

id=admin

실제로 id에 admin을 입력해보면, 'no!' 라는 문구가 뜬다.

 

 

 

 

admin을 url 인코딩

'디코딩'한 id값이 admin이어야 하기 때문에 인코딩 한 id값을 넣어주면, 디코딩 후에는 admin으로 제대로 입력될 것이라고 생각했다. 하지만 url 인코딩 표를 참고해 admin을 url로 인코딩해서 입력을 해도 'no!'라는 문구가 뜬다.

(참고로 admin을 url 인코딩 하면, %61%64%6d%69%6e 이다.)

 

 

 

 

이는 웹 서버와 브라우저 사이에서 데이터를 교환할 때, 브라우저는 입력받은 데이터를 자동으로 인코딩 해서 값을 보내고, php는 자동으로 이를 디코딩 하기 때문에 일어나는 일이다. 그럼 id 값을 2번 인코딩 해주면, php가 디코딩 1번, urldecode()가 디코딩 1번을 해줘서 결과적으로 다시 admin으로 입력이 될 것이다.

 

 

 

 

www.convertstring.com/ko/EncodeDecode/UrlEncode

 

URL 인코딩 - 온라인 URL 인코더

 

www.convertstring.com

url 인코딩 프로그램을 이용해서 아까 인코딩한 admin 값(==%61%64%6d%69%6e)을 한번 더 인코딩 해준 뒤 입력해준다.

 

 

 

 

성공

그럼 성공~!

 

반응형

댓글