Paizaのレッスン ハッカー入門を受講してみた

f:id:ts0818:20190804102841p:plain

今年もお盆はお墓まりに行けなかった、どうも、ボクです。

お墓、オハカ、オ!ハッカー、Oh!hacker !?

ということで、Paizaのハッカー入門 を受講しました~。

f:id:ts0818:20190819145031p:plain

 

SQLインジェクションとは?

Wikipediaさんに聞いてみた。

SQLインジェクションSQL Injection)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。また、その攻撃を可能とする脆弱性のことである。

SQLインジェクション - Wikipedia

とあり、

SQLに別のSQL文が「注入 (inject)」されることから、「ダイレクトSQLコマンドインジェクション」もしくは「SQL注入」と呼ばれることもある。

SQLインジェクション - Wikipedia

であると。

意図しない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だと、

www.websec-room.com

JDBC Driver の実装に依存するらしい...結局どうしろと?

 

そして、

itlaw.hatenablog.com

⇧  裁判とかも起こりえるとかね~、そんなに重要なことなのに、正しい実装方法の情報に誰もが安易に辿り着けない感じが、もう駄目なんじゃないかという気がするが...

少なくとも自分は、Java に関しての正しい実装方法が分からず終いなんですけど...

 

クロスサイトスクリプティングとは?

Wikipediaさんに聞いてみた。

クロスサイトスクリプティングcross site scripting)とは、Webアプリケーション脆弱性もしくはそれを利用した攻撃。脆弱性をツリー型に分類するCWEではXSSを不適切な入力確認(CWE-20)によるインジェクション(CWE-74)のひとつとして分類している(CWE-79)。略称はXSS

クロスサイトスクリプティング - Wikipedia

⇧  まったく、分かりづらいわ...

XSS攻撃は、ウェブサイト(標的サイト)の脆弱性(XSS脆弱性)を利用する事で、標的サイトの権限で悪意のあるコンテンツ(多くの場合スクリプト)を実行する事を目的として行われる

クロスサイトスクリプティング - Wikipedia

ということらしく、多いのが、JavaScript を強制実行させるってパターンらしいですと。JavaSript 以外にも、

インジェクションする言語

XSS攻撃に用いる「Webブラウザで実行可能なコンテンツ」の例として、CWE-79では以下のものを挙げている:

クロスサイトスクリプティング - Wikipedia

⇧  可能性は無限大...じゃないけど、対策していかないといけないことが盛りだくさんですかね...。

狙われる個所としては、

インジェクション箇所

HTML内には攻撃者が悪意のあるスクリプトをインジェクションし得る箇所として以下のものがある:

  1. フォームなど変数の値を入力可能な場所
  2. スクリプト
    • <script></script>の内部、および<script></script>のURLのリモート参照
    • タグのstyle属性およびイベントハンドラ属性中のスクリプト記述。具体的には<div style="...;z:expression(...);...">や、<span onmouseover="...">等
  3. URLを属性値として取れる要素、およびそこでのスクリプト直接記述
    • 具体的にはa要素のhrefとimg、frameとiframeのsrc属性

2.の場合、URLとして「javascript:(JavaScript文)」の形式(javascriptスキーム)を利用してJavascriptを注入することができる

クロスサイトスクリプティング - Wikipedia

⇧  多いな!

で、対策については、

すでに述べたように、XSSへの対策としてはユーザからフォームの値を取得した際、htmlで特別な意味を持つ記号を以下のように別の記号に置き換える(エスケープ処理をする)という方法がある:

  • 「<」 → &lt;
  • 「>」 → &gt;
  • 「"」 → &quot;

このようにすると攻撃者が攻撃用スクリプトを埋め込むのに利用したhtmlのタグ「<script>」は「&lt;script&gt;」という無害な文字列に置き換わってしまうので上述したXSS攻撃を回避できる。

クロスサイトスクリプティング - Wikipedia

とあり、

なおエスケープ処理は例えばPHPのhtmlspecialchars関数を利用する事で実現可能である。

クロスサイトスクリプティング - Wikipedia

PHPなら、関数1つで解決できるぞと。サニタイジングエスケープ)処理で万事解決や~んって思っていたんだけど。

だが、しかし!

しかしこのような対策には限界があり、#インジェクション箇所で述べた、スクリプトが直接記述可能な箇所やURLを記述可能な箇所に対しては、この対策は効かない。

クロスサイトスクリプティング - Wikipedia

投げやり感が半端ない...

銀の弾丸は無いっちゅうことですかね...

 

といわけで、ハッカー入門してみましたが、入門では太刀打ちできない状況が世の中には跳梁跋扈してるわけですかね...

まぁ、セキュリティのインシデントが起こるのも致し方ない感じですかね...。

今回はこのへんで。