CTF_WEEK2_HackCTF # 5 guess me
대충 요런 문제다.
먼저 아무거나 써서 한번 제출해봤다.
요런 식으로 나온다..
(처음에 막연할 때에는 이렇게 아무거나 쳐보고 그 결과를 관찰해 보는 것도 좋은 방법 중 하나이다.)
일단 이 코드들을 분석해보쟈.
<?php를 보니 php코드이당.
코드는 뭐 별로 복잡해 보이지는 않는다!
이중 조건문....그냥 저 조건문 두개만 잘 분석하면 끝날 것 같다!
일단 *get 메소드로 입력한 변수값을 받는다.
1 - 먼저, 첫번째 조건문 분석
if (isset($guess)) {
$secretcode = trim(file_get_contents($filename));
$filename 파일을 문자열로 읽어들인 후, 공백 및 문자열을 제거하여 $secretcode 여기에 저장한다는 것 같다.
첫번째 조건문에 대한 분석은 대충 끝났고….
*~잠깐 함수 공부~*
<extract 함수>
: 일자정보에서 년도, 월, 일과 같은 특정 내용을 추출하여 반환한다.
반환값은 적절한 time zone명 또는 생략형을 포함한 문자열이다.
또한, 이 함수는 취약점을 가지고 있다.
(이 문제의 뽀인트)
이 함수 이전 변수 값을 변경할 수 있다.
-> 만약 공격자가 변수명을 알고 있다면, 이 변수에 다른 값을 덮어씌울 수 있다.
<isset 함수>
: 변수가 설정되었는지 확인하는 함수
<trim 함수>
: 공백 및 문자열을 제거하는 함수
<file_get_contents 함수>
: 전체 파일을 문자열로 읽어들이는 함수
2 - 두번째 조건문으로 가보쟈.
위의 조건문 안에 또다른 조건문이 이렇게 있다.
if ($guess === $secretcode) {
$flag = file_get_contents('flag.txt');
echo "<p>flag is"." $flag</p>";
위의 조건문과 이 조건문까지 모두 만족을 해야 플래그값을 얻을 수 있을 것으로 보인다.
일단 두번째 조건문에서 $guess === $secretcode 이 조건이 성립해야 한다.
그래야 플래그값을 출력해줄 것 이다.
$secretcode 이 값은 우리가 조작할 수 있다.
이 값은 $filename 으로부터 만들어지는 것이므로 $filename 이곳에 우리가 원하는 값을 넣어 제어할 수 있을 것 같다.
그리고 $guess 변수도 제어할 수 있다.
위에서 얘기했듯이, extract 함수에는 취약점이 있으므로 이를 이용해 이 조작을 진행할 수 있을 거다.
$filename은 'secret.txt' 파일로부터 읽어와 변수 $secretcode 에 넣는다.
그러니까 우리는 'secret.txt' 파일에 없는 아무 값이나 $filename 에 넣어주면 된다.
그러면 $secretcode 에는 당연히 아무값도 들어가지 않게 된다.
그리고 우리가 조작할 수 있는 또다른 변수 $guess 에 아무값도 넣지 않게 되면, 두번째 조건문을 만족하게 된다.
그리고 플래그값을 출력해 줄 것이다.
쨘
성공쓰