보안 전공생의 공부

HackCTF #5 Guess me 본문

Wargame/web

HackCTF #5 Guess me

수잉 2021. 1. 15. 11:10

플래그를 획득해야한다.

링크에 들어가 문제를 확인해보았다.

GET방식으로 guess 값을 입력해 URL에 넘겨준다.

만약 변수 guess가 존재한다면,

secret.txt를 file_get_contents함수를 통해 문자열로 읽어주어 이를 변수 secretcode로 정의한다.

(trim은 문자열의 앞뒤에 생기는 불필요한 공백을 없애주는 함수이다)

=== 는 처음보는 연산자여서 검색을 해보았더니,

두 변수의 뿐만 아니라 그 유형까지도 일치하는지 판단하는 것이였다.

(출처 : https://velog.io/@filoscoder/-%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4-oak1091tes )

변수 guess와 secrecode(secret.txt를 문자열로 변환한 것)가 일치하면 flag를 얻을 수 있다.

guess와 filename을 조작 guests === secretcode가 참이 되게 해야한다.

둘 다 문자열이고, 값이 일치하게 하면 되는 것이다.

filename은 이미 첫번째 줄에서 초기화하였는데, 어떻게 변수를 덮어쓸 수 있을까?

이는 extract함수의 취약점을 이용하면 된다.

https://aceatom.tistory.com/164

 

 

예를 들어,

처음에 filename이란 변수에 secret.txt를 초기값으로 주었지만

파라미터로 filename=Xx을 리퀘스트하면

filename이라는 변수에 Xx가 들어가는 것이다.

filename의 값을 aaa로 변경해주면, 해당 파일은 없기때문에 file_get_contents에 의해 아무것도 문자열로 변환되지 않은 채 secretcode 변수에 담길 것이다.

그러면 guess도 값이 없도록 하면(입력창에 아무것도 입력 X) , filenmae===guess가 될 것이다.

논리연산자인 && 대신 비트연산자인 &을 이용해

아무값이나 넣은 filename은 결국 false이므로 0

guess = "" 이므로 null이므로 0이 된다.

0 ==0이므로 if문은 참이되어 플래그값을 얻을 수 있다.

(참고 : https://it-jin-developer.tistory.com/9 )

 

플래그는 HackCTF{3xtr4c7_0v3rr1d3ds_pr3vi0u5_kn0wn_v4r1abl35}

이다.

Comments