サイトで侵入テストを実行しています。ほとんどのリクエストは、ポストリクエストによってバックグラウンドで実行されます。ライブHTTPヘッダーを使用して1つの要求をインターセプトし、元の要求と同じパラメーターを使用してそれを再生すると、次のエラーが生成されました(ただし、元の要求は成功しました)。
Database Error
エラー:SQLSTATE [23000]:整合性制約違反:1048列 's_id'はnullにできません
SQLクエリ:INSERT INTO a2
.user_s_likes
(s_id
、user_id
、status
、added_on
)VALUES(NULL、924300、NULL、 '2016-09-01 13:28:29')
注意:このエラーメッセージをカスタマイズする場合は、app/View/Errors/pdo_error.ctpスタックトレースを作成します。
CORE/Cake/Model/Datasource/DboSource.php line 460 → PDOStatement->execute(array)
CORE/Cake/Model/Datasource/DboSource.php line 426 → DboSource->_execute(string, array)
CORE/Cake/Model/Datasource/DboSource.php line 1004 → DboSource->execute(string)
CORE/Cake/Model/Model.php line 1827 → DboSource->create(UserSLike, array, array)
APP/Controller/SController.php line 1584 → Model->save(array)
[internal function] → SController->sActivity()
CORE/Cake/Controller/Controller.php line 490 → ReflectionMethod->invokeArgs(SController, array)
CORE/Cake/Routing/Dispatcher.php line 187 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 162 → Dispatcher->_invoke(SController, CakeRequest, CakeResponse)
APP/webroot/index.php line 116 → Dispatcher->dispatch(CakeRequest, CakeResponse)
次のリクエストはLiveHTTPヘッダーで行われました
Host: www.xyz.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Referer: https://www.xyz.com/Dashboard/
Content-Length: 24
Cookie: live_cookie[support_chat_me]=35dbce45627dcff25cc9c2176e0d2085a; CAKEPHP=96abc64p54s524dgrj6injsfx5; __tawkuuid=e::xyz.com::C8WeiSHNj53hAYU545QNvyDPV+tNvx0+usD3q564jk2EenfhtToWQj0BER7V7cqG::2; Tawk_56497b21458b0ebc5e6d22b6=vs17.tawk.to:443::0; __auc=943798cd156cf1c4684725d7a45; PHPSESSID=kjk7fsap9kk25ib182euqfqk71; AWSELB=213575250CC01012FFAB662292465465sldfjJDHFN8A45F10D97D09300BDA1AF5D7A0DA8E6C1C41D40BC34DD2C2E0SDnskjdh Dlkf5FD6A5E;
s_id=12536&status=1
S_idおよびステータス変数はpostリクエストを介して送信されましたが、サーバーはnull変数が送信されたかのようにデータベースエラーで応答しています。これは、LiveHTTPヘッダーまたはBurpを介した個別のリクエストが送信された場合にのみ発生します。このデータベースは、何らかのエラーベースのSQLインジェクションに対して脆弱ですか?
このエラーだけでは、パラメーターがSQLiに対して脆弱かどうかを判断できません。より明確な証拠として、s_idパラメータを操作して、それがsyntaxエラーを返すことができるかどうかを確認する必要があります。これは、s_idの入力が適切にサニタイズまたはパラメーター化されていないことを示します。
エラーメッセージにはSQLクエリが表示されるため、これはテストがかなり簡単です。次の注入のいくつかを行ってみてください。
s_id = 1,1,1&status = 1
クエリは次のようになります:INSERT INTO a2.user_s_likes(s_id、user_id、status、added_on)VALUES(1,1,1、924300、NULL、 '2016-09-01 13:28:29')
脆弱である場合、引数/パラメータが多すぎるというエラーが発生すると予想されます。
s_id = 1)&status = 1
クエリは次のようになります:INSERT INTO a2.user_s_likes(s_id、user_id、status、added_on)VALUES(1)、924300、NULL、 '2016-09-01 13:28:29')
脆弱である場合、予期しない括弧についてのエラーメッセージが表示されることが予想されます。
s_id = 1 '&status = 1
クエリは次のようになります:INSERT INTO a2.user_s_likes(s_id、user_id、status、added_on)VALUES(1 '、924300、NULL、' 2016-09-01 13:28:29 ')
脆弱である場合、終了していないリテラル文字列に関するエラーメッセージが表示されることが予想されます。
S_idのデータタイプが正しくない、または数値ではないというエラーメッセージが表示された場合、これはクエリがパラメーター化されているため、脆弱ではないことを意味します。
SQLインジェクションの脆弱性が存在することを証明するには、s_idの値がSQLとして解釈されていることを証明する必要があります。これを行う最も簡単な方法は、構文エラーです。
おそらくそうではありません。CakePHPのデフォルトのエラーページを受け取ったからです。このエラーは、リクエストにデータがない(結果としてNULL値になる)か、参照されたデータ(s_id)が見つからなかったことを示しています(SController.phpファイルを確認する必要があります)。
開発者がCakePHPのデフォルトのデータベースジェネレーター(データベーススキーマ、モデル、CRUDステートメントを生成する)を回避し、カスタムPDOステートメントを作成した場合にのみ、注入が発生する可能性があります。
エラーデータベースエラーエラー:SQLSTATE [23000]:整合性制約違反自体は、列 's_id'が主キーである可能性があることを意味します。そのため、システムはそれをnullにすることを許可していません。上記の詳細は、アプリケーションがSQLインジェクションに対して脆弱であるかどうかの明確な回答を提供することはできません。