반응형

해당 문제는 느슨한 문자열 비교에 의해 발견된 취약점을 이용한 문제이다.

 

먼저 소스코드를 분석해보면 sleep_rand(); 함수를 선언하고 post 방식으로 flag 값이 세팅되어있으면 해당 함수를 호출하는데 이는 flag를 찾는 것과는 무관하다.

그냥 말 그대로 random한 값대로 sleep 하는 함수이다.

 

중요하게 봐야할 곳은 바로 아래 쪽이다.

<?php
if (! strcasecmp ($_POST['flag'], $flag))
    echo '<div class="alert alert-success">Here is your flag: <mark>' . $flag . '</mark>.</div>';   
else
    echo '<div class="alert alert-danger">Invalid flag, sorry.</div>';
?>

 

POST 방식으로 넘겨준 flag 파라미터값과 $flag 변수의 값이 일치할 경우 $flag를 출력해준다고 한다.

strcasecmp는 strcmp와 동일한 함수인데 단지 대소문자 비교를 하지 않는다는 차이만 존재하다.

 

따라서 strcmp의 취약점을 통해 flag를 배열로 넘겨주면 flag가 출력된다.

 

 


※ strcmp 취약점

 - strcmp(str1,str2)의 경우 return 값이 총 3가지 경우로 나눠져있다.

1) str1>str2 => 양수

2) str1<str2 => 음수

3) str1=str2 => 0

 

 - PHP 5.3 이상의 버전에서 문자열과 배열을 비교하게 되면 NULL을 출력한다. PHP 5.2 이하 버전에서는 문자열과 배열을 비교했을 때 문자열과 "Array"를 비교한다고 한다.

 

 - 문자열 비교 시 느슨한 비교(==)를 할 경우 NULL과 0을 비교하면 True가 되므로 문자열을 알지 못하더라고 배열을 넣으면 두 가지 인자값이 동일하다고 판단하는 것이다.

 

자세한 사항은 아래 블로그를 참고하길 바란다.

https://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

반응형
블로그 이미지

rootable

,