[PHP] Magic Hash

두비니

·

2021. 3. 26. 02:56

 

 

 

 

 

 

오늘은 취약점...?이라고 하기에는 애매하지만, 아무튼 unintended한 동작으로 이루어지는 magic hash에 대해서 알아볼 것입니다. 봅시다.

 

1. Type juggling이란?

기본적으로 Type juggling이라는 개념을 알고 가야 합니다. Type casting이라고도 하죠.

말은 처음 들을수도 있지만 다들 코딩공부 하셨다면 다들 "형변환"에 대해서 들어보셨을겁니다. 직접 코딩할때도 수도없이 쓰고요.

 

다음 코드의 결과값을 예측해봅시다.

 

#include <stdio.h>

int main(){
    double a = 1.23;
    int b = int(a);
    print("%d", b);
    
    return 0;
}

 

간단한 코드죠. 당연히 다음 값의 결과는 1이 나오겠죠?

기본적으로 다음과 같은 원리입니다.

더 본격적인 이야기를 해봅시다.

 

2. PHP기준으로 이야기해봅시다

magic hash는 PHP기준으로 ==로 비교해서 발생하는 취약점입니다.

PHP 는 좌우가 같은 자료형이어도 최적의 자료형을 찾거든요.

 

참고로 그 순서는 string >> float >> int입니다.

 

예제를 보면서 대충 느낌을 받읍시다.

‘123’ == 123   //(int 비교, 좌변이 string->int 로 형변환)
‘1.5’ == 1     //(float 비교, 좌변이 string->float, 우변이 int->float 으로 형변환)

 

그래서 다음과 같은 상황에서 이 코드는 취약하게 됩니다.

상황 : 어떤 사람의 아이디/비번이 각각 'admin', 0e1234라고 하고,

해커가 'admin', 0e1111로 해킹을 하려고 한다.

 

$userinfo = mysql_query("SELECT * FROM `member` WHERE `id` = 'admin'");
 
//php try not string compare, but float compare.
if ($userinfo['pw'] == $_POST['pw']) {
    echo 'success!';
}
else {
    echo 'failed';
}

 

코드는 다음 링크에서 가져왔습니다 : blog.lael.be/post/1238

 

PHP Magic Hash Vulnerability 취약점

PHP 의 Magic Hash 취약점에 대해서 알아보았다.     실제로 Magic Hash 는 취약점이 아니라 특수동작입니다.   이론 우리가 다루는 대부분의 자료형은 “문자형(String)” 입니다. 일부 프로그래밍 언어

blog.lael.be

이 경우에서는 pw를 비교하는 if문에서 PHP의 특성때문에 true가 반환됩니다. 값에 상관없이 0eXXXX...는 0이니깐.

따라서 0e로 시작하는 아무 값이나 넣어도 뚤립니다.

 

3. 결론

그래서 이 비교방법으로 인해 생기는 magic hash는 꽤 많습니다.

아래 링크에 매직 해시가 매우 많으니, 한번 보시는게 좋을 것 같네요.

www.whitehatsec.com/blog/magic-hashes/

 

Magic Hashes | WhiteHat Security

For more than the last decade, PHP programmers have been wrestling with the equals-equals (==) operator.

www.whitehatsec.com

 

4. 예방방법

PHP에서는 ==, !=가 약한 비교이기때문에, 강한 비교인 ===, !==로 바꿔주셔야 합니다.

그리고 너무 특수한 상황에서의 공격인지라, 그냥 워게임에 한번쯤은 있을 수 있는 느낌정도네용. 아무튼 끝!

 

 

참고자료

designmywebpage.blogspot.com/2013/06/type-juggling-and-type-casting.html

 

Type Juggling and Type Casting

Type Juggling: PHP does not require (or support) explicit type definition in variable declaration; a variable's type is determined b...

designmywebpage.blogspot.com