質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

6回答

3770閲覧

SQLインジェクション発生の理由と仕組み

T.T.T33

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

3クリップ

投稿2021/07/22 01:56

編集2021/07/28 07:53

質問宜しくお願いします。

SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando' というSQLコードで未決注文(pending orders)が確認できるという状況です。 そこに SELECT * FROM Orders_Pend WHERE Location_City = Orlando'; DROP TABLE Orders_Pend -- とすると、SQLインジェクションが成功して全テーブルが削除されるようです。

質問)
以下が私の認識です。合っているかどうか御教授願います。

このインジェクションが成功する理由は、= の後が' '(シングルクオテーション囲み)がないため、シングルクオテーションが1個しかないため、= Orlandoが成立せず、結局文字列として認識されることが無い。理解されるコマンドとしては ;で仕切りなおして、DROPコマンド以下だけになる。だからテーブルが削除されてしまう。-- の役割とは何でしょうか?

~~編集後~~
コロナ類の症状が出ており返事が遅れてすいませんでした。
これは実はとある試験の問題です。質問を言い換えると、どうして答えがAになるのかが分かりませんでした。御時間がある方は参照くださると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/07/22 03:06

なんのアプリケーションから利用されるのでしょう
Zuishin

2021/07/22 03:33

成功しないので、成功する理由はありません。
T.T.T33

2021/07/28 07:57

諸事情により連絡が遅れてしまい申し訳ありません。これは試験問題の1つであり、リンク先に問題を貼らせていただきました。御時間がある方は参照いただけますと助かります。
guest

回答6

0

元のSQL文が以下の場合、

SQL

1SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando'

前提として Orland が外部から入力された文字列だとして、テーブル Orders_Pend を削除する場合、Orlandの代わりに、以下を入力すると、

SQL

1'; DROP TABLE Orders_Pend

生成されるSQL文は下記となります。

SQL

1SELECT * FROM Orders_Pend WHERE Location_City = ''; DROP TABLE Orders_Pend'

これは途中までは良いのですが、末尾のシングルクォート「'」の箇所で構文エラーになります。この文字は元々のSQL文にあるものなので、削除はできません。なので、これを活かしつつ、SQLの構文エラーにならない方法を考える必要があります。

例えばDROP TABLEではなくDELETEでよいならば、以下を外部から入力すると、

SQL

1'; DELETE FROM Orders_Pend WHERE ''='

以下のSQL文が生成されるので、第2のSQL文(DELETE FROM ...)の結果、Orders_Pend は空になります。しかし、中身が消えるだけでテーブル自体削除はされません。

SQL

1SELECT * FROM Orders_Pend WHERE Location_City = ''; DELETE FROM Orders_Pend WHERE ''=''

ここでSQLコメントの登場です。標準SQLでは、「--」ですが、MySQLでは「#」も使えます。これらの記号以下は、コメントとして無視されます。

なので、以下を入力すると

SQL

1'; DROP TABLE Orders_Pend --

生成されるSQL文は下記となります。

SQL

1SELECT * FROM Orders_Pend WHERE Location_City = ''; DROP TABLE Orders_Pend -- '

末尾の「-- '」はコメントとして無視されます。ここで--の後に空白を入れているのは、MySQLの場合、--の後に空白がないとコメントとして認識されないからです。#記号の場合は、空白は必要ありません。

シングルクオテーションが1個しかないため、= Orlandoが成立せず、結局文字列として認識されることが無い。理解されるコマンドとしては ;で仕切りなおして、DROPコマンド以下だけになる。だからテーブルが削除されてしまう。

この理解は間違いです。当該箇所でSQLの構文エラーになり、DROP以下も含めてSQLは実行されません。これは元記事の間違いでしょう。

-- の役割とは何でしょうか?

既に指摘があるように、これはSQLのコメントを意味します。

投稿2021/07/22 03:33

ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.T.T33

2021/07/28 07:55

諸事情により返事が遅れてしまい申し訳ありませんでした。質問に補足させていただきましたが実はこれ試験問題の1部でした。恐らく私自身の理解の曖昧さもあって正しい質問の仕方ができなかった可能性もあります。ともあれいただいた情報は大変感謝しております。
ockeghem

2021/07/28 08:48

本文中に書いたように、「どうして答えがAになるのかが分かりませんでした」に対する答えは、選択肢Aが間違っているので、「わからない」が正解だと思います。試してみたら、動かないことはすぐに分かると思います。
guest

