がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

second-order SQL injection ( セカンドオーダーSQLインジェクション )

高木先生のBlogより。
http://takagi-hiromitsu.jp/diary/20051231.html#p05
…いやまぁ「リンク先に移動して読んでね」で片付けたほうが早いんだけど。
まぁ一応ここは「めも」なので、必要なところを書いておきますっていうか引用しておきます。

たとえアプリケーションが常にシングルクオートをエスケープしていても、攻撃者はなおも、データベース中のデータがそのアプリケーションで再利用されるときにSQLをインジェクトすることができる。


Username: admin'--
Password: password


例えば、攻撃者がアプリケーションに登録して、ユーザ名「admin'--」、パスワード「password」のユーザ名を作ったとしよう。
このアプリケーションはシングルクオートを正しくエスケープし、このようなINSERT文が作られる。


insert into users values( 123, 'admin''--', 'password', 0xffff)


このアプリケーションが、ユーザにそのパスワードを変更することを許しているとしよう。


新パスワードをセットするクエリはこんな感じになるかもしれない。


sql = "update users set password = '" + newpassword + "' where
username = '" + rso("username") + "'"


ユーザ名 admin'-- が与えられると、以下のクエリが生成される


update users set password = 'password' where username = 'admin'--'


したがって攻撃者は、admin'-- というユーザを登録することによって、admin のパスワードを自由にセットできる。

んっと…まぁ「エスケープ処理を忘れただけジャン」とかいう突込みが頭に浮かぶし高木先生も同じように突っ込まれておりますが。
とはいえ、他人様のプログラムをチェックする際には考慮しておきたいポイントの一つなのかもしれません。