본문 바로가기

web/웹 해킹 및 보안

PHP 비교 연산자 취약점 (magic hash)




안녕하십니까 

오늘은 php의 비교 연산자 취약점에 대해서 알아보겠습니다.


비교연산자란 ?

컴퓨터 언어인 FORTRANCOBOL 등의 두 변수, 값, 주소의 비교에 사용되는 기호로 관계 연산자의 일종. 



라고 설명이 나와 있습니다.  



php의 공식 홈페이지에서 설명하는 비교 연산자의 설명입니다.



간단한 사용방법과 동작 원리가 설명 되어 있습니다. 

여기서 중요한 것은 문자열이 수로 변환 된다.  두개의 수 문자열을 비교하면, 정수로 비교 된다. 라고 나와 있습니다.


비교연산자는 정수의 형태로 비교된다라는 것을 이용한 취약점이라고 생각하시면 될 것 같습니다.


일단 취약점을 간단하게 소개해 보면 

아래와 같은 php 코드를 실행시켜 보면


0e123456과 0e88888888이 다르지만, 코드를 실행키며 보면, true가 출력 됩니다.




이 비교연산자의 취약점은 e라는 지수 때문에 발생합니다.


e가 무엇인지에 대한 설명은 인터넷에 검색해보면 알 수 있습니다. 




이라는 의미를 가지고 있습니다. (정확 한지는 모르겠습니다. 수학을 못해서)


이러한 의미를 가지고 있는 e를 php 비교 연산자에 입력한다면,

정수의 형태로 비교하는 php 비교연산자는 0e1234를 0* 10^1234로 인식하게 될 것 입니다. 

그러므로  0e888888 == 0e123456 은 결과 값이 서로 다 0 으로 해석되어 0==0이 됩니다. 




이 취약점이 사용 되는 곳은 바로 웹에서 hash를 사용 했을 경우에 해당 됩니다.

md5나 sha256으로 값을 암호화 하여 비교할 때 사용 할 수 있습니다.





매직 해쉬의 경우에 아래에 잘 설명되어 있습니다.

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





위의 테스트 php 버전 정보




아래는 제가 짜 놓은 php 매직 해쉬를 찾는 코드입니다. 

https://github.com/intadd/php_magic_hash