クロスサイトスクリプティング攻撃を防ぐには?

クロスサイトスクリプティング防止とは何ですか?

クロスサイトスクリプティング防止とは、webサイトまたはwebアプリケーションのXSS脆弱性を本番環境に到達する前に検出し、修正するプロセスです。 XSSの脆弱性の検出は、自動化された脆弱性スキャナを使用して自動的に行うか、侵入テストを手動で実行することによって行うことができます。 この記事では、クロスサイトスクリプティング防止のベストプラクティスと、それらをすぐに実装する方法を学びます。 この記事の最後には、無料の開発者向けの脆弱性スキャナへのリンクもありますので、クロスサイトスクリプティングの脆弱性の検出と修正を:

  • クロスサイトスクリプティング防止とは何ですか?
  • クロスサイトスクリプティングはどのように機能しますか?
  • XSS攻撃の種類は何ですか?
  • クロスサイトスクリプティング防止はどのくらい重要ですか?
  • クロスサイトスクリプティング保護
    • 動的コンテンツのエスケープ
    • ホワイトリストの値
    • コンテンツセキュリティポリシーの実装
    • HTMLのサニタイズ
    • HTTP専用Cookie
  • コード例を使用したXSS防止
    • Pythonでのクロスサイトスクリプティング防止(Django)
    • Rubyでのクロスサイトスクリプティング防止(Rails)
    • Javaでのクロスサイトスクリプティング防止(Java Server Pages)
    • C#でのクロスサイトスクリプティング防止(ASP.NET)
    • ノードでのクロスサイトスクリプティング防止
      • 口ひげ。js
      • js
      • ヌンジャックス
    • PHPでのクロスサイトスクリプティング防止
    • AngularJSでのクロスサイトスクリプティング防止
    • Reactでのクロスサイトスクリプティング防止
  • 自動化されたツールは、クロスサイトスクリプティングを防ぐにはどうすればよいでしょうか?

クロスサイトスクリプティングはどのように機能しますか?

クロスサイトスクリプティング(XSS)攻撃は、悪意のあるスクリプトが信頼されたwebアプリケーションに注入される注入攻撃の一形態です。

クロスサイトスクリプティングの仕組み図

攻撃者はwebアプリケーションを使用して、通常はブラウザサイドスクリプトの形で悪意のあるコードを別のエンドユーザーに送信することができ、XSS攻撃を引き起こす可能性があります。

XSSの脆弱性は非常に一般的であり、webアプリケーションが生成された出力内に含まれる有効なユーザーからの入力を使用しますが、適切な検証またはエン

悪意のあるスクリプトがユーザーに送信されると、ブラウザはスクリプトを信頼すべきではないことを断固として知ることができず、その後スクリプトを実行します。 このスクリプトは、cookie、セッショントークン、または実際にそのサイトのブラウザによって保持される可能性のあるその他の機密情報を含む多数のデー

XSS攻撃の種類は何ですか?

XSS攻撃には主に三つのタイプがあります:

  1. 反射されたXSS:悪意のあるスクリプトは、現在のHTTP要求
  2. 格納されたXSSから来ています: 悪意のあるスクリプトは、WEBサイトのデータベース
  3. DOMベースのXSSから来ています。

クロスサイトスクリプティング防止はどのくらい重要ですか?

XSSの脆弱性を悪用することによる被害は、サイトが処理するデータの機密性に依存します。 ハッカーがXSS脆弱なアプリを悪用した例を次に示します:

  • ソーシャルメディア上でワームを拡散:Facebook、TwitterやYouTubeは、すべてが正常にこのように攻撃されています。
  • セッションハイジャック: 悪意のあるJavaScriptは、ハッカーの制御下にあるリモートサイトにセッションIDを送信することができ、ハッカーは進行中のセッションをハイジャックしてそのユーザーを偽装することができる可能性があります。
  • 個人情報の盗難:ユーザーがクレジットカード番号などの機密情報を侵害されたwebサイトに入力すると、悪意のあるJavaScriptを使用してこれらの詳細が盗まれる
  • サービス拒否攻撃とウェブサイトの破壊行為。
  • パスワードなどの機密データの盗難。
  • 銀行サイトでの金融詐欺。

クロスサイトスクリプティング保護

動的コンテンツのエスケープ

