
Система ключей общего доступа уязвима к атаке PHP Type Juggling (подмене типов), что позволяет злоумышленнику получить доступ к содержимому календаря, не зная ключа общего доступа.
Чтобы система была уязвимой, должна быть включена функция ключа общего доступа к календарю.

После включения общего доступа пользователь может получить доступ к календарю без аутентификации, используя ключ общего доступа.

Разумеется, если ключ неверен, доступ запрещён.
Проверка ключа находится в файле "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)
Возвращает < 0, если str1 меньше str2; > 0, если str1 больше str2, и 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';
}
}