
CVE-2023-45503 参照
Macrob7 Macs Framework Content Management System(CMS)バージョン1.1.4f以前では、ユーザー入力の安全でない処理により、16件のSQLインジェクション脆弱性が発生します。任意のSQLクエリを実行できることで、ユーザーのパスワードハッシュを含むプライベートデータが漏えいしたり、他のユーザーの認証情報や権限レベルを変更されたりする可能性があります。影響には、権限昇格や潜在的なリモートコード実行(RCE)が含まれます。
影響を受ける各エンドポイント、脆弱なパラメータ、脆弱な関数をまとめたスプレッドシートは、こちらのリンクにあります。
CWE分類: CWE-89: SQLコマンドで使用される特殊要素の不適切な無効化('SQLインジェクション')
報告者: Ally Petitt
影響を受ける製品: Macrob7 Macs CMS
影響を受けるバージョン: 1.1.4f以前
私が発見した16件の事例では、ユーザー入力が適切なサニタイズやパラメータ化なしに受け取られていました。たとえば、このCMSの「パスワードを忘れた場合」機能では、メールアドレスが要求されます。
Application/plugins/CMS/controllers/CMS.php:224
public function forgotPasswordProcess()
{
$this->loadModels();
$emailAddress = Post::getByKey('emailAddress');
$user = $this->usersModel->getUserByEmailAddress($emailAddress);
メールアドレスはその後、getUserByEmailAddress() メソッドに渡され、そのメソッドはメールアドレスを selectSingle() に渡します。このメソッドは、注入されたSQLクエリに対して適切に保護されていません。
Application/plugins/CMS/models/Users_Model.php:41
public function getUserByEmailAddress($emailAddress)
{
return $this->selectSingle( $this->getCMSTableNameUsers(), array('EmailAddress'=>$emailAddress));
}
次に、selectSingle() は渡されたユーザー入力を指定して select() を呼び出します。
Application/core/DB.php:200
public function selectSingle($tableName, array $where = array(), array $fields = array('*'))
{
$return = $this->select($tableName, $where, $fields);
$single = NULL;
if( count($return) > 0 )
$single = $return[0];
return $single;
}
脆弱な select() 関数は、渡されたパラメータを連結してSQLクエリを生成し、それを実行します。
Application/core/DB.php:186
public function select($tableName, array $where = array(), array $fields = array('*'))
{
$fieldsString = $this->generatePair($fields, ',');
$whereString = $this->generateKeyValuePair($where, '=', 'AND');
$sql = 'SELECT '.$fieldsString.' FROM '.$tableName;
if($whereString !='')
$whereString = ' WHERE '.$whereString;
$sql = $sql.' '.$whereString.';';
return $this->execute($sql)->fetchAll($this->returnType, $this->className);
}
入力のサニタイズ、検証、パラメータ化が行われていないため、この関数はSQLインジェクション攻撃に対して脆弱なままです。
残念ながら、このCMSはメンテナンスが行われていないため、パッチ適用済みのアップデートは提供されていません。個々のユーザーは、ユーザー入力をデータベースに渡す際に連結に依存するのではなく、パラメータ化されたSQLクエリを含むようにコードを変更することができます。プリペアドステートメントは、これを実現できる緩和策の一例です。