0

私はSQLインジェクションに関するエッセイを持っています(それが何であるか-どのように行われ、どのように回避できるか)。私はそれが何であり、どのように機能するかを理解しています。しかし、データベースでインジェクションを再現できないようです。

ビデオ クラブ用の mysql ワークベンチを使用して、非常に単純なデータベースを作成しました。映画 - 在庫 - 価格 - 顧客のショッピング カートなど。また、映画を追加できる非常にシンプルな HTML ページも作成しました。在庫があるものを表示します。

そのため、映画の名前を入力する txt フィールドがあり、この特定の映画に関する情報が返されます。

入力した名前を取得してクエリを作成するコードは::

$name = $_POST ['txtfld'];
$sql = ("SELECT * FROM test_table WHERE adad = '$Mname'");
if ($result = mysqli_query($dbc,$sql))

入力として「a」を指定すると、すべてが期待どおりに機能します。pk が [a] に等しいエントリを 1 つ取得します。クエリは :: SELECT * FROM test_table WHERE adad= 'a' になります。

次のステップは、テーブル全体またはそこからランダムなエントリを取得できるかどうかを確認することでした。入力は次のとおりです: [ a' OR 'x'='x ] クエリは :: SELECT * FROM test_table where adad = ' a' OR 'x' = 'x ' すべてが期待どおりに機能し、テーブルの内容全体が返されます。

次のステップは、2 番目のクエリを挿入することでした。test_table を更新しようとしました。入力は :: [ a;' でした update test_table set asda = '123456' where adad = 'u ] クエリは :: SELECT * FROM test_table WHERE adad= ' a;' になります。UPDATE test_table SET asda ='123456' WHERE adad = 'u '

構文エラーが発生したので、 [ a; 'を含むと考えられるすべての構文を試しました。UPDATE test_table SET asda = '123456' where adad = 'u';# ] . それらのどれも機能しませんでした。

問題は、構文エラーが発生する理由が本当にわかりません。

上記の入力に対して、mysqli_error はこのメッセージを返します

error: You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'update test_table set asda =
'123456' where adad = 'u'' at line 1 

挿入したエコーがこれを返す間

SELECT * FROM test_table WHERE adad = 'a;' UPDATE test_table SET asda = '123456' WHERE 
adad = 'u'

エコーリターンに構文エラーは見られず、mysqli_error リターンの最後の 2 番目の [ ' ] 文字がどこから来たのかわかりません。

私が理解していることから、これはむしろ2番目のクエリの実行の失敗です(クエリが何であれ-ドロップ、挿入、更新)

私は何かが恋しいですか?

前もって感謝します。

マイケル。

4

2 に答える 2

2

mysql の PHP ドライバーは、1 回の ->query() 呼び出しで複数のクエリを許可していません。これは、まさにこの理由によるものです。これは、従来のBobby Tables攻撃を防ぐための、注射に対する防御です。これは、すべての PHP db インターフェイス (mysql、mysqli、pdo) に当てはまります。それらはすべて、実際に db と通信するために同じ基礎となる mysql C API ライブラリを使用するためです。1 回のクエリ呼び出しで 2 つ以上のクエリを実行しようとすると、構文エラーが発生します。

' or 1=1ただし、注射から保護するわけではないことに注意してください。

于 2013-02-27T16:04:19.423 に答える
0

スタック クエリ インジェクション手法を機能させるには、「mysqli_multi_query()」関数を使用する必要があります。

http://php.net/manual/en/mysqli.multi-query.php http://www.websec.ca/kb/sql_injection#MySQL_Stacked_Queries

MsSQL は、既定でスタック クエリをサポートする唯一のデータベースです。

また、より優れたインジェクション手法と信頼性の高い手法は、UNION 攻撃であり、「mysql.user」テーブルから MySQL 資格情報をダンプし、これらを使用してデータベースを侵害します。

于 2013-02-28T02:30:49.207 に答える