0

そもそも論として、SQLインジェクションはSQLとそれを生成する別言語の組み合わせで生じるものです。

SQL文「だけ」で論じられるものではありません。

投稿2021/07/22 02:09

maisumakun

総合スコア145930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.T.T33

2021/07/28 07:45

返事が遅れてしまいすいませんでした。補足させていただきますが、これは資格試験問題の1部でした。それでもいただいた情報はとてもありがたく共有させていただきます。
guest

0

以下が私の認識です。合っているかどうか御教授願います。

これだと文法エラーでは?

-- の役割とは何でしょうか?

コメントの開始です。以降が構文エラーになるのを防ぐためですね。

投稿2021/07/22 03:02

otn

総合スコア85762

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.T.T33

2021/07/28 07:46

返事が遅れてしまい申し訳ありませんでした。率直な無駄のない解答ありがとうございます。頂いた情報を大切にさせていただきます。
guest

0

インジェクションはそもそも悪意あるユーザーからの不正入力及びアプリケーションの実装の甘さが重なって起きるものです(大前提、理由)。

悪意ある(もしくは不特定の)ユーザーから直接SQLを打たせる仕組みでないなら(それってありえないけど)、焦点間違えています。

プリペアドステートメントによるバインドなど値側の対策はもちろん、テーブル名やカラム名が外部から見て推測されにくい工夫も必要不可欠です。

投稿2021/07/22 03:27

編集2021/07/27 05:21
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.T.T33

2021/07/28 07:54

諸事情により返事が遅れてしまい申し訳ありませんでした。質問に補足させていただきましたが実はこれ試験問題の1部でした。共有いただいた情報はありがたく大切にさせていただきます。
m.ts10806

2021/07/28 08:02

>実はこれ試験問題の1部でした。 第三者に求めても本当に問題起きないかは重々検討いただきたく。 回答者も「知らなかった」では済まされないこともあります。(Paizaスキルチェックなどでは明確に「答えることも禁止」の旨が規約にあります)
guest

0

SQLインジェクションとは、例えば
Location_City = 'Orlando'
の部分をTextBox等で入力出来るようにした時、字数制限等対策していない場合に有効なSQL構文を入力すると、望んでいないSQL構文が出来上がり実行されてしまうのを利用した攻撃のことです。

TextBoxを使う場合はデータの検索等のSQL(SELECT~WHERE他)で使用する等。例えばVisualStudioのコンポーネントだと最大256文字まで入力可能なところを突かれたものです。

';が特に曲者で、人間が見ると例文のDrop~は「無効なSQL構文」に見えますが、
コンピュータのTextBoxでは```SQL
SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando'; DROP TABLE Orders_Pend '--'

という2つのSQL構文が連結されたという解釈になってしまうのです。 (引用文献:翔泳社「独習VisualBasic2008」P476-478 2009年3月第一版をもとに今回の質問に合わせた。) 文献には対策方法もありますが、攻撃方法も進化していますので最新のものは様々な知見を得る必要があります。頑張ってください。

投稿2021/07/27 11:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例題に少し誤りがあるように思いますが、
SQLインジェクションは、悪意ある文字列をSQLとして処理させ、想定しない動きをさせるわけですが、

悪意ある文字列)
Orlando'; DROP TABLE Orders_Pend --

完成形)
SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando'; DROP TABLE Orders_Pend --'

-- の役割は、
Location_City以外の条件があった場合でも、確実に攻撃を成功させるためではないでしょうか?

SQL)
SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando' and Order_date > '2021/07/01'

--を付けない悪意ある文字列を入れると、

SQL)
SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando'; DROP TABLE Orders_Pend' and Order_date > '2021/07/01'

上記では、不適切なSQLとなり、攻撃は成功しません。
ここに -- がはいることで

SQL)
SELECT * FROM Orders_Pend WHERE Location_City = 'Orlando'; DROP TABLE Orders_Pend --' and Order_date > '2021/07/01'

後続する条件がただのコメントとして処理され、攻撃が確実に成功することになります

投稿2021/07/27 05:11

Akitako

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.T.T33

2021/07/28 07:56

かなり詳細な解答ありがとうございました。 これは試験問題の一部であり、こちらの聞き方が悪かったのか理解があいまいだったのか、色々議論を招いてしまいました。後で熟読させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問