PHP > LIBRARY > 매직해시(MAGIC HASHES) 취약점
 
PHP
Library
Tip&Tech
Q&A
 
PHP Function
phpschool
그누보드
LIBRARY
  HOME > PHP > LIBRARY
 
매직해시(MAGIC HASHES) 취약점
작성일 : 19-01-08
조회 : 136  

(wargame.kr  - 08_md5 compare 문제를 통해서 접한)

매직해시(MAGIC HASHES) 취약점
-비교 연산을 할 때 Type Juggling을 이용해 다른 값으로 인식되게 하는 특수한 동작
-특수한 경우('0e'로 시작하는 문자열일 경우)에만 사용가능

Type Juggling
-PHP는 변수 정의에 대해 명백한 타입 선언을 요구하지 않음
-변수 타입은 변수가 사용되는 상황에 따라 결정됨(=auto casting)

<?php $test = "0"; //now, $test is string $test += 2; //now, $test is integer $test = $test + 1.5; //now, $test is float ?>

참고 - Type Castring
-Type Juggling과 비슷한 개념
-변수 타입을 강제적으로 바꿔줌

<?php $test = '1'; echo gettype($test); //output 'string' settype($test, 'integer'); echo gettype($test); //output 'integer' ?>

특수 숫자 포맷
-16진수 : 0xC (10진수 값으로 12)
-8진수 : 0o11 (10진수 값으로 9)
-지수 : 3e2 (10진수 값으로 3 * 10^2 = 300)

매직해시
위에서 언급된 '0e'로 시작하는 문자열과 같이 특수 숫자포맷에서 본 지수 형태와 동일
즉, '0e'로 시작하는 문자열에 뒤에가 모두 숫자일 경우에는 PHP상에서 float 형태로 인식됨

<?php $ex1='0e1234'; var_dump($ex1); echo "<br\>"; $ex2='0e5678'; var_dump($ex2); echo "<br\>"; var_dump($ex1==$ex2); ?> /* 결과값 --------------------------- string(6) "0e1234" string(6) "0e5678" bool(true) ---------------------------------- string 형태로 지정을 해주었지만, PHP는 Type juggling을 통해 float 형태로 바꾼 뒤 비교를 진행하였고 0e1234 = 0 * 10 ^ 1234 = 0 0e5678 = 0 * 10 ^ 5678 = 0 결국 PHP는 둘다 0이라고 생각하여 비교를 했을 때 같다고 true값을 반환 (type casting이 된 것이 아니므로 연산 후에도 각 변수의 타입은 string으로 유지) */

대처방법

1. 암호화 함수 이용
 - 이 경우 해커가 매직해시를 노리고 '0e1234' 식으로 입력한다고 하더라도 암호화로 인해 방어가 가능 
 - 하지만 이 암호화를 통한 결과가 '0e'로 시작하고 뒤가 모두 숫자일 경우가 발견됨

md5 : 240610708 => 0e462097431906509019562988736854 
sha1 : 10932435112 => 0e07766915004133176347055865026311692244

2. 더 발전된 암호화 함수 이용
 - 암호화 결과물의 시작이 $이나 *인 함수 사용 
 - PHP 5.5 버전 이후에서는 password_hash 함수를 제공 -> 결과값이 $로 시작할 뿐더러 매번 암호화할 때마다 값이 달라짐

3. 형변환하지 않는 비교(===) 사용
 - 비교 연산자를 == 대신 ===를 사용한다면 Type Juggling을 진행하지 않아 매직해시는 통하지 않음


 
 

Total 77
번호 제   목 조회
공지 php 라이브러리 423
77 매직해시(MAGIC HASHES) 취약점 137
76 Trait 136
75    Trait 149
74 Overloading 142
73    Overloading 138
72 Type hinting/Type 설정하기/Throw error 134
71    Type hinting/Type 설정하기/Throw error 110
70    Type hinting/Type 설정하기/Throw error 141
69 object clone 152
68    object clone 135
67 serialize / unserialize 133
66 spl_autoload_register(오토로드) 122
65 window에서 composer깔기 140
64 Exception/try/throw/catch 139
63 Error의 종류 134
62    Error의 종류 137
61    Error의 종류 136
60 eval 134
59 Magic_methods 142
58    Magic_methods 146
 1  2  3  4  
 
개인홈페이지 덤벙닷컴은 프로그래머와 디자이너위한 IT커뮤니티 공간입니다.
Copyright ⓒ www.dumbung.com. All rights reserved.