
들어가면 php코드와 어떤 값을 제출하는게 보입니다.
위의 코드를 해석해보면
filename 변수에 "secret.txt' 문자열이 들어가있고 extract 함수로 GET메소드를 사용합니다.
guess는 우리가 입력한 값이 들어가게 되고
secretcode는 filename 변수의 값인 secret.txt에서 내용을 읽어옵니다.
그래서 guess와 secretcode가 같다면 flag를 나타낸다는 것이군요 :D
여기서 주의 깊게 보셔야할 것은 extract 함수입니다!
extract 함수에는 취약점이 있는데요 :D
&_GET 또는 $_POST로 인자를 전달 시에 파라미터의 값을 초기화할 수 있습니다.
그렇다면 이 문제는 어떻게 풀 수 있을까요?

extract 함수를 이용해서 filename의 인자를 전달하고 있기 때문에 취약점을 이용하여
filename의 값을 초기화 시킬 수 있습니다!
[문제풀이] 그림처럼 넣으면 filename은 abcd 값으로 초기화되고
파일이 존재하지 않기 secretcode에는 아무런 값이 들어가지 않습니다!
즉, filename과 guess는 둘다 아무런 값을 가지지 않기 때문에
flag가 뿅! 하고 나올거예요 :D
그럼 저 함수는 무조건적으로 취약한걸 까요? 당연히 조건이 있겠죠 :D
1) 변수가 선언한 뒤에 extract 함수가 오면 취약하다.
2) 내부변수의 이름을 알아야 한다.
그럼 안전하게 쓰여질려면 어떻게 해야할까요?
1) extract 함수로 인해서 값이 덮여진다면 다시 다른 값으로 덮어준다.
2) EXTR_SKIP 옵션을 사용해 준다.
1번은 다시 덮어다주면 사용자가 변수를 자기마음대로 줘도 값이 설정값으로 돌아가겠죠 :D
2번은 충돌이 있을 경우 덮어쓰지 않게 하는 옵션입니다.
자세한 사항은 php 정식홈페이지에서 확인하시면 될 것 같네요 !
https://www.php.net/manual/en/function.extract.php
PHP: extract - Manual
[New Version]This function is very useful for filtering complicated array structure.Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.Code: GET,INPUTPOST=>_POST, INPUT_COOKIE => $_COOKIE,
www.php.net
제 포스터를 봐주셔셔 감사하고 공부하신다고 수고 많으셨어요 :D
'CTF > HackCTF' 카테고리의 다른 글
Web - 마법봉 (0) | 2020.01.23 |
---|---|
Web - Read File (0) | 2020.01.21 |
Web - 보물 (0) | 2020.01.09 |
Web - Button (0) | 2020.01.09 |
Web - Hidden (0) | 2020.01.09 |