dポイントプレゼントキャンペーン実施中!

バリデートされていない3つのフォームがあるとします。
(フォーム1の内容はSELECT文のSQLを発行するPGが組まれています。)
(フォーム2の内容はINSERT文のSQLを発行するPGが組まれています。)
(フォーム3の内容はDELETE文のSQLを発行するPGが組まれています。)

この3つのフォームに' OR 'A'='Aと入力すると、

フォーム1の場合、全件内容が表示される。
フォーム2はINSERTなどでOR 'A'='Aが登録されるだけ、
フォーム3の場合、全件内容が消去される。

知っている人がみたら、自分は結構理解できていないんだなと思います。

OR 'A' = Aって全件を示す文なのでしょうか?
参考サイトが難しくてとっつきづらいです。
どこか分かりやすいサイトがあったら教えてほしいのですがよろしいでしょうか。

A 回答 (3件)

通常、ログイン画面だと、IDとパスワードを入力してログインボタンを押すようなものを作成すると思います。



そして、DBにIDとパスワードの情報が入っていた場合、
単純に、
「select * from users where id='xxxx' AND pass='xxxx'」
を検索して、データが存在していたらログインさせる、という処理になります。

その際に、inputタグの中のID項目に「hogehoge」、パスワードの項目に「' OR 'A'='A」
と入力すると、

「select * from users where id='hogehoge' AND pass='' OR 'A'='A'」

となります。コレを検索すると
usersテーブルのidが「hogehoge」でかつ、passが「(空)」か、又は、「A」という文字列が「A」であった場合の全てを検索する、となります。

そうすると、どんなIDでどんなパスワードでもログイン出来てしまいます。

>インジェクションする人もある程度予想立てて
これについてはまったくその通りですが、一般的に、ユーザが入力を行ってSQL文でその入力したものを検出するときは、たいていwhere句の中の値になりますので、簡単に予測はつくのではないかと思います。

商品検索ページの場合でも、
INPUTタグの入力項目に検索した値「ほげ」を入力した場合でも

「select * from items where name like '%ほげ%'」

とかとなると思いますが、これも検索値を「a' OR 'B' = 'B' OR 'A' = ' 」
とでもすれば

「select * from items where name like '%a' OR 'B' = 'B' OR 'A' = '%'」

となるので、
itemsテーブルの中のnameに「a」が含まれているか、または「B」が「B」であるか、又は「A」が「%」である項目全てを検出
となるので、itemsテーブルに含まれる全てが検索されてきます。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
とてもよく分かりました!!

お礼日時:2009/07/17 10:42

>インジェクションする人もある程度予想立てて(SQL文とか入力する値は変数のどの値になるのか)行わないと成功しないということでしょうか?


予測もだけどあれしてこれしてって順を追って攻撃してくるのでしょう。
手っ取り早くPOST/GET(セキュリティー的にこの場合はGETはあまり使わないでしょうけど)で渡す値に「' OR 'A'='A」を入れた置けば
$_GET('パスワード')の値が「' OR 'A'='A」だして
それをエスケープ処理もしないでSQL文を構築すれば後は想像できると思います。
    • good
    • 0

たぶん質問者は


http://www.atmarkit.co.jp/fsecurity/column/ueno/ …
を見ての質問でしょうけど
OR 'A'='A'の意味は理解できるのか?
ORと'A'='A'のそれぞれの意味は理解できるのか?
これはSQL以前にPHPのifの条件と同じです。(ただしphpの場合の=の使い方が違いますが)

この回答への補足

ありがとうございます。
>これはSQL以前にPHPのifの条件と同じです。
冷静に考えれば条件でパスワードが一致するか、もしくは、Aの値がAという意味でOR 'A'='A'にしてたわけですね。。。別に OR 'B'='B'でもいいわけですよね。

参考にしてたサイトは確かに、
http://www.atmarkit.co.jp/fsecurity/column/ueno/ …
ですが、

この場合って、uidにuenoが入っている条件でかつSQL文も変数はなんでもいいんですが、

SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd'

というSQL文じゃないと通用しないと思いますが、どうでしょうか。
インジェクションする人もある程度予想立てて(SQL文とか入力する値は変数のどの値になるのか)行わないと成功しないということでしょうか?

補足日時:2009/07/16 16:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!