[PHP] strncmp 취약점(인증우회)

두비니

·

2021. 3. 21. 22:27

 

 

 

 

 

 

 


strncmp 취약점

php


 

 

 

 

1. 취약점 알아보기

오늘은 strncmp의 인증 취약점에 대해서 알아보려고 합니다. 먼저 함수의 원형을 봅시다.

int strcmp ( string $str1 , string $str2 )

 

각 str1과 str2를 인자로 넣어주면 리턴값으로 두 값이 같으면 0, 다르면 0이 아닌 값을 리턴합니다.

이 리턴값에 대해서 조금 더 봅시다.

 

Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

이렇게 두 값에 따라서 리턴값이 정해지는데, 특정 PHP 5.3에서 취약점이 발생한다고 합니다.

 

결론만 먼저 이야기하자면 인자로 string이 아닌 배열을 넣어줄 경우, strcmp함수는 무조건 NULL을 반환한다고 합니다.

 

PHP 버전 5.2 에서는 strcmp(String, Array()) 시에 Integer (1 or -1) 을 반환하고,

PHP 버전 5.3 에서는 strcmp(String, Array()) 시에 NULL 을 반환합니다.

(PHP 버전 5.2에서는 Array()를 "Array" 라는 문자열로 변환하여 비교를 하게 됩니다.)

 

현재 문제가 발생하는 PHP 5.3 버전을 보면, strcmp 함수의 인자 값으로 문자열이 들어 오지 않는 경우 NULL 을 반환하는 알고리즘으로 설계되어 있는 것을 유추할 수 있습니다.

 

그렇다면 다음과 같은 구문은 이렇게 해석되는 것을 볼 수 있습니다.

 

if (strcmp(String, Array()) == 0)
if (NULL == 0)

 

근데 사실 NULL과 0은 엄연히 다른 값이기 때문에 if문 안으로 들어가면 안되는데, 그렇지 않습니다.

그 이유는 바로 PHP 내부의 loose comparison과 strict comparison의 개념때문인데요! 직접 봅시다.

 

loose comparison

 

strict comparison

 

네 다음은 PHP 공식 사이트에서 지원해주는 표입니다. ===는 우리가 아는 것처럼 false를 반환하지만, ==는 loose comparison이기 때문에 true를 반환합니다.그래서 이 취약점을 활용하면, 특정 값을 모르더라도 접근할 수 있게 되겠죠?

 

2. 취약점 해결방안?

이 strcmp 인증우회방법은 결론적으로 loose comparison때문에 발생하는 문제였기 때문에, 단순히 ==를 ===으로 바꿔주면 됩니다. 

if (strcmp($str1, $str2) === 0)

 

3. 예시문제 풀이

예시문제는 HackCTF의 input check 문제입니다.

 

 

값을 입력하라고 하지만, 실제로 입력하면

 

막히는걸 확인할 수 있습니다.

 

여기서 만약 strncmp 취약점을 이용한다면?

 

 

굳굳

 

 

 

참고 : hackability.kr/entry/PHP-strcmp-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B8%EC%A6%9D-%EC%9A%B0%ED%9A%8C

www.php.net/manual/en/function.strncmp.php

www.php.net/manual/en/types.comparisons.php

'WEB' 카테고리의 다른 글

[웹 모의해킹-0] 환경설정하기  (0) 2021.05.25
[PHP] Magic Hash  (0) 2021.03.26
[web] Cookie vs Session, 그리고 HTTP  (0) 2021.01.04
[PHP] preg_match함수 알아보기  (0) 2019.12.30
[React] React에 대해서  (0) 2019.11.17