본문 바로가기

스터디/CTF

ctf 공부 10일차

HackCTF

Web - Guess me

값을 입력해서 넘겨주면, GET방식으로 guess 변수에 넘겨준다.

아래의 php코드를 해석해보자.

extract함수는 배열 타입으로 넘어오는 키값들을 변수화한다고 한다. 즉, get으로 넘겨주는 모든 변수들을 해당 페이지에서 변수로 사용가능하게 된다는 것이다. guess로 값을 넘겨준 것도 그 중 하나이므로 사용 가능한 것이고.

guess변수에 저장된 값이 존재하면,

secret.txt($filename)에 저장된 내용을 문자열로 읽어들여서, 문자열의 시작부분과 마지막 부분에 공백(or 특수문자)을 제거해주어 secretcode 변수에 저장한다.

내가 입력해줄 guess 변수의  내용과 secretcode 변수의 내용이 동일하면 flag를 출력해준다.

 

경로가 바로 현 디렉토리에 secret.txt가 있는 것 같아 시도해보니, 역시나 그렇게 쉽게 flag를 주진 않았다.

 

근데 당연히 내가 secret.txt의 내용을 모르기 때문에 secretcode의 값은 추측이 불가능하다.

아무래도 취약점을 이용해야 할 것 같은데, 사용한 file_get_contents함수가 가장 유력하다고 착각을...

extract 함수로 인해 get 방식으로 넘겨준 변수는 모두 사용 가능하고, 그 중 filename이름의 변수도 넘겨주면 guess변수와 비교하는 파일 내용을 조작해줄 수 있다.

 

[방법 1] 

filename으로 아무 값이나 넘겨주면 거의 99%의 확률로 없는 파일일 것이고, 따라서 그에 대한 file_get_contents로 아무 값도 가져오지 못할 것이므로 secretcode에도 아무 값도 저장되지 않게된다. 따라서 아무 값도 안준 상태의 guess변수와 무의미한 filename을 get방식으로 동시에 넘겨주면 guess변수와 secretcode변수가 같게 된다.

[방법2]

당연히 사이트의 파일 내용을 모르니까 존재하지 않는 파일을 지정해줘야 한다고 생각했지만, 방법이 더 있었다. 

예전에 풀었던 문제에서 다음과 같은 파일의 내용과 경로를 알게 되었다.(robot문제)

이걸 이용해서 값을 넘겨주면, 

아래와 같이 flag가 출력된다.

 

근데 다른 사이트로 시도했을 때는 안되던데,,,다음에 다시 해보는걸로..

 

ctf.j0n9hyun.xyz:2030/?guess={"cod":401,%20"message":%20"Invalid%20API%20key.%20Please%20see%20http://openweathermap.org/faq#error401%20for%20more%20info."}&filename=https://api.openweathermap.org/data/2.5/weather

Guessing Game (j0n9hyun.xyz)

'스터디 > CTF' 카테고리의 다른 글

ctf 공부 11일차  (0) 2021.07.18
ctf 공부 11일차  (0) 2021.07.17
ctf 공부 9일차  (0) 2021.07.13
ctf 공부 8일차  (0) 2021.07.12
ctf 공부 7일차  (0) 2021.07.11