Ringster's Techblog

Tech, Mobile, Internet

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 을 주소창에 붙여 넣고 어디로 연결되는지 확인해보자.

Advertisements

Written by Ringster

2015/01/16 , 시간: 12:22 오후

웹 보안에 게시됨

Tagged with , , ,

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

Jay 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막에서도 계속되는 모험들.

VentureBeat

News About Tech, Money and Innovation

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 블로그

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’

%d 블로거가 이것을 좋아합니다: