xcz.kr의 32번째 문제는 Easy Trick이다. 문제는 아래와 같다.
Prob Page는 인증하는 데 필요한 페이지인 것 같으니 나중에 보고, Source Page를 볼 수 있으므로 이 페이지부터 봤다.
a 변수를 GET 방식으로 받고 있고, 이 값이 12735366333132132465461????????????????????????????? 일 경우 KEY를 주는 것 같다. ?에 들어가는 값은 특정 값이 아닐 것이라고 생각했다. 아마 PHP 비교 연산자 취약점의 문제인가 싶었다. 이미 알고 있었던 PHP 비교 연산자의 취약점은 type-juggling에 의한 것 외에는 잘 모르겠어서 구글링을 했다.
접은 부분에는 서로 다른 타입이 비교 연산자에서 사용될 경우 type-juggling에 의해 발생하는 PHP 취약점에 대한 것을 정리했다. 이 문제에서 참고할 부분은 아니지만 궁금하시면 열어보세요.
PHP에서 비교 연산자(Equal, ==)를 사용할 때 두 변수의 타입이 다르다면 type-juggling에 의해 타입이 변환되고 비교한다. 따라서 정확한 비교를 위해서는 동일한 타입 인지도 비교하는 비교 연산자(Identical, ===)를 사용해야 한다. 아래의 표는 PHP 비교 연산자에 대한 것이다.
Example | Name | Result |
$a == $b | Equal | type juggling 후 $a와 $b의 값이 같으면 True |
$a === $b | Identical | $a와 $b의 타입과 값이 모두 같으면 True |
$a != $b | Not equal | type juggling 후 $a와 $b의 값이 다르면 True |
$a <> $b | Not equal | type juggling 후 $a와 $b의 값이 다르면 True |
$a !== $b | Not identical | $a와 $b의 타입 또는 값이 다르면 True |
이 문제에서 다룰 취약점은 큰 수를 비교할 때 발생하는 trick이다. 17자리가 넘는 두 수를 비교하면 17자리까지가 같고 뒤에 부분이 다르다 하더라도 같다고 인식한다. (이 블로그를 참고했다.)
다시 문제를 살펴보면 GET 방식으로 변수 a를 전달하는데 이 값이 12735366333132132465461~~면 된다. 이때 주어진 부분은 17자리 이상이므로 문제에서 주어진 물음표 29개에 맞게 인증 사이트에 아무 숫자 29자리를 입력하자.
필자의 경우 뒤의 29자리를 모두 0으로 채웠다. 키 값이 뜨고, 인증을 하면 문제가 풀린다.
[xcz.kr #21] PHP Obfuscation Crack - 300 points (0) | 2021.02.23 |
---|---|
[xcz.kr #18] Web Basic - 150 points (0) | 2021.02.23 |
댓글 영역