WarGame/Web

[webhacking.kr 26번]

선문기 2016. 1. 18. 06:14

[필히 본인이 풀어보시고 정말 안되겠다면 다음의 풀이를 확인하시길 바랍니다.]


[그림 1] 26번 문제


26번문제는 URL인코딩에 관한 문제이다.


<html> 
<head> 
<title>Challenge 26</title> 
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; }     
a { color:lightgreen; } 
</style> 
</head> 
<body> 

<? 

if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } 

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

if(
$_GET[id]=="admin"

@
solve(26,100); 


?> 


<br><br> 
<a href=index.phps>index.phps</a> 
</body> 

</html>  

[표 1] 소스코드 


해당 페이지는 GET방식으로 id 매개변수를 입력받는다.

GET의 특성으로 우리는 URL에 매개변수를 직접 입력이 가능하다.

궁극적인 목표는 id의 값이 admin으로 설정이 되어야 하는 것인데 첫번째 조건문에서 평문의 문자열을 입력시 필터링 된다.



[그림 2] id=admin


그래서 이를 우회하기 위해 평문("admin")을 입력하지 않는 방법으로는 다음과 같다.

먼저 $_GET[id]=urldecode($_GET[id]);의 코드에 힌트를 얻어 URL인코딩으로 id값을 입력 해본다.



[그림 3] id=%61%64%6D%69%6E

 

하지만 이는 필터링된다.

분명 소스코드 알고리즘을 파악해본 결과 인코딩 값을 입력하면 첫번째 조건문은 통과 할 것인데 안된다.

이는 브라우저의 기본 동작개념을 알지 못한점에서 나온 실수이다.


일반적으로 웹브라우저는 URL인코딩 및 디코딩 기능을 내재하고 있다. 웹서버와 클라이언트간에 통신이 이루어 질시 브라우저는 URL 인코딩하여 송신하고 수신할때도 URL디코딩을 하게 된다. 그러므로 id 값에 인코딩 값을 넣었다고 할 지라도 브라우저에서 한번 디코딩된 후 디코딩된 id값으로 소스코드 알고리즘이 진행되는 것이다.

그러면 이제 간단하다.

한번 더 인코딩을 하면 될 것이 아닌가?ㅋㅋㅋ


[그림 4] 이중 인코딩 - 1  



[그림 5] 이중 인코딩 - 2


문제의 페이지에서 한번의 디코딩과정이 일어나므로 uridecode(%61%64%6D%69%6E)와 같이 함수의 매개변수가 설정되어야한다. %61이 나오기 위해서는 %%36(6)%31(1)와 같이 입력해야한다.




*기타 

URL인코딩방식

한 문자를 URL인코딩 한다하면 먼저 그 문자를 아스키코드로 변환 후 16진수로 변환이 한번 더 이루어진다. 그 다음 %형태를 붙여 인코딩이 완료가 된다.


반대로 디코딩은 16진수 값을 아스키코드로 변환 후 그 아스키코드에 해당하는 문자로 변환이 이루어 진다.