Ringster's Techblog

Tech, Mobile, Internet

Posts Tagged ‘쿠키

Webhacking.kr – Problem 6, Problem 26

leave a comment »

첫번째 문제를 풀고 두번째 문제를 풀려고 보니 난이도가 넘사벽이다.
대충 감으로는 SQL Injection을 해야할 것 같은데.. 어디서부터 어떻게 시작해야 할지 모르겠다.
나의 능력이 두번째 문제 풀만큼도 안되는가 하고 좌절하고 있다가 순서대로 문제를 안풀어도 된다는 사실을 발견했다…
게다가 두번째 문제가 배점도 높은 난이도 있는 문제였다니..

 

가장 배점이 낮은 문제인 100점짜리 6번 문제로 넘어가니 문제는 아래와 같다.

problem 6

이젠 서술하나 없이 덜렁 페이지 하나 나오는 문제들에 익숙해진다..

index.phps 를 눌러보면 다음과 같은 코드가 출력된다.

<?php
if(!$_COOKIE[user])
{
    $val_id="guest";
    $val_pw="123qwe"; 

    for($i=0;$i<20;$i++)
    {
        $val_id=base64_encode($val_id);
        $val_pw=base64_encode($val_pw); 

    } 

    $val_id=str_replace("1","!",$val_id);
    $val_id=str_replace("2","@",$val_id);
    $val_id=str_replace("3","$",$val_id);
    $val_id=str_replace("4","^",$val_id);
    $val_id=str_replace("5","&",$val_id);
    $val_id=str_replace("6","*",$val_id);
    $val_id=str_replace("7","(",$val_id);
    $val_id=str_replace("8",")",$val_id); 

    $val_pw=str_replace("1","!",$val_pw);
    $val_pw=str_replace("2","@",$val_pw);
    $val_pw=str_replace("3","$",$val_pw);
    $val_pw=str_replace("4","^",$val_pw);
    $val_pw=str_replace("5","&",$val_pw);
    $val_pw=str_replace("6","*",$val_pw);
    $val_pw=str_replace("7","(",$val_pw);
    $val_pw=str_replace("8",")",$val_pw); 

    Setcookie("user",$val_id);
    Setcookie("password",$val_pw); 

    echo("<meta http-equiv=refresh content=0>");
}
?> 

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

<? 

$decode_id=$_COOKIE[user];
$decode_pw=$_COOKIE[password]; 

$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
$decode_id=str_replace("$","3",$decode_id);
$decode_id=str_replace("^","4",$decode_id);
$decode_id=str_replace("&","5",$decode_id);
$decode_id=str_replace("*","6",$decode_id);
$decode_id=str_replace("(","7",$decode_id);
$decode_id=str_replace(")","8",$decode_id); 

$decode_pw=str_replace("!","1",$decode_pw);
$decode_pw=str_replace("@","2",$decode_pw);
$decode_pw=str_replace("$","3",$decode_pw);
$decode_pw=str_replace("^","4",$decode_pw);
$decode_pw=str_replace("&","5",$decode_pw);
$decode_pw=str_replace("*","6",$decode_pw);
$decode_pw=str_replace("(","7",$decode_pw);
$decode_pw=str_replace(")","8",$decode_pw); 

for($i=0;$i<20;$i++)
{
    $decode_id=base64_decode($decode_id);
    $decode_pw=base64_decode($decode_pw);
} 

echo("<font style=background:silver;color:black>&nbsp;&nbsp;HINT : base64&nbsp;&nbsp;</font><hr><a href=index.phps style=color:yellow;>index.phps</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>"); 

if($decode_id=="admin" && $decode_pw=="admin")
{
    @solve(6,100);
} 

?> 

</body>
</html>

코드를 해석해보면 guest와 123qwe를 id/pw로 받아서 base64 인코딩을 20번 반복한 후 각각 쿠키에 저장하고 있다.
인증 방식은 base64 디코딩을 20번 반복 후 admin/admin이면 인증되는 형식.
https://www.base64encode.org/와 같은 base64 문자열 변환 사이트에 admin을 넣고, 20번 반복 변환한 후 이를 쿠키값으로 대체해주면 인증에 통과하게 된다.
problem6_solved

 

문제 26번은 index.phps가 주어지며 해당 페이지는 다음과 같다.

<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>

