매직 해쉬, 0e로 시작하는 문자열에 뒤에가 모두 숫자일 경우 php에서는 float형태로 인식한다는 것이다.
매직 해쉬가 취약점이 될 수 있는데, 먼저 php.net 공식 홈페이지에서 가져온 연산자 정의를 봐보자.
== 연산자 : $a와 $b가 같으면 true
=== 연산자 : $a와 $b가 같고, 동일한 자료형일 시에 true
이 둘을 비교했을 때, ==연산자가 갖는 취약점이 무엇인지 감이 잡히지 않는가? 두 비교 대상의 자료형을 검사하지 않는 것이다. (==연산자는 문자열과 정수를 비교했을 때, 문자열이 정수(int 혹은 float)로 바뀐다.)
결과적으로 매직해쉬(0e로 시작하는 문자열 뒤에가 모두 숫자면 float형태로 인식한다)와 ==연산자(두 비교 대상의 연산자의 자료형이 동일한지 검사하지 않는다) 이 둘의 조건이 성립할 경우에, 우리는 이를 취약점으로 이용할 수 있는 것이다.
아래와 같은 코드가 있다면, 우리는 equal이라는 문구가 출력되는 것을 확인할 수 있을 것이다.
<?php
$a = 0e11111;
$b = 0e22222;
if($a == $b)
echo equal;
?>
왜 $a와 $b가 동일하다고 판단되는 걸까?
그것은 바로 e라는 지수 때문이다.
https://movenext.tistory.com/92
위의 같은 이유로 두 비교대상이 0e(...)로 시작하는 경우에는 0 * 10^(...)가 되기 때문에 0 == 0 이 될 것이다.
매직 해쉬 문제 예시(HackCTF 마법봉) >> https://jihyeong-ji99hy99.tistory.com/68
'보안 공부 > Web' 카테고리의 다른 글
[Web] SQL 쿼리 취약점 정리 (0) | 2021.11.11 |
---|---|
[Web] 웹 인코딩 종류 (0) | 2021.11.11 |
SSRF(Server-Side Request Forgery) 취약점 (1) | 2020.09.01 |
LFI(Local File Inclusion) 취약점 (0) | 2020.09.01 |
[Python] Request 모듈 사용 방법 (1) | 2020.04.30 |
댓글