
CVE-2020-25867에 대한 개념 증명 익스플로잇으로, PHP 타입 저글링 우회를 통해 SoPlanning 캘린더 공유 키 인증을 우회하는 방법을 시연합니다.
공유키 시스템은 PHP 타입 저글링 공격에 취약하며, 공격자가 공유키를 모르고도 캘린더의 내용에 접근할 수 있습니다.
취약해지려면 캘린더 공유키가 활성화되어 있어야 합니다.

이 공유가 활성화되면, 사용자는 공유키를 사용하여 인증 없이 캘린더에 접근할 수 있습니다.

물론 키가 잘못되면 접근이 거부됩니다.
키 검증은 파일 "includes/header.inc"에 있습니다.
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if (strcmp($_GET['cle'],CONFIG_SECURE_KEY)==0)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}
strcmp 함수가 비엄격 비교와 함께 사용됩니다. 이 비교의 결과는 다음에 따라 달라집니다: PHP 타입 비교 테이블
strcmp 함수의 결과는 문서에 설명되어 있습니다: [strcmp]'https://www.php.net/manual/en/function.strcmp.php)
str1이 str2보다 작으면 < 0을 반환하고; str1이 str2보다 크면 > 0을 반환하며, 같으면 0을 반환합니다.
이 함수는 매개변수 중 하나가 배열이면 "NULL"을 반환합니다.
PHP 타입 비교 테이블에 따르면, "NULL"과 0 사이의 비엄격 비교는 true입니다.
따라서 **$_GET['cle']**이 배열이면 조건 결과는 true가 되고 접근이 승인됩니다.
이 링크는 **$_GET['cle']**을 배열로 정의합니다: https://demo.soplanning.org/planning.php?public=1&cle[]=

접근이 "Invité"로 허용됩니다.
이 취약점을 수정하기 위해 엄격한 비교를 사용할 수 있습니다:
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if (strcmp($_GET['cle'],CONFIG_SECURE_KEY)===0)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}
또는 strcmp 함수 없이 비교를 수행할 수 있습니다.
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if ($_GET['cle'] === CONFIG_SECURE_KEY)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}