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

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

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Q&A

3回答

1133閲覧

SQLインジェクションについて知りたい

World

総合スコア44

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

0グッド

2クリップ

投稿2019/01/07 03:59

hogehoge.jp/?line=index%27+AND+%271%27%3D%271%27+--+

脆弱性診断をしていたら、このようなSQLインジェクションが可能とのことでした。

index' AND '1'='1' --

上記のURLをたたいても、たいして見た目は変わったりしませんでした。
一体何がおこっているのでしょうか??

SQLインジェクションについては、調べてよくわかったのですが、、、

どんな攻撃に繋がるのかがわからずです。
わかるかた、教えて頂きたいです。

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

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

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

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

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

guest

回答3

0

上記のURLをたたいても、たいして見た目は変わったりしませんでした。

一体何がおこっているのでしょうか??

こちらですが、「見た目が変わらない」ことが脆弱性がある証拠になります。「たいして」とありますが、少しは変わったのでしょうか?

例を用いて説明します。SQL呼び出しが以下のようになっていたとします。

PHP

1$sql = "SELECT * FROM entry WHERE id='$line'"; 2$pdo->query($sql);

$lineが "index" の場合は、呼び出されるSQL文は下記となります。

SQL

1SELECT * FROM entry WHERE id='index'

これは、id列が'index'である行を検索するという意味ですね。
一方、$line が "index' AND '1'='1' -- " の場合は、呼び出されるSQL文は下記となります。

SQL

1SELECT * FROM entry WHERE id='index' AND '1'='1' -- '

このSQL文をよく見ると、WHERE句の構造が変わってしまっています。AND '1'='1' が追加され、-- 'はSQLコメントのため無視されます。
そして、WHERE句にAND '1'='1'があっても、TRUEとのANDということで、あってもなくても意味は変わらず…ということで、結局 WHERE id='index'と同じ結果になります。

しかし、本来の正しい結果は、id が "index' AND '1'='1' -- " となる行を検索しなければならないので、「見た目が変わる」べきなのです。見た目が変わるべきなのに変わらないのは、SQLインジェクション脆弱性があるからだ、という理屈です。

でも、これ、直感的にわかりにくいと思いませんか? 見た目が変わらないときは脆弱性って、直感的には不自然ですよね。もっと、ぱーっと派手に変わったほうがわかりやすいです。なので、ネットの記事などでは以下が人気です。

index' OR '1'='1' --

これだと、「すべての行がヒット」という結果になり、通常は「見た目が大幅に変化」します。

それでは、なぜ、ORではなくANDを使っているかというと、ORは危険だからです。
これ、SELECTだからどちらでもそれほど危険ではないのですが、内部で以下が呼ばれていたと想定します。

PHP

1$sql = "DELETE FROM entry WHERE id='$line'"; 2$pdo->query($sql);

ここで、$lineとして "index' OR '1'='1' -- " を指定すると、呼び出されるSQL文は下記となります。

SQL

1DELETE FROM entry WHERE id='index' OR '1'='1' -- '

これだとWHERE句に OR '1'='1' を含むので、「すべての行を削除」という結果になります。本番環境でこれをやったら大惨事ですよね。なので、脆弱性診断の実務では、ORはできるだけ(本番環境などでは絶対に)使わないのです。

ORは危険と言いましたが、攻撃者の立場に立つと、「危険=有用」ですよね。場合によってはデータを全件削除できるというのは、攻撃者にとってはメリットであり、SQLインジェクション攻撃の危険性の一つです。

ならば、情報漏えいはどうかというと、実はSQLインジェクション攻撃のもっとも得意なのが情報漏えいです。UNIONなどを使うことにより、任意のテーブルの情報を漏洩させることが可能です。詳しくはSQLインジェクションやUNION等で検索してみてください。

投稿2019/01/08 01:12

ockeghem

総合スコア11701

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

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

0

hogehoge.jp/?line=index%27+AND+%271%27%3D%271%27+--+

このURLだと、実害が想像しにくいかもしれませんね。


(以下、ドメイン部分は例示用ドメインに置き換えています)

example.jp/?line=index%27
仮に、上のURLにアクセスしたときに

SQL

1-- 見やすいように適当に整形しています 2select 3 () 4from 5 table1 6where 7 column1 = 'index'

のようなSQLが実行され、必要なデータだけがブラウザに表示されるとします。

example.jp/?line=index%27+OR+%271%27%3D%271%27
そうすると、上のURLにアクセスすると

SQL

1-- 見やすいように適当に整形しています 2select 3 () 4from 5 table1 6where 7 column1 = 'index' 8or '1'='1'

というSQLが実行され、すべてのデータが表示されてしまいます。

example.jp/?line=index%27%3Bdelete+from+table1
example.jp/?line=index%27%3Bdrop+table+table1
こんなURLにアクセスされたら……。

あるいは、DBがMySQLだとするなら
example.jp/?line=index%27%3Bshow+tables
にアクセスしてテーブル名一覧を取得すれば、すべてのテーブルをDROPしたり、色々なテーブルに不正なデータをinsertしたり、なんでもできてしまいますね。


以上のように、SQLインジェクションが可能な状態というのは非常に危険です。
リリースの前にきちんと対策することをお勧めします。

投稿2019/01/07 04:47

alg

総合スコア2019

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

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

0

urlのパラメータ渡しと質問者さんのSQLへのデータアクセス方法との
相関関係がわからないのでなんとも言いようがありません。
もしlineというパラメータをなんらかのSQLの検索条件にダイレクトに
放り込んでいるならインジェクションが発生する可能性が高いので
ご利用の言語に準じたプレースホルダーの利用を検討ください

投稿2019/01/07 04:15

yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問