보안을 그리다, 훈이

[Web Hacking] HackCTF Guess me(100p) Write Up 본문

Security/Wargame

[Web Hacking] HackCTF Guess me(100p) Write Up

HooNeee 2022. 1. 26. 17:03

 

HackCTF Web 분야 Guess me(100p) 문제 풀이입니다.

 

[HackCTF] Challenge Guess me

 

주어진 URL로 접속해보자.

 

http://ctf.j0n9hyun.xyz:2030

 

비밀 코드를 맞추면 플래그를 얻을 수 있다고 한다.

 

먼저, 소스코드를 살펴보자.

 

파일 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가 성립되어 플래그가 출력된다.

 

Get the Flag!

 

Flag : HackCTF{3xtr4c7_0v3rr1d3ds_pr3vi0u5_kn0wn_v4r1abl35}

 

Comments