らすねさんに頼まれたので説明します
ナンバープレートにSQLインジェクションの文字列を追加してオービスの裏側のDBをぶっ壊そうとしてる車の画像ください
— デパーチャーアングル (@d4isuk3) 2015, 10月 5
ありました、ありがとうございます pic.twitter.com/SXpzUoZlM5
— デパーチャーアングル (@d4isuk3) 2015, 10月 5
https://t.co/UfqLla8zNh これゆかてんさんあたりに説明してもらいたい奴
— らすね@紅楼夢D-42b (@Lacenaire_ssw) 2015, 10月 8
端的に何をやっているか説明すると、TABLICEと言う名前のデータベース(おそらくオービスで取得したデータを格納するもの)を削除しています。
「SQLインジェクション」と言うのはデータベースへの攻撃手法の一つで、外部からのデータをデータベースに取り込むシステムの不備を突いて、任意のSQL文を実行します。システム作成者が意図しているSQLの中に別のSQLを注入(inject)して実行させることからSQLインジェクションと呼ばれています。
この画像では「DROP DATABASE TABLICE」がinjectされたSQL文です。このSQL文自体は、TABLICEというDATABASEをDROPする(削除する)だけで、勝手に実行されるめっちゃ困りますが、特に難しいものでもありません。
さて、これをどのように実行させているか。
この画像では解像度や角度の問題もあり分かりにくいですが、ググって出てきたページによると、ナンバーとして読み取らせているのは
ZU 0666', 0, 0); DROP DATABASE TABLICE; --
のようです。
実際のシステムがどのようなSQLを発行しているかは分かりませんが、例えば次のようなSQLの雛形を用意して
INSERT INTO TABLICE VALUES('
この雛形は真っ当なナンバーを読み取っている間は正常に動作します。では画像のような文字列を読み取らせるとどうなるか見てみましょう。
INSERT INTO TABLICE VALUES('ZU 0666', 0, 0); DROP DATABASE TABLICE; --', 0, 0);
SQLではシングルクォーテーションで括られた部分を文字列として解釈します。(そのため雛形でも読み取ったナンバーが入る場所はシングルクォーテーションで括られています)
よって、シングルクォーテーションで括られた「ZU 0666」までが文字列として解釈され、以降はSQL文として解釈されます。SQLにおいてセミコロンは文の区切りとして用いられるので、上のSQLは次の三行のSQL文になります。
INSERT INTO TABLICE VALUES('ZU 0666', 0, 0);
DROP DATABASE TABLICE;
--', 0, 0);
1行目はナンバーとして「ZU 0666」を読み取った場合の正常なSQL文
2行目はinjectされたTABLICEと言う名前のデータベースを削除するSQL文
3行目はハイフン二つから始まるのでコメントとして無視されます
SQLではセミコロンで区切って複数の文を記述することで、それら全てを実行することができますので、2行目のinjectされたSQLも実行され、TABLICEと言う名前のデータベースが削除されます。
オマケ
この攻撃を防ぐ場合には、読み取ったナンバーに含まれるシングルクォーテーションを、SQLとして意味があるシングルクォーテーションではなく文字列のシングルクォーテーションとして解釈するように前処理を掛けます。
この前処理のことを「エスケープ」と呼びます。