今年もお盆はお墓まりに行けなかった、どうも、ボクです。
お墓、オハカ、オ!ハッカー、Oh!hacker !?
ということで、Paizaのハッカー入門 を受講しました~。
SQLインジェクションとは?
Wikipediaさんに聞いてみた。
SQLインジェクション(英: SQL Injection)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。また、その攻撃を可能とする脆弱性のことである。
とあり、
であると。
意図しないSQLを実施させるってことですね。
Paizaのレッスンの例でいくと(言語はPHPです)、
$content = $_POST['content']; $sth = $pdo->query('INSERT INTO bbs (user_name, content) values("' . $user_name . '","' . $content . '")' );
みたいな状態だと、
hack"),("mikage","konnichiwa"); --
上記のような入力が与えられた場合、$content の部分に、上記のテキストが入ることになるので、
INSERT INTO bbs (user_name, content) values("eve","hack"),("mikage","konnichiwa"); --")
ってな、SQLが実行されることになると。
つまり、eve さんとして投稿したいはずなのに、mikage さんという人としても投稿してしまっていると。
なので、SQLインジェクションされないようにするには、PHPの場合は、
$content = $_POST['content']; $query = 'INSERT INTO bbs (user_name, content) values(" . :user_name . "," . :content . ")' ; $sth = $pdo->prepare($query); $sth->bindValue(':user_name', '%' . $user_name . '%', PDO::PARAM_STR); $sth->bindValue(':content', '%' . $content . '%', PDO::PARAM_STR); $sth->execute();
ってな具合になるのだと。
なんか、Javaだと、
⇧ JDBC Driver の実装に依存するらしい...結局どうしろと?
そして、
⇧ 裁判とかも起こりえるとかね~、そんなに重要なことなのに、正しい実装方法の情報に誰もが安易に辿り着けない感じが、もう駄目なんじゃないかという気がするが...
少なくとも自分は、Java に関しての正しい実装方法が分からず終いなんですけど...
クロスサイトスクリプティングとは?
Wikipediaさんに聞いてみた。
クロスサイトスクリプティング(英: cross site scripting)とは、Webアプリケーションの脆弱性もしくはそれを利用した攻撃。脆弱性をツリー型に分類するCWEではXSSを不適切な入力確認(CWE-20)によるインジェクション(CWE-74)のひとつとして分類している(CWE-79)。略称はXSS。
⇧ まったく、分かりづらいわ...
ということらしく、多いのが、JavaScript を強制実行させるってパターンらしいですと。JavaSript 以外にも、
インジェクションする言語
XSS攻撃に用いる「Webブラウザで実行可能なコンテンツ」の例として、CWE-79では以下のものを挙げている:
- JavaScript
- HTML タグ
- HTML アトリビュート
- マウスイベント
- Flash
- ActiveX
⇧ 可能性は無限大...じゃないけど、対策していかないといけないことが盛りだくさんですかね...。
狙われる個所としては、
インジェクション箇所
HTML内には攻撃者が悪意のあるスクリプトをインジェクションし得る箇所として以下のものがある:
2.の場合、URLとして「javascript:(JavaScript文)」の形式(javascriptスキーム)を利用してJavascriptを注入することができる
⇧ 多いな!
で、対策については、
すでに述べたように、XSSへの対策としてはユーザからフォームの値を取得した際、htmlで特別な意味を持つ記号を以下のように別の記号に置き換える(エスケープ処理をする)という方法がある:
- 「<」 → <
- 「>」 → >
- 「"」 → "
- …
このようにすると攻撃者が攻撃用スクリプトを埋め込むのに利用したhtmlのタグ「<script>」は「<script>」という無害な文字列に置き換わってしまうので上述したXSS攻撃を回避できる。
とあり、
PHPなら、関数1つで解決できるぞと。サニタイジング(エスケープ)処理で万事解決や~んって思っていたんだけど。
だが、しかし!
しかしこのような対策には限界があり、#インジェクション箇所で述べた、スクリプトが直接記述可能な箇所やURLを記述可能な箇所に対しては、この対策は効かない。
投げやり感が半端ない...
銀の弾丸は無いっちゅうことですかね...
といわけで、ハッカー入門してみましたが、入門では太刀打ちできない状況が世の中には跳梁跋扈してるわけですかね...
まぁ、セキュリティのインシデントが起こるのも致し方ない感じですかね...。
今回はこのへんで。