본문 바로가기
보안 공부/Web

PHP 비교 연산자 취약점, 매직 해쉬

by 그적 2020. 7. 31.

매직 해쉬, 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

댓글