
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
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';
}
}