이번 문제는 조금 어려웠다..
한번 같이 풀어보자

문제에 들어가보니 view-source 와 ID, PW가 보인다(원래는 ID : guest , PW : 123qwe)
우리가 할 수 있는건 소스코드를 보는것밖에 없으니 한번 눌러보자

헐..(밑에 잘림)
뭔가 복잡해보인다...
일단 소스코드를 가져와보겠다..
<?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>
(너무 길어 편의상 접어놓겠다.)
복잡해보이지만 포기란 없다!
일단 차근차근 살펴보자
if(!$_COOKIE['user']){
$val_id="guest";
$val_pw="123qwe";
이 코드는 user 쿠키가 없으면 변수를 만드는것 같은데..
잠깐.. 쿠키..?
한번 쿠키를 살펴보자

오호라..
쿠키가 있는걸 보아 이를 변조하여 푸는 문제임을 추측할 수 있다.(아님 말고)
일단 계속해서
for($i=0;$i<20;$i++){
$val_id=base64_encode($val_id);
$val_pw=base64_encode($val_pw);
}
for은 반복문이다. 무엇을 반복하나 보니
변수 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);
흠..
이 코드는 변수에 담긴 문자들을 바꾸는 것 같다(ex.1 --> !)
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;
}
이부분은 쿠키를 설정하는것 같다.
흠..
일단 지금까지 알아낸것은
guest와 123qwe를 변수에 저장해
인코딩을 20번정도 한 뒤
문자열 몇개를 바꾸어 쿠키로 저장하는것 같다.
아래로 계속 읽어보자면
$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);
보면 위에 나온 코드진행과 반대임을 알 수 있다!(아마 인코딩한걸 푸는것같다.)
그런데 마지막 줄을 살펴보면..
decodeid==admin,decode_pw == nimde ??
분명 처음에 이름은 guest이고 패스워드는 123qwe였는데?
흠...
그렇다면 처음 부분에 있는 id 와 pw를 admin이랑 nimda로 바꾸면 해결될것같다!
하지만 어떻게 바꿔야하지..

소스코드에서 바로 바꿀수 있지 않을까 싶었지만
역시 새로고침 하니까 초기화된다..
그렇게 생각하던 와중
내가 저 코드를 직접 실행시킬 수 없을까? 라는 생각을 하게되었다!
PHP Sandbox - Execute PHP code online through your browser
onlinephp.io
이 사이트에서 직접 실행시킬 수 있으니 바로 복사해 붙여넣어보려는데

생각해보니 저렇게 그대로 작성하면 어떻게 값이 나오는지 알 수 없다..
그러니 변수를 호출해보자
호출방법 : echo or print(파이썬?)

(줄바꿔서 호출하는 방법을 모르겠어서 하나씩함.. 혹시 아시는분은 댓글 달아주세요..)
이제 위에 있는 guest 부분을 admin으로 고치면 해결될것같다!
그렇게 고쳐서 나온 값을 쿠키값에 넣게 된다면

이렇게 해결되는것을 알 수 있다.
문제 해결:)
+
처음 풀때 쿠키값에 저 값을 그대로 넣었더니 빨간색이 뜨면서 풀리지 않았다..
왜인가 보니 쿠키값에는 원래 %40 같은 url 인코딩된 값이 들어가는데 위에서 나온 값은 특수문자를 그대로 출력하여 차이가 났던것이다.
이를 해결하려면

이런식으로 코드를 작성하여 출력하면 된다.(챗지피티의 힘을 조금 빌림..)
물론 다시 풀때 쿠키값을 넣었더니 잘 작동된다..
오늘 문제는 좀 어려웠지만 자세히 분석해보니 풀만했다!
혹시 글 쓰면서 틀린 부분이 있으면 댓글 달아주세요(지적은 언제나 환영)
"할 수 있다고 생각하면 할 수 있고, 할 수 없다고 생각하면 할 수 없다." - 헨리포드
'Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge 12 (0) | 2024.10.10 |
---|---|
[Webhacking.kr] Challenge 26 (0) | 2024.10.08 |
[Webhacking.kr] Challenge 17 (0) | 2024.10.06 |
[Webhacking.kr] Challenge 16 (0) | 2024.10.06 |
[Webhacking.kr] Challenge 14 (0) | 2024.10.05 |