보안 공부하는 꼬깔이

Webhacking.kr 26번 문제 풀이

 

 

26번 문제에 접속하면 index.phps 힌트 페이지가 존재한다.

확인해보자.

힌트페이지에는 php 소스코드가 존재한다. 해석해보자

 

<? 

if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } #GET방식으로 id변수에 저장된 값이 "admin"이면 코드 실행 종료
$_GET[id]=urldecode($_GET[id]); #GET방식의 id변수에 저장된 값을 urldecode 수행 후 다시 id변수에 저장

if(
$_GET[id]=="admin") #id변수에 저장된 값이 "admin" 이면 문제 해결
{ 
@
solve(26,100); 
} 

?> 

소스코드를 참조하면 GET방식으로 id변수에 "admin"이라는 값을 입력 받아야 문제가 해결된다. 하지만 "admin" 문자열을 전달하게 되면 eregi 함수에 의해 필터링되고 소스코드가 강제로 종료되게 된다.

그렇다면 admin을 url encode해서 전달하게 되면 어떻게 될까?

"admin" url encoding 한값 :  %61%64%6d%69%6e

필터링 당했다. 이유는 url encoding 된 %61%64%6d%69%6e 값을 전달해도 서버에 전달됨과 동시에 서버의 php가 해석을 해서  "admin" 이라는 문자로 받아들이기 때문이다.

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

그렇다면 소스코드중 urldecode를 한번더 수행해 id변수에 저장하는 소스코드를 이용해 문제를 풀어보자.

%61%64%6d%69%6e 값을 한번더 encoding 한 뒤 서버측으로 전달하게되면 서버측 php가 해석을 해도 "admin"이라는 문자가아닌 "%61%64%6d%69%6e" 문자로 판단할 것이고 eregi 함수의 if문을 우회할 수 있다. 그리고 바로  $_GET[id]=urldecode($_GET[id]); 해당 구문이 실행 되어  "%61%64%6d%69%6e" 를 url decoding 한 값인 "admin"을 id변수에 저장할 것이고 문제가 풀릴것이다.

admin을 2번 url encoding 한 값인 "%2561%2564%256d%2569%256e" 을 get방식으로 전달해보자.

예상대로 eregi 함수로 필터링 하는 if문을 우회한뒤 한번 더 urldecoding을 통해 "admin"이 id변수에 저장되었고 문제가 풀렸다.

100 Point 획득 :D

 

 

 

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 25번 문제 풀이  (0) 2017.07.10
Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07