6번을 들어가면 아이디와 비밀번호의 값이 보이면서 바로 소스코드를 확인할 수 있습니다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
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,time()+86400,"/challenge/web-06/");
Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
echo("<meta http-equiv=refresh content=0>");
exit;
}
?>
<html>
<head>
<title>Challenge 6</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<?php
$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("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");
if($decode_id=="admin" && $decode_pw=="nimda"){
solve(6);
}
?>
</body>
</html>
위의 코드가 6번의 소스코드입니다. 소스코드를 해석해서 쿠키값을 바꿔주면 쉽게 해결되는 문제입니다. 먼저 html태그 윗 부분 부터 해석을 해보겠습니다.
1. id=quest, pw='123qwe'로 설정해서 20번 base64로 인코딩 해준 후 해당하는 문자열들을 규칙에 맞게 변환하여 쿠키값 user, password로 설정해준 부분을 소스코드로 보여주었습니다.
2. html 태그 안의 내용은 user, password의 쿠키 값을 가져와서 규칙에 맞게 대체한 문자들을 원래의 값으로 다시 대치시켜 준후 base64 디코딩을 20번하여 처음에 어떤 값으로 id,pw값을 설정했는지 확인 하는 과정이 포함됩니다. 이때 id='admin', pw='nimda'를 만족하면 문제가 풀리가 됩니다.
3. 그렇다면 이 문제를 풀기 위해서는 쿠키값을 일정한 값으로 복호화와 비슷한 과정을 거쳤을 때 id='admin', pw='nimda'를 만족해야 합니다. 하지만 이 문제의 초기 설정은 id='guest', pw='123qwe'로 설정되어 있기 때문에 우리가 직접 같은 규칙을 이용해서 쿠키값에 저장할 값을 만들어 주어야 합니다.
4. 저는 여기서 20번의 반복 과정이 있기 때문에 파이썬 코드를 이용해서 base64 인코딩된 쿠키값을 만들어 주었습니다. 사용한 코드는 아래와 같습니다.
import base64
import sys
val_id='admin'
val_pw='nimda'
val_id=val_id.encode('utf-8')
val_pw=val_pw.encode('utf-8')
for i in range(20):
val_id=base64.b64encode(val_id)
val_pw=base64.b64encode(val_pw)
val_id=val_id.decode()
val_pw=val_pw.decode()
val_id.replace("1","!")
val_id.replace("2","@")
val_id.replace("3","$")
val_id.replace("4","^")
val_id.replace("5","&")
val_id.replace("6","*")
val_id.replace("7","(")
val_id.replace("8",")")
val_pw.replace("1","!")
val_pw.replace("2","@")
val_pw.replace("3","$")
val_pw.replace("4","^")
val_pw.replace("5","&")
val_pw.replace("6","*")
val_pw.replace("7","(")
val_pw.replace("8",")")
print("id="+val_id)
print("pw="+val_pw)
이 코드를 실행시켜서 나온 쿠키 값을 user, password에 각각 넣어준 후 새로고침을 해주면 문제가 풀리게 됩니다.
그리고 난 뒤 처음 페이지를 보면 id=admin, pw='nimda'로 설정된 것을 볼 수 있습니다.
'웹 > webhacking.kr' 카테고리의 다른 글
webhacking.kr 11번 (0) | 2021.02.01 |
---|---|
webhacking.kr 8번 (0) | 2021.02.01 |
webhacking.kr 5번 (0) | 2021.01.31 |
webhacking.kr 10번 (0) | 2021.01.27 |
webhacking.kr 7번 (0) | 2021.01.27 |