[HackCTF] Time WriteUp

Time

[문제]

문제 링크

문제에서는 is_numeric을 사용하여 숫자를 체크한다.
그리고 끝에는 time값을 int로 변환을 해준 뒤 나온 값의 시간이 지나면 플래그를 뱉어낸다.

[사진 1-1]

풀기 위해서는 5184000 ~ 7776000 사이의 값을 넣어야 하는데 단순하게 생각했을 때 해당 시간동안 계속 켜놓으면 된다.


[사진 1-2]

값이 생각보다 크지 않았다면 말이다…해당 시간을 환산해보면 최소 60일동안 켜놔야 하므로 노답이다.[1] 그래서 다른 방법을 찾아야 하는데 공식 문서에 is_numeric에 관한 설명이 기재되어 있다.

[사진 2-1]

설명에는 변수가 임의의 자릿수, 선택적 기호, 소수, 지수로 구성될 수 있다고 한다.

[사진 2-2]

마찬가지로 예제에서도 모두 true로 통과하는 것을 볼 수 있다. 그렇다는 말은 즉슨, 소수점과 지수 e를 이용하면 위의 취약점을 공략할 수 있다는 소리가 된다.
5184000을 지수와 소수점으로 바꿔서 5.184000e6 으로 입력하면 끝에 정수(int) 형변환으로 인해 결국은 소수점 뒤에 자릿수는 모두 사라지게 되어 5초 뒤 플래그를 뱉어낸다.

원래는 16진수 값도 부분적으로 true를 반환했는데 php 7.0.0 버전부터는 16진수도 false로 반환하게끔 패치되었다. 따라서 해당 서버에는 php 7.0.0 이상의 버전을 사용하고 있다는 것도 알 수 있다.

[FLAG]


  1. 1.덤으로 전기세도 와장창
공유하기