
Proof-of-Concept-Exploit für CVE-2020-25867, der PHP-Type-Juggling-Umgehung der SoPlanning-Kalenderfreigabe-Schlüsselauthentifizierung demonstriert.
Das Sharing-Key-System ist anfällig für Angriffe durch PHP Type Juggling, die es einem Angreifer ermöglichen, auf den Inhalt des Kalenders zuzugreifen, ohne den Sharing-Key zu kennen.
Um anfällig zu sein, muss der Sharing-Key des Kalenders aktiviert sein.

Sobald diese Freigabe aktiviert ist, kann ein Benutzer ohne Authentifizierung über den Sharing-Key auf den Kalender zugreifen.

Natürlich wird der Zugriff verweigert, wenn der Schlüssel falsch ist.
Die Validierung des Schlüssels erfolgt in der Datei "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';
}
}
Die strcmp-Funktion wird mit einem nicht-strikten Vergleich verwendet. Das Ergebnis dieses Vergleichs hängt von Folgendem ab: PHP-Typvergleichstabellen
Das Ergebnis der strcmp-Funktion wird in der Dokumentation beschrieben: [strcmp]'https://www.php.net/manual/en/function.strcmp.php)
Gibt < 0 zurück, wenn str1 kleiner als str2 ist; > 0, wenn str1 größer als str2 ist, und 0, wenn sie gleich sind.
Diese Funktion gibt "NULL" zurück, wenn einer der Parameter ein Array ist.
Gemäß den PHP-Typvergleichstabellen ist der nicht-strikte Vergleich zwischen "NULL" und 0 true
Wenn $_GET['cle'] also ein Array ist, ist das Ergebnis der Bedingung true und der Zugriff wird gewährt.
Dieser Link definiert $_GET['cle'] als Array: https://demo.soplanning.org/planning.php?public=1&cle[]=

Der Zugriff wird als "Invité" gewährt
Um diese Schwachstelle zu beheben, kann ein strikter Vergleich verwendet werden:
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';
}
}
Oder der Vergleich kann ohne die strcmp-Funktion durchgeführt werden.
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';
}
}