「BobbyTables」XKCDコミックからのSQLインジェクションはどのように機能しますか?



How Does Sql Injection From Thebobby Tablesxkcd Comic Work



解決:

それは学生のテーブルを落とします。

学校のプログラムの元のコードはおそらく次のようになります



q = 'INSERT INTO Student VALUES(' '+ FNMName.Text +' '、' '+ LName.Text +' ')';

これは、テキスト入力をクエリに追加するための素朴な方法であり、 ひどい 、あなたが見るように。

名、ミドルネームのテキストボックスの値の後 FNMName.Text (これはロバート ');ドロップテーブルの学生; -)および姓のテキストボックス LName.Text (それを呼びましょうDerper)はクエリの残りの部分と連結され、結果は実際になります 2つのクエリ ステートメントターミネータ(セミコロン)で区切られます。 2番目のクエリは 注入された 最初に。コードがデータベースに対してこのクエリを実行すると、次のようになります。



学生の価値観に挿入( 'Robert');ドロップテーブルの学生; -'、'ダーパー ')

これは、平易な英語では、おおまかに2つのクエリに変換されます。

Name値が「Robert」のStudentsテーブルに新しいレコードを追加します



Studentテーブルを削除します

2番目のクエリを過ぎたものはすべてコメントとしてマークされます。-'、'ダーパー ')

NS学生の名前の「」はコメントではなく、終了文字列の区切り文字です。学生の名前は文字列であるため、架空のクエリを完了するには構文的に必要です。インジェクション攻撃のみが機能します SQLクエリを挿入すると、有効なSQLが生成されます。

編集済み また dan04の鋭いコメントによる


名前が変数で使用されたとしましょう。$ Name。

次に、これを実行します クエリ

学生の値に挿入( '$ Name')

コードは、ユーザーが変数として指定したものを誤って配置しています。

あなたが欲しかった SQL することが:

生徒の値に挿入( 'Robert Tables`)

しかし、賢いユーザーは好きなものを提供できます。

学生の価値観に挿入( 'ロバート');ドロップテーブルの学生; -')

あなたが得るものは:

生徒の値に挿入( 'Robert');ドロップテーブルの学生; -')

NS-行の残りの部分にのみコメントします。


他のみんながすでに指摘しているように、');元のステートメントを閉じてから、2番目のステートメントが続きます。 PHPなどの言語を含むほとんどのフレームワークには、1つのSQL文字列で複数のステートメントを許可しないデフォルトのセキュリティ設定があります。たとえば、PHPでは、を使用して1つのSQL文字列で複数のステートメントを実行することしかできません。mysqli_multi_query関数。

ただし、2番目のステートメントを追加しなくても、SQLインジェクションを介して既存のSQLステートメントを操作できます。この単純な選択でユーザー名とパスワードをチェックするログインシステムがあるとしましょう。

$ query = 'SELECT * FROM users WHERE username =' '。 $ _REQUEST ['user']。 ''および(password = ''。$ _ REQUEST ['pass']。 '') '; $ result = mysql_query($ query);

あなたが提供する場合ユーザー名としてpeterとパスワードとしてsecretを指定すると、結果のSQL文字列は次のようになります。

SELECT * FROM users WHERE username = 'peter' and(password = 'secret')

全部大丈夫です。ここで、この文字列をパスワードとして指定するとします。

'または' 1 '=' 1

その場合、結果のSQL文字列は次のようになります。

SELECT * FROM users WHERE username = 'peter' and(password = '' OR '1' = '1')

これにより、パスワードを知らなくても任意のアカウントにログインできるようになります。したがって、SQLインジェクションを使用するために、2つのステートメントを使用できる必要はありませんが、複数のステートメントを指定できる場合は、より破壊的な処理を実行できます。