CakePHP CVE-2023-22727(SQLインジェクション) 動かす

IT

※脆弱性診断を行う上でのスキルアップとして検証を行っております。この記事で知り得たことを悪用することは禁止とします。

概要

アドバイザリから引用した。

CVE-2023-22727 - GitHub Advisory Database
CakePHP Database\Query::offset() and limit() methods are vulnerable to SQL injection

サニタイズされていないユーザー要求データが渡された場合、メソッドCake\Database\Query::limit()とメソッドは SQL インジェクションに対して脆弱です。Cake\Database\Query::offset()

Impact https://github.com/advisories/GHSA-6g8q-qfpv-57wp

この問題は、4.2.12、4.3.11、4.4.10 で修正されています。

patch https://github.com/advisories/GHSA-6g8q-qfpv-57wp

環境作成メモ

ガンガンchatGPTに聞いた。

環境

  • M1 Mac
  • Docker

ミス1 platform: linux/arm64 が入ってなくて動かないコンテナがあった。

⇨M1 Macの場合はarm指定を入れる。

ミス2 volumesを仮想?にしていて、検証するうちにゴミが溜まってエラーになった。

⇨dockerマスターになるまではローカルのディレクトリを指定する。

出てきた課題1 古いバージョンのCakePHPはどうやってインストールする?

composer.jsonでバージョンいじってcomposer updateする。

動作確認

4.4.9

脆弱性が存在する4.4.9であることを確認した。

chatGPTに頼んでデータやら容易してもらった。

INSERT INTO posts (title, body, created, modified) VALUES
('First Post', 'This is the first post.', NOW(), NOW()),
('Second Post', 'This is the second post.', NOW(), NOW()),
('Third Post', 'This is the third post.', NOW(), NOW());
public function limited()
{
    if ($this->request->is('post')) {
        $limit = $this->request->getData('limit');
        $posts = $this->Posts->find()
            ->limit($limit)
            ->order(['created' => 'DESC']);
    } else {
        $posts = [];
    }

    $this->set(compact('posts'));
}

修正時のテストとして使われている「–」(コメント)で試してみる。

Disallow strings in limit() and offset() · cakephp/cakephp@3f463e7
Back in 68a08a2 int casts were removed in limit() and offset(). This opened up the possibility for applications to provide unsafe user input into these methods ...

正常系

コメントあり(エラー起こらない想定)

コメント構文エラー

SQLインジェクションが成立していることが確認できた。

4.4.10(修正後)

修正後のコード。文字列チェックが入っている。

Disallow strings in limit() and offset() · cakephp/cakephp@3f463e7
Back in 68a08a2 int casts were removed in limit() and offset(). This opened up the possibility for applications to provide unsafe user input into these methods ...

4.4.10に上げた。

先ほどと同じコメントを投げてみた。

修正コード通りのメッセージが表示されていた。

まとめ

仕様上では文字列以外を想定している関数もあるので、「'”」をエスケープするというだけではSQLインジェクションは防げない。

このCVEが2023というのが、これが浸透していない証拠だと感じる。

(djangoでも似たようなのあったよね)

コメント

タイトルとURLをコピーしました