おさらいnote ~第3回 SQLインジェクション(1)~

こんにちは。おひさしぶりです。
インターンシップの準備やテストなどでぜんぜん更新できていなかったので
ゆるゆる更新していきたいと思います。
今回はインジェクション攻撃をおさらいしていきます。その中で今回から数回に分けてSQLインジェクションをピックアップしたいと思います!
*この攻撃手法はインターネット上で実行できてします。場合によっては犯罪になるので必ずローカルな環境で行ってください…!


SQLってなーに

SQLはデータベース(RDBMS)を操作するための言語です。データベースにデータを挿入したり、検索したりする際に利用します。データベースのなかには、数万・数百万件ものデータが保存されていますが、SQLを使うことで効率的に操作をすることが可能なのです。
SQLは国際標準化されているため、さまざまなデータベースで利用できます。有名なデータベースとしては、Oracle、MySQL、PostgreSQL、SQLiteなどが、いずれもSQLで操作可能です。
SQLでデータベースに対して行える操作として、主に次のようなものがあります。データベースに関わるあらゆる操作をSQLで行います。
・データの検索
・データの追加
・データの更新
・データの削除
・テーブルの作成
・テーブルの削除
・テーブルの主キーの設定
・ユーザー権限の付与

引用元サイトはこちらから

簡単に言うとデータベースを扱うのに特化した言語です。日常的に使っているものをあげれば、会員登録が必要なサイトなどでしょうか。会員登録でテーブル(情報一覧)を追加し、ログインでテーブルを探索、退会でテーブルを削除という感じです。


認証回避

まずはどのようにして認証を行っているのかを見ていきます。あるサイトへのログインを想定します。

画像1

順をおって説明します。
①POST user = apple , pass = 110110 
ユーザーがログインしようとしています。これはユーザーが入力した情報です。Webアプリに送信されます。
②select*from users
where user = 'apple' and pass = '110110'
1行目はusersという情報一覧から見つけてね!という命令です。
2行目はuserって行にappleって人いる?passに110110ってある?と探しています。
③探す
データベースがテーブル名usersから情報を探しだし、見つかっていることが図でわかりますね!
④結果を返す
最終的にユーザーはログインできました!

という流れです!


ではこれの何がまずいのでしょうか…実はWebアプリからデータベースに情報を送る②に原因があります。

もし①でユーザーがuser = apple , pass=' or 'a' = 'a と打ったらどうなるでしょうか?②で見てみましょう。
select * from users
where user = 'apple' and pass = ''  or 'a' = 'a'
passの部分を見てみましょう。なんとシングルクォート(’)の対応するものが変化し、passが何もないか、a=aの時に成り立つ文に変化してしまいました。

このように意図しない方法で認証を回避することを認証回避といいます。


対策方法

そのままSQL文に挿入することが可能になるとインジェクション攻撃が可能になってしまいます。
挙げられる解決策として特殊な文字列は無害化する処理を行う( ’ が入力されたら ” に変換する等)


最後に

今回はSQLインジェクションをピックアップしました!
最後まで読んでいただきありがとうございました~~


この記事が気に入ったらサポートをしてみませんか?