코딩 공부
<webhacking.kr> old-06 본문
*공부하면서 풀이과정처럼 쓴 글입니다! 틀린 부분이 많을 수도 있어요!*
>view source를 클릭
1. PHP
(3) $_GET['view_source']
여기서 $는 변수, _GET은 GET 방식으로 입력받은 변수를 뜻함. GET 방식은 URL 주소창에 변수값이 표기된다.
그래서 view source 를 클릭하면 URL이 https://webhacking.kr/challenge/web-06/ 에서 https://webhacking.kr/challenge/web-06/?view_source=1 로 변경된다.
(4) if(!$_COOKIE['user'])
여기서 쿠키란 사용자의 정보를 브라우저 안에다 저장을 하는 것이다. 어떤 사이트에 로그인을 하게 되면 사용자 컴퓨터에 쿠키를 저장해 놓고 그 쿠키를 가지고 있는지를 확인하여 회원인지 판단한다. 쿠키의 총용량은 4kb고 더 많은 정보를 저장하려면 데이터베이스를 사용해야 한다.
$_COOKIE['user'] 는 user라는 이름으로 저장되는 쿠키 변수에 접근한다. 앞에 !는 부정연산자로 true를 false로 false를 true로 바꾼다.
그러므로 위 코드의 뜻은 user라는 쿠키가 없을시 다음에 오는 코드를 실행하라는 뜻이된다.
(5)(6)
$val_id="guest";
$val_pw="123qwe";
(4)의 if문이 실행되면, val_id라는 변수는 guest로, $val_pw는 123qwe로 선언한다. ($변수이름 = 초깃값;)
(7) for($i=0;$i<20;$i++){
for문은 (초기식; 조건식; 변화식)으로 이루어지고 따라오는 {} 안에 반복할 코드가 들어간다. 위에는 변수 i가 0에서 19까지 (20보다 하나 작은 정수) 하나씩 더하면서 반복된다. 따라서 위 for문은 0~19, 20번 반복된다.
(8)(9)
$val_id=base64_encode($val_id);
$val_pw=base64_encode($val_pw);
base64_encode()는 PHP에 내장된 함수이고 데이터를 MIME base64로 부호화하는 것이다 (encode). MIME이란 Multiple Internet Mail Extensions 이다. 따라서 val_id라는 변수에 base64로 해당 변수를 인코딩을 한 값을 넣는다. val_pw에도 똑같이 적용된다.
(7)의 for문이 20번 반복되기에 위에 코드는 20번 암호화된다.
(11) $val_id=str_replace("1","!",$val_id);
str_replace는 문자를 변환할때 사용되는 함수이다. str_replace("찾을 문자", "변경할 문자", "해당하는 문자열");로 사용된다. 위에 코드는 val_id 문자열에 있는 모든 '1'들을 '!'로 변환한다. (27)까지 똑같이 적용된다.
(29) Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");
Setcookie는 쿠키값을 설정한다. setcookie(쿠키명, 쿠키값, 만료시간, 경로, 도메인, 보안, httponly);
- 쿠키명(필수) : 설정 될 쿠키 이름을 결정함
- 쿠키값(선택) : 쿠키 이름에 입력될 값
- 만료시간(선택) : Default 값은 0이며 쿠키가 유지될 시간을 설정
- 경로(선택) : 경로를 지정할 경우 특정 위치와 하위 경로에서만 사용가능하도록 설정됨
- 슬러쉬(/) : 슬러쉬 기호를 값으로 입력할 경우 전체 경로에서 사용됨을 의미
- 도메인(선택) : 사용될 도메인을 지정가능함. 서브도메인 입력시 해당 서브도메인만 사용가능
- 보안(선택) : 보안 프로토콜인 https에서만 사용가능하도록 설정함
- httponly : HTTP에서만 사용가능하도록 하여(서버단 언어로만...) 스크립트에 의한 쿠키 접근을 허용안하게 함.
따라서 위 코드는 user라는 쿠키에 val_id의 값을 입력해서 86400초동안 (1일) 쿠키가 유지되게 하고 /challenge/web-06/ 하위 경로에서만 사용할 수 있도록 설정한다. (30)에도 똑같이 적용된다.
(31) echo("<meta http-equiv=refresh content=0>");
PHP 문서안에 HTML 태그를 포함시키려면 echo 함수를 이용한다. echo 는 이후의 내용을 출력하는 역할을 하기에 echo 의 인자로 HTML 태그를 포함시킴으로서 HTML 태그를 표현 할 수 있게 된다.
HTML의 meta 태그는 웹 서버와 브라우저간에 상호 교환되는 정보를 정의한다. http-equiz="refresh"는 특정 시간 후 자동으로 웹 페이지를 새로고침한다. 뒤에 나오는 content 는 그 특정 기간을 설정한다. 위 코드에서는 0이므로 바로 새로고침한다.
(44)(45)
$decode_id=$_COOKIE['user'];
$decode_pw=$_COOKIE['password'];
decode_id라는 변수를 user라는 이름을 가진 쿠키로 초기화하고 decode_pw라는 변수를 password라는 이름을 가진 쿠키로 설정한다.
(47~63)
(11~27)처럼 변환한다.
(65~68)
for문을 이용해 전에 인코딩한 문자열을 다시 디코딩한다.
(70) echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
<hr>은 html 태그로 가로줄이다.
<a>는 anchor의 약자로 하이퍼링크를 걸어주는 태그고 href 뒤에 오는 링크로 이동하게 한다. 위 코드에서 href는 ./?view_source=1이다. <br>은 줄바꿈 태그이다.
따라서 이 코드는 노랑색 글씨로 쓰여진 view-source에 링크를 걸어 클릭 시 ./?view_source=1로 이동하게 한다.
(71) echo("ID : $decode_id<br>PW : $decode_pw<hr>");
디코딩된 ID와 PW를 화면에 출력한다.
(73) if($decode_id=="admin" && $decode_pw=="nimda"){
&&은 AND 연산자로 앞과 뒤에 나오는 연산이 모두 참일때만 실행되게 한다. 위에 코드는 decode_id 변수가 admin이고 decode_pw 변수가 nimda 일때 다음 코드를 실행한다.
2. 문제 풀이
마지막에 나온 코드를 보면 decode_id가 admin이고 decode_pw가 nimda일때 문제를 풀었다고 나온다.
(29~30)을 보면 user라는 이름의 쿠키에 val_id라는 변수의 값을, password라는 이름의 쿠키에 val_pw 변수의 값을 입력한다. EditThisCookie (크롬 확장프로그램)으로 봤을때 user와 password에 입력된 값은 코딩에 따라 인코딩된 val_id와 val_pw 변수라는 것을 알 수 있다. 따라서 admin과 nimda를 동일한 방식으로 인코딩하여 EditThisCookie에 넣으면 문제가 해결된다.
reference
쿠키 정의- https://www.everdevel.com/PHP/cookie/
PHP와 HTML - https://devist.tistory.com/59
Meta refresh - https://en.wikipedia.org/wiki/Meta_refresh
'워게임 풀이 연습' 카테고리의 다른 글
<SQL Injection Attack> 01. SQL 인젝션 활용 (0) | 2020.05.01 |
---|---|
<webhacking.kr> old-16 (0) | 2020.03.28 |
<webhacking.kr> old-14 (0) | 2020.03.27 |