通常、webページがレンダリングされると、動的コンテンツはHTMLに織り込まれます。 動的コンテンツが不適切に処理された場合、攻撃者はそれを使用して格納されたXSS攻撃を構築することができます。 攻撃者は、別のユーザーがそのページを訪問したときにブラウザで評価される悪意のあるJavaScriptコードを挿入することによって、編集可能なフィールドを悪用し

サイトがコンテンツ管理システムでない限り、ユーザーに生のHTMLを作成させたくない場合があります。 データストアから来るすべての動的コンテンツをエスケープするので、ブラウザは生のHTMLではなくHTMLタグの内容として扱われることを知っています。

動的コンテンツをエスケープするには、一般的に有効な文字をHTMLエンティティエンコーディングに置き換える必要があります:

” &#34
# &#35
& &#38
‘ &#39
( &#40
) &#41
/ &#47
; &#59
< &#60
> &#62

以下のコードサンプルでわかるように、最新のフレームワークのほとんどは、デフォルトで動的コンテンツをエスケープします。

この方法で編集可能なコンテンツをエスケープすることにより、コンテンツはブラウザによって実行可能コードとして扱われることはありません。 これにより、ほとんどのXSS攻撃が防止されます。

ホワイトリストの値

動的データ項目が有効な値のほんの一握りを取ることができる場合は、データストア内の値を制限します。 また、レンダリングロジックでは、既知の適切な値のみが許可されていることを確認してください。

このアプローチを使用したい場合の例は、ユーザーに手動で入力させるのではなく、ドロップダウンリストから国を選択するように求めることです。

コンテンツセキュリティポリシーの実装

最新のブラウザはコンテンツセキュリティポリシーをサポートしています。 コンテンツセキュリティポリシーを使用すると、Webページの作成者は、JavaScriptやその他のリソースをロードして実行できる場所を制御できます。

XSS攻撃を可能にするためには、攻撃者はページの<html>タグ内のどこかにインライン<script>タグを挿入するか、ブラウザをだまして悪意のあるサードパーティ

応答ヘッダーにコンテンツセキュリティポリシーを設定すると、インラインJavaScriptを実行しないようにブラウザに指示し、ページのJavaScriptをホストできるドメ:

Content-Security-Policy: script-src 'self' https://apis.google.com
スクリプトをロードできるUrlをホワイトリストに登録することで、インラインJavaScriptは許可されていないことを暗黙的に示しています。コンテンツセキュリティポリシーは、ページの<head>要素の<meta>タグに配置することもできます:

<meta http-equiv="Content-Security-Policy" content="script-scr 'self' https://apis.google.com">

このアプローチは、ユーザーを保護するのに非常に効果的ですが、そのようなヘッダーのためにあなたのサイトを準備するための規律が必要です。 インラインスクリプトを使用することは、現代のweb開発では悪い習慣と考えられていますが、古いレガシーサイトでは一般的です。

インラインスクリプトから段階的に移行するには、CSP違反レポートを使用することを検討してください。 ポリシーヘッダーにreport-uriディレクティブを追加すると、ブラウザはインラインJavaScriptの実行を防止するのではなく、ポリシー違反を通知します:

Content-Security-Policy-Report-Only: script-src 'self'; report-uri http://example.com/csr-reports

これは、あなたが完全にそれらを禁止する前に、長引くインラインスクリプトがないことを安心させます。

Htmlをサニタイズ

一部のサイトでは、生のHTMLを保存してレンダリングする正当な必要性があります。 サイトがリッチコンテンツを保存してレンダリングする場合は、htmlサニタイズライブラリを使用して、悪意のあるユーザーがHTML送信にスクリプトを挿入

HTTP専用Cookie

悪意のあるJavaScriptを使用して、ユーザーのセッションIDを含むcookieを盗むことができます。 クライアント側のJavaScriptでcookieを読み取ったり操作したりする正当な理由はほとんどありませんので、COOKIEをHTTP専用としてマークすることを検討してくださ

コード例を使用したXSS防止

Python(Django)でのクロスサイトスクリプティング防止

DjangoのテンプレートはデフォルトでHTMLをエスケープするので、次のようなものは:

**{{ contents }}**

|safeフィルターを使用してescapeを上書きできます。 多くの場合、これを行うには正当な理由がありますが、このコマンドを使用するすべてのコードレビューを行う必要があります:

**{{ contents | safe }}**