get 방식으로 id 값을 가져오는데 id의 값이 admin과 동일하면 exit()이 호출되고, urldecode를 수행 시에 admin이 출력되어야 한다.
php의 함수 레퍼런스를 보면
urldecode
과 같이 주의문의 나와있는데, get을 통할때 한번 decode되고 urldecode가 수행될 때 한번 더 decode 되야한다는 것을 알 수 있다.
한마디로 admin이라는 문자를 url로 두번 encoding해야 하는데, 알파벳 상태로 percent encoding을 하면 당연 다시 알파벳이 나온다. 이에 따라 admin을 ascii로 변환해야 하는데 ASCII표를 참조해서 변환해보면 61 64 6D 69 6E가 된다.
여기에 다시 percent encoding을 적용하여 %61%64%6D%69%6E로 바꾸고, 한번 더 url encoding을 적용하면 %2561%2564%256D%2569%256E 가 된다. (http://www.url-encode-decode.com 와 같이 인코딩을 적용해주는 사이트들을 사용하면 편리하다)
마지막으로  http://webhacking.kr/challenge/web/web-11/index.php?id=%2561%2564%256D%2569%256E과 같이 페이지 url에 추가하여 get 방식으로 넘겨주면 해당 인증을 통과하게 된다.

ASCII를 통해서도 URL을 접근할 수 있다는 것과 이러한 방법으로 인해 보안상 헛점이 생길 수 있다는 것은 놀라웠다.
브라우저의 주소창에도 이런 형태의 url을 잘 넘겨줄 수 있다.

%6e%61%76%65%72.com 을 주소창에 붙여 넣고 어디로 연결되는지 확인해보자.

Written by Ringster

2015/01/16 at 12:22 pm

웹 보안에 게시됨

Tagged with , , ,

Webhacking.kr – 가입 및 Problem 1

leave a comment »

AWS에 올려놓은 앱 DB용 테스트 서버의 접속 로그를 확인해보니 brute force 시도가 확인되었다.
SMTP 로그인 시도인 것을 보니 초창기에 이것저것 설정하면서 설치했던 메일서버를 악용하려는 스패머들인것 같은데,
Web 쪽이나 서버 운영에 대한 지식이 부족하다 보니 이런 시도가 계속되고 있었다는 것도 한창이 지나서야 알게 됐다.

계기가 생긴 차에 웹 보안이나 해킹 관련 정보를 공부해봐야 겠다는 생각이 들었다.
깊이 파고들 필요는 없겠지만 일반적인 공격 방법에 대해 알아야 좀 더 안전한 서비스/서버를 만들 수 있을테니까.
정보를 얻을 수 있는 사이트들을 검색하다보니 http://webhacking.krhttp://hack-me.org와 같은 Quiz풀이 형태의 사이트들을 발견했다. (아주 오래전에 비슷한 형태로 운영되던 hackerslab이라는 사이트가 있었는데, 지금 다시 찾아보니 200x년대 이후 방치되고 있는듯 하다.)

webhacking.kr에 가입하려고 보니, 가입부터 간단치 않다.
Decode me라는 문자열을 디코딩해야 가입이 가능한데, 문자열 형식에 디코딩 방식에 대한 힌트가 숨어있다. Site admin이 가입에 대한 방법 설명은 자제해줄 것을 공지로 요청한터라 (아무나 유입 되는 것을 막기 위한 것 같다.) 따로 언급하지 않겠다.

문제는 Challenges – Auth 메뉴를 통해 접근 가능하며, 문제 1은 다음과 같다.
webhacking_lv1

문제에 주어진 힌트대로 현재의 문제 경로에 index.phps를 추가하면 php 소스코드를 볼수있다.

<?
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>

코드를 살펴보면 eregi 함수를 통해 쿠키의 user_lv값이 0-9,.를 포함하고 있지 않으면 1로 설정해주고, 쿠키의 값이 6 이상일 경우 1로 설정해줌을 알 수 있다.

쿠키의 user_lv값이 5 이상 6이하가 됐을 때 @solve(); 호출을 통해 인증되는 형태이므로, 쿠키 값을 5~6 사이의 적당한 값으로 수정하면 된다. 쿠키 수정을 하기 위한 툴을 검색해본 결과, 크롬 플러그인 형태인 EditThisCookie(Chrome 링크)가 있어 설치하고, webhacking.kr로부터 받은 쿠키의 user_lv값을 5.5로 수정하자 해당 문제의 풀이가 완료되었다.

쿠키에 중요한 정보를 저장하지 않아야 한다는 것은 상식이지만, 생각보다 많은 사이트들이 중요한 정보를 쿠키를 통해 클라이언트에 전달하고 있다. 이러한 쿠키가 얼마나 쉽게 위변조 될 수 있는지에 대해 실질적으로 알 수 있게 해주는 문제라 하겠다.

Written by Ringster

2015/01/16 at 5:58 am

Yurim Jin, Programmer&Designer

Fork my brain because I'm ready to commit

jamesjungkuelee's biotech story

Biotech, entrepreneur, life

Communications as Ikor

기업 위기관리의 모든 것

Charles Pyo Ventures

시도와 실패, 성장의 기록. 2막에서도 계속되는 모험들.

techNeedle 테크니들

글로벌 테크 소식을 인사이트와 함께 전달합니다

Open API, Cloud, DevOps 와 eBook

Open API, eBook, Cloud, DevOps

Economics of almost everything

Tech, Mobile, Internet

cylee

Tech, Mobile, Internet

gorekun.log

고어쿤로그

Google Developers Korea Blog

Tech, Mobile, Internet

Android Developers Blog

Tech, Mobile, Internet

최피디의 앱스 개발기

기술, 앱스, SNS, 창업

D2 Blog

Tech, Mobile, Internet

All of Software

Tech, Mobile, Internet

'Startup's Story Platform’

'Startup's Story Platform’