hogehoge.jp/?line=index%27+AND+%271%27%3D%271%27+--+
脆弱性診断をしていたら、このようなSQLインジェクションが可能とのことでした。
index' AND '1'='1' --
上記のURLをたたいても、たいして見た目は変わったりしませんでした。
一体何がおこっているのでしょうか??
SQLインジェクションについては、調べてよくわかったのですが、、、
どんな攻撃に繋がるのかがわからずです。
わかるかた、教えて頂きたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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
総合スコア2019
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。