HTML-escapingは{% autoescape %}タグでオンまたはオフにすることもできることに注意してください。

Ruby(Rails)のクロスサイトスクリプティング防止

RailsテンプレートはデフォルトでHTMLをエスケープするので、次のようなものは一般的に安全です:

<%= contents %>

escapeをオーバーライドするには、raw関数を使用するか、<%==演算子を使用します。 これを行うには多くの場合、正当な理由がありますが、これらの関数を使用するすべてのコードレビューを行う必要があります:

<% raw contents %>

<%== contents %>

Javaでのクロスサイトスクリプティング防止(Java Server Pages)

c:outタグを使用してHTMLを安全にエスケープします:

<c:out value="${contents}">

テンプレートへの次の書き込み方法はHTMLをエスケープしないので、注意して使用する必要があります:

<%= contents %>

${contents}

<%
out.println(contents);
%>

C#でのクロスサイトスクリプティング防止(ASP.NET)

HTMLを安全にエスケープするには、次のいずれかの関数を使用します(<%:形式は、<%:形式で導入されましたASP.NET 4.0):

<%= HttpUtility.HtmlEncode(contents) %>

<%: contents %>

テンプレートへの次の書き込み方法は、HTMLを自動的にエスケープしないため、注意して使用する必要があります:

<%= contents %>

HTMLを手動でエスケープする必要がある場合は、HttpUtility.HtmlEncode(...)を使用します。

ノードのクロスサイトスクリプティング防止

口ひげ。js

口ひげで。js、二重口ひげ内の任意のタグは自動的にHTMLをエスケープします:

{{ contents }}

triple mustachesのタグはHTMLをエスケープしないので、注意して使用してください:

{{{ contents }}}

ホコリjs

キータグは自動的にHTMLをエスケープします:

{ contents }

ただし、エスケープは|s演算子で無効にすることができますので、これは注意して使用してください

{ contents | s }

Nunjucks

環境で自動エスケープがオンになっている場合、Nunjucksは安全な出力のためにタグを自動的にエスケープします:

{{ contents }}

安全なフィルタでマークされたコンテンツはエスケープされません–この機能は注意して使用してください:

{{ contents | safe }}

自動エスケープはテンプレートに対して無効にすることができ、その場合はタグを手動でエスケープする必要があります:

{{ contents | escape }}

PHPのクロスサイトスクリプティング防止

PHPのechoコマンドはデフォルトでHTMLをエスケープしません。:

<?php
Echo $_POST;
?>

AngularJS

のクロスサイトスクリプティング防止中括弧で書かれたコンテンツは自動的にエスケープされるため、次のように安全です:

<div>{{dynamicContent}}</div>

動的コンテンツをinnerHTML属性にバインドするコードは、自動的にエスケープされないことに注意してください:

<div ="dynamicContent"></div>
<div innerHTML]="{{dynamicContent}}"></div>

React

のクロスサイトスクリプティング防止中括弧で書かれた動的コンテンツは自動的にReactでエスケープされるため、次のコードは安全です:

render() {
return <div>{dynamicContent}</div>
}

コンテンツをdangerouslySetInnerHTMLプロパティにバインドすることで、生のHTMLを書き出すこともできます。 名前は偶然ではないので、次のようなコードを探してください:

render() {
return <div dangerouslySetInnerHTML={ __html: dynamicContent } />
}

自動化されたツールは、クロスサイトスクリプティングを防ぐにはどうすればよいでしょうか?

上記のように、クロスサイトスクリプティング攻撃を防止することは簡単で、多くのフレームワークはデフォルトで動的コンテンツをエスケー しかし、その利便性は、不注意や、アプリケーションやビジネスに深刻なセキュリティ上の弱点をもたらす可能性があります。
ビルド/コミットごとにセキュリティ脆弱性を早期に検出して修正するために、DevOpsおよびCI/CDパイプラインの一部として、運用環境にリリースする前に、

NeuraLegionの動的アプリケーションセキュリティテストスキャナNexploitを使用すると、今日のセキュリティテストの自動化を開始できます。 開発者向けに構築され、誤検知なしで、パイプラインに統合して、セキュリティテストを左にシフトし、設計によって安全にすることができます。
ここで無料アカウントにサインアップ:https://nexploit.app/signup

Leave a Reply

コメントを残す

メールアドレスが公開されることはありません。