
CVE-2020-24913のPoC。qcubed(バージョン3.1.1を含む全バージョン)のprofile.phpにおける、strQueryパラメータを介したSQLインジェクション脆弱性により、未認証の攻撃者が細工されたPOSTリクエストを介してSQLコードを注入し、データベースにアクセスできるようになります。
CVE-2020-24913のPoCです。これは、qcubed(全バージョン、3.1.1を含む)のprofile.phpにおけるSQLインジェクション脆弱性で、strQueryパラメータを介して、攻撃者が細工したPOSTリクエストでSQLコードを注入することで、認証なしにデータベースにアクセスできるものです。このPoCはMySQLデータベースを使用して実行します。スタックドクエリペイロード(PostgreSQLで可能な方法)は使用できず、時間ベースの手法でこの脆弱性を悪用する必要がありました。
"strProfileData"パラメータには、以下のペイロード(エンコード前)を使用します: a:1:{i:0;a:3:{s:12:"objBacktrace";a:1:{s:4:"args";a:1:{i:0;s:3:"pwn";}}s:8:"strQuery";s:38:"(SELECT * FROM (SELECT(SLEEP(10)))CP);";s:11:"dblTimeInfo";s:1:"1";}}
脆弱性のあるパラメータは"strProfileData"です。サーバーに送信する成功するリクエストは次のようになります。このパラメータで送信されるPHPシリアル化配列は、base64エンコードする必要があります。
以下の画像では、読者がより明確に確認できるようstrProfileDataパラメータをbase64デコードしていますが、前述の通りbase64エンコードして送信する必要があります。
次のリクエストには、サーバーを10秒間スリープさせるクエリが含まれています。SQLインジェクションの脆弱性を悪用し、データベースに指定された時間(秒)応答を待機させるSQLクエリを送信します。
データベースからデータを取得するために、条件が真か偽かに応じてデータベースのスリープ時間を増減させるIF構造を使用します。
以下の画像では、データベースバージョン(8.0.XX)の最初の文字を取得しています。
SQLクエリ「SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5)))」を使用します。これにより、条件が真の場合はデータベースが(5-2)=3秒スリープし、偽の場合は(5-5)=0秒スリープします。条件は、データベースバージョンの位置Xの文字が文字Yと等しいことです。
