-
<XCZ.KR> 18번 문제Wargame/XCZ.KR 2021. 11. 2. 17:22
Title이 Web Basic인걸로 보아 웹 해킹 문제인듯 하다.
우선 View source를 통해 페이지 소스를 먼저 살펴보겠다.
굉장히 보기 힘든 변수들로 이루어진 PHP문이 있다. 우선 읽기 힘든 변수들 먼저 바꿔보겠다.
<? $key = "Congratulations!</br>Key is ??????????????????"; $A = @$_COOKIE['c']; $B = @$_GET['g']; $C = @$_POST['p']; if(empty($A) || empty($B) || empty($C)){exit ('wrong T.T');} $D = $B . $A; $E = $C; function test($a){ $b = ''; for($i=0; $i < strlen($a); $i++){ $b = $b . ' - ' . ord(substr($a,$i,1)); // substr(문자열, 시작위치, 길이) } return $b; } if(test($D)==" - 103 - 105 - 118 - 101 - 109 - 101 - 112 - 97 - 115 - 115 - 119 - 111 - 114 - 100" || test($E) == " - 107 - 101 - 121 - 112 - 108 - 122 - 33"){ echo $key; } else{ echo 'wrong T.T'; } ?>
쿠키로 받은 값을 $A, GET 방식으로 받은 값을 $B, POST 방식으로 받은 값을 $C라 한다. 그리고 $A, $B, $C중 하나라도 비어있다면 'wrong T.T'를 출력한다.
$D는 $B와 $A를 이어붙였고, $E는 $C이다.
그리고 test함수가 나와있다. $b는 빈문자열로 시작하고 파라미터로 받은 $a의 길이만큼 반복한다. 한번 반복할때 마다 $b에 '-'와 문자($a의 문자를 아스키코드로 변환한 것)를 이어붙인다. 아래엔 $D와 $E를 test함수에 인수로 준 결과가 주어져있다. 우선, 결과의 숫자들을 아스키코드로 변환시켜본다.
아스키 코드표를 보고 변환시키면 $D는 'givemepassword', $E는 'keyplz!'가 나와야 한다.
즉, $B와 $A는 'givemepassword'를 마음대로 나누면 되고, $C는 'keyplz!'가 되어야 한다.
먼저 GET 방식으로 $B를 먼저 보낸다.
GET 방식은 데이터를 URL뒤에 붙여보내면 된다.
'?'로 URL의 끝을 알리고, 데이터 표현의 시작점을 알린다. @$_GET['g']이므로 'g=giveme'로 $B를 보낸다.
다음으로 COOKIE를 보낸다.
우선, 현재 쿠키를 알아본다. 주소 창에 'javascript:alert(document.cookie);'를 치면
현재 페이지의 쿠키값이 뜨게된다. 쿠키로 보낸 'c'의 값이 'password'가 되야하므로
다시 주소 창에 'javascript:document.cookie='c=password';alert(document.cookie);을 치면
쿠키에 'c=password'라는 값이 추가된 것을 확인할 수 있다.
마지막으로, POST로 보내기다.
POST는 GET 방식과 달리 겉에 드러나지 않는다.
POST 방식은 URL 쿼리로 넘겨줄 수 없기 때문에 따로 POST 방식의 폼을 넣어주어야 한다.
개발자 도구(F12)의 Elements의 Body내에 마우스 오른쪽 버튼의 'Edit as HTML'을 통해 POST 방식의 폼을 넣는다.
POST 폼을 만들면 입력 창이 하나 생긴다.
여기에 $C가 되어야 하는 문자열인 'keyplz!'를 쓰고 Submit 버튼을 누르면
$A, $B, $C가 서버로 모두 전해졌고, PHP 구문을 통해 인증 키 값을 획득할 수 있게 된다.
'Wargame > XCZ.KR' 카테고리의 다른 글
<XCZ.KR> 32번 문제 (0) 2021.11.07 <XCZ.KR> 21번 문제 (0) 2021.11.03