일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- leetcode 5
- 올바른 변수명 짓기
- leetcode 561
- webcrawler
- MapReduce 실습
- leetcode 49
- 블로그 이전했어요
- Python
- 문자열 조작
- leetcode 234
- Hortonworks Sandbox
- 배열
- leetcode 344
- airflow docker
- 컴퓨터구조
- wargame.kr
- 데이터레이크와 데이터웨어하우스
- leetcode 15
- 머신러닝
- ctf-d
- leetcode 937
- 빅데이터를 지탱하는 기술
- leetcode 819
- leetcode
- leetcode125
- Hadoop
- docker로 airflow 설치하기
- leetcode 121
- leetcode 238
- 스파크 완벽 가이드
- Today
- Total
HyeM
[Webhacking.kr] 6번문제 본문
오늘의 문제는 6번!
1. 웹페이지와 소스코드
우선 6번 문제에 들어가 보자.
view_source로 들어가보면 , 다음과 같은 코드를 확인 가능하다.
코드보려면 밑에 클릭!
2. 소스코드 분석
문제를 풀기 위해서, 위의 view-source의 네모상자 안의 코드만 해석해본다.
if(!$_COOKIE['user']){ //'user'라는 이름의 쿠키가 없으면,
$val_id="guest"; //변수 'val_id'의 값은 guest
$val_pw="123qwe"; // val_pw의 값은 123qwe로 설정한다.
for($i=0;$i<20;$i++){ //반복문을 20번돌며,
$val_id=base64_encode($val_id); //val_id에 val_id를 base64로 인코딩하여 저장한다.
$val_pw=base64_encode($val_pw); //val_pw도 마찬가지
}
// str_replace함수를 이용하여 1~8의 숫자를 각각 다른 문자로 바꾸어준다.
$val_id=str_replace("1","!",$val_id); //:val_id의 1을 !로 바꿈 1=> !
val_id=str_replace("2","@",$val_id); // 2=> @
$val_id=str_replace("3","$",$val_id); // 3=> $
$val_id=str_replace("4","^",$val_id); // 4=> ^
$val_id=str_replace("5","&",$val_id); // 5=> &
$val_id=str_replace("6","*",$val_id); // 6=> *
$val_id=str_replace("7","(",$val_id); // 7=> (
$val_id=str_replace("8",")",$val_id); // 8=> )
$val_pw=str_replace("1","!",$val_pw); //:val_pw의 1을 !로 바꿈 1=> !
$val_pw=str_replace("2","@",$val_pw); // 2=> @
$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/");
// /challenge/web-06/의 경로에서 쿠키이름을 각각 user, password로 지정 후, 위에서 바꿔준 val_id와 val_pw의 값을 각각 넣어준다. 그리고 쿠키의 만료시간은 초단위로 86400초로 지정해주었다
echo("<meta http-equiv=refresh content=0>");
// (0초뒤에) 현재 페이지로 이동
exit;
}
* 문법정리
● Base64_encode( ) : base64로 인코딩 Base64_encode( 인코딩할 문자 ) # base64 : 8비트 이진 데이터를 문자 코드에 영향을 받지 않은 공통 ASC|| 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다. |
● Str_replace( ) : 문자 바꾸기 (치환) Base64_encode( 변경대상문자, 변경하려는 문자, 변수(replace가 바꾸고자 하는 문자열 ) )
|
● Setcookie( ) : 쿠키 사용하기 setcookie (쿠키명, 쿠키값, 만료시간, 경로, 도메인, 보안, httponly); - 도메인 : 사용될 도메인을 지정가능함,.서브도메인 입력시 해당 서브도메인만 사용가능 - 보안 : 보안 프로토콜인 https에서만 사용가능하도록 설정함 - Httponly : HTTP에서만 사용가능하도록 하여 스크립트에 의한 쿠키 접근을 허용안하게 함. |
● <meta http-equiv=” “ content= ; url = ”> : meta태그로 간단하게 페이지 넘겨주기 <meta http-equiv=”refresh” content”시간(초단위); url= 이동하고자 하는 웹페이지나 미디어주소”> |
$decode_id=$_COOKIE['user']; // decode_ id에 user 쿠키값을 넣어준다.
$decode_pw=$_COOKIE['password']; // decode_pw에 password 쿠키값을 넣어준다.
$decode_id=str_replace("!","1",$decode_id); // decode_id의 !를 1로 바꾸어준다.
$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의 !를 1로 바꾸어준다.
$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);
/*
즉, “ 위에서 인코딩 20번하고 바꾸기 작업(1~8 => 특수문자) 한 값 ” = 쿠키값 을
받아와, 복구 시켜주기 위해
“ 바꾸기작업 하고 디코딩 20번”을 해준다.
*/
for($i=0;$i<20;$i++){ // 20번동안 for문을 돌며 decode_id와
$decode_id=base64_decode($decode_id);
$decode_pw=base64_decode($decode_pw); // decode_pw의 값을 base64로 디코딩한다
}
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"){ //만약 decode_id와 decode_pw를 디코딩한 값이 admin과 nimda라면 성공이다.
solve(6);
}
?>
3. 풀이방법
[ 코드 정리 ]
user라는 이름의 쿠키값이 없으면, {
id를 guest로 pw를 123qwe로 지정해주고,
id와 pw를 base64로 인코딩을 20번 반복한다.
그 후엔, id와 pw의 1~8의 값을 특수문자로 바꾸어주고
그 값을 각각 user와 password의 이름의 쿠키로 설정해준다.
}
쿠키값 user와 password를 변수로 저장하여
특수문자를 1~8로 바꾸어준 후
Base64로 디코딩을 20번 반복한다.
만약{
Id가 admin이고, pw가 nimda이면 문제는 해결이다.
}
[ 풀이계획 ]
Cooxie 툴을 이용하여, user와 password 값을
Admin과 nimda로 하고,
Base64인코딩 20번 돌려
이 중 1~8의 값을 특수문자로 바꾼다.
=> 인코딩하여 특수문자로 바꾸는 것을 하나하나 하는 것은 어려우므로,
php코드를 짜서 해결한다.
4. 풀이
1) php언어로 코드짜기
위의 코드를 페이지화면에 띄우면, 첫째줄은 val_id의 값, 두번째줄은 val_pw값이 나온다.
2) 그 결과 값을 EditThisCookie를 열어, user와 password 값에 넣어준다
3) 새로고침F5 하면 , 성공!
문제사이트 => https://webhacking.kr/old.php
'Wargame > Web Hacking' 카테고리의 다른 글
[Wargame.kr] QR code Puzzle (0) | 2020.03.21 |
---|---|
[Wargame.kr] flee button 풀이 (0) | 2020.03.21 |
[Wargame.kr] already got 풀이 (0) | 2020.03.21 |
[Webhacking.kr] 14번문제 (0) | 2020.02.24 |
[Webhacking.kr] 1번문제 (0) | 2020.02.17 |