오늘은 webhacking.kr 6번 문제를 풀어보자.
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> HINT : base64 </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>
그럼 이제 코드를 분석해볼까요?
[실행 조건 : !$_COOKIE[user]]
user 쿠키가 존재하지 않을때 실행되는 조건문
$val_id에 guest, $val_pw에 123qwe라는 값을 넣어줍니다.
$val_id="guest";
$val_pw="123qwe";
$val_id값과 $val_pw값을 base64로 19번 인코딩합니다.
for($i=0;$i<20;$i++)
{
$val_id=base64_encode($val_id);
$val_pw=base64_encode($val_pw);
}
$val_id값과 $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);
user라는 쿠키에 $val_id, password라는 쿠키에 $val_pw에 해당하는 값을 대입해줍니다.
Setcookie("user",$val_id);
Setcookie("password",$val_pw);
메타태그를 이용하여 즉시 새로고침합니다.
echo("<meta http-equiv=refresh content=0>");
문제 해결을 위한 조건이 충족되었을 때 실행
user라는 쿠키값을 $decode_id의 값으로, password라는 쿠키값을 $decode_pw의 값으로 설정해준다.
$decode_id=$_COOKIE[user];
$decode_pw=$_COOKIE[password];
치환 암호화된 $val_id값과 $val_pw값을 복호화합니다.
$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);
Base64로 19번 디코드합니다.
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> HINT : base64 </font><hr><a href=index.phps style=color:yellow;>index.phps</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");
만약 $decode_id값과 $decode_pw값이 admin이라면 문제를 해결한다.
if($decode_id=="admin" && $decode_pw=="admin")
{
@solve(6,100);
}
위에서 코드를 분석할때 봤던것과 같이 user와 password 쿠키가 생성되어 있습니다.
그럼 이제 이 문제를 해결하기 위해서는 저 값을 복호화한 값이 admin이 되게 해야하므로,
우리가 직접 암호문을 만들어줍시다.
직접 만들기는 귀찮으니 이 값을 알려줄 코드를 작성해봅시다.
<?php
$ADMIN = 'admin';
for($i=0;$i<20;$i++){
$ADMIN=base64_encode($ADMIN);
}
$ADMIN=str_replace("1","!",$ADMIN);
$ADMIN=str_replace("2","@",$ADMIN);
$ADMIN=str_replace("3","$",$ADMIN);
$ADMIN=str_replace("4","^",$ADMIN);
$ADMIN=str_replace("5","&",$ADMIN);
$ADMIN=str_replace("6","*",$ADMIN);
$ADMIN=str_replace("7","(",$ADMIN);
$ADMIN=str_replace("8",")",$ADMIN);
echo $ADMIN;
?>
잠깐 Tip
저 코드를 실행하면 다음과 같은 결과가 나온다.
이제 이 암호문을 user와 password 쿠키값에 넣고 실행해보자.
ID값과 PW값이 admin으로 변경되며
문제가 해결된다.
WARGAME.KR 6번 문제 클리어!
'보안공부 > Webhacking.kr 풀이' 카테고리의 다른 글
webhacking.kr 17번 문제 풀이 - 콘솔계산기 (0) | 2018.07.10 |
---|---|
webhacking.kr 14번 문제 풀이 - indexOf (0) | 2018.07.09 |
webhacking.kr 15번 문제 풀이 - 이걸못풂? (0) | 2018.07.06 |
webhacking.kr 4번 문제 풀이 (0) | 2018.07.05 |
webhacking.kr 1번 문제 풀이 - 쿠키는 맛있어 (2) | 2018.07.03 |