[Web Hacking] HackCTF Guess me(100p) Write Up
HackCTF Web 분야 Guess me(100p) 문제 풀이입니다.
주어진 URL로 접속해보자.
비밀 코드를 맞추면 플래그를 얻을 수 있다고 한다.
먼저, 소스코드를 살펴보자.
파일 secret.txt의 내용을 변수 $secretcode에 넣어두고, 이 값을 extract($_GET);으로 받아온 값인 변수 $guess와 비교하여 동일한 값이라면 플래그를 출력하는 구조이다.
본 문제는 PHP extract() 함수의 취약점을 다루고 있다.
extract() 함수를 통해 $_GET 또는 $_POST로 넘어온 인자는 함수 사용 전의 기존 값을 overwrite할 수 있으며,
이를 방지하기 위해서는 변수를 선언하기 이전에 extract() 함수를 사용하여야 하고 overwrite를 방지하기 위해 EXTR_SKIP 옵션을 사용하여야 한다.
[관련 게시글] [Web Hacking] PHP extract() function 취약점
[Web Hacking] PHP extract() function 취약점
PHP extract() function extract() 함수는 배열 속의 키 값들을 변수화하는 역할을 한다. // Code 1 - Example of using the PHP extract() function <?php $a[x] = 1; $a[y] = 2; extract($a); echo "x = $x"; ec..
hooneee.tistory.com
위 코드에서 변수 $filename을 선언한 다음, extract($_GET);를 사용한 것이 취약점 발생의 원인이며, 이러한 경우에는 해당 URL에서 변수 $filename을 직접 초기화 및 우회할 수 있다.
따라서, 아래와 같이 URL을 조작하여 플래그를 출력할 수 있다.
http://ctf.j0n9hyun.xyz:2030/?filename=&guess
http://ctf.j0n9hyun.xyz:2030/?filename=1&guess=
변수 $filename에 해당 웹서버에 존재하지 않는 파일명을 기입하거나 공백으로 둘 경우, 변수 $secretcode에 아무런 값이 들어가지 않을 것이다.
마찬가지로, 변수 $guess에도 아무런 값을 넘겨주지 않으면 $guess === $secretcode가 성립되어 플래그가 출력된다.
Flag : HackCTF{3xtr4c7_0v3rr1d3ds_pr3vi0u5_kn0wn_v4r1abl35}