計算式を解決して、その答えを表示するコードを記載します。データをチェックして、ユーザーが選択した演算を判断します。次に、計算式をストリングとして作成します。して動的に作成されたストリングを解釈します。動作中の電卓を示します。電卓についての説明は以上です。次は、アプリケーションのコアとなるユーザー設定に目を向けます。最大の機能は、ユーザーが個人用にカスタマイズできることです。文を作成して実行します。ディレクトリーに移されます。(プロフィール写真)」フィールドからなるユーザー設定インターフェースを示します。機能をひと通り説明したので、今度はその実装を詳しく調べていきます。以降のセクションでは、このアプリケーションに存在する脆弱性を取り上げ、その脆弱性を悪用する方法、そしてその攻撃を防ぐための対策について説明します。攻撃に対して脆弱です。つのタイプがあります。迷惑なものでしかないと誤解されています。大した脅威ではないこともありますが、多くの場合、ユーザー・アカウントを侵害されやすい状態にするか、ユーザーをそれ以上の危険にさらします。リクエスト・データがエンコードもフィルタリングもされずにレスポンスでレンダリングされるのを悪用して行われます。ソーシャル・エンジニアリングの助けを借りれば、アタッカーは、ユーザーをそのようなリクエストを作成するページに誘い込むことができます。実行できるようになるというわけです。一般に、折り返し型より深刻な脅威です。脆弱性は持続するとみなされます。悪意のあるデータがアプリケーション内に保持されることから、攻撃のソーシャル・エンジニアリングの側面は単純になります。悪用の仕方によっては、ソーシャル・エンジニアリングがまったく利用されない場合もあります。脆弱性が溢れています。両方の脆弱性があります。悪用する場合を示します。攻撃の効果は、クライアント・サイドで対策が取られていない限り、リンクにナビゲートした時点で以下のようにたちまち明らかになります。してインストールされている場合がありますが、クライアント・サイドのフィルターを当てにはしないでください。保護するだけにすぎません。脆弱性をもたらすこともあります。(姓)」のフィールドに入れて、ユーザーを検索してください。攻撃を防ぐには、サーバー・レスポンスでユーザー入力に適切なエンコードを適用するだけのことです。エンティティーのエンコードを適用するだけで、悪意のあるアクションを十分に防ぐことができます。これで、アップロードされたコードに対して以下の攻撃をテストすると、異なる結果になります。エンティティーとなるため、アタッカーはマークアップを注入することができません。属性値に注入する場合には、値そのものの中で、値を囲むために使用するストリング区切り文字が確実に削除またはエンコードされるようにしてください。ないと、以下のような属性インジェクションが発生しかねません。属性インジェクションが発生する仕組みを示します。アクセスできなくなります。この機能に頼ることはできません。一部のブラウザーでは、まったくサポートされないためです。次のセクションでは、よく見られる脆弱性として、システムの他のユーザーに対するクライアント・サイドの攻撃を仕掛けるために利用できる脆弱性を取り上げます。アタッカーがユーザーをだまして、そのユーザーのセキュリティー・コンテキスト内でアクションを実行させることです。あろうと、ハッカーはこの類の攻撃を仕掛けることができます。攻撃のほうが大きな脅威となります。使ってリクエストを偽造し、アタッカーがそのリクエストを画像のソースとして使用できるからです。攻撃を仕掛けることが可能になります。攻撃へと改変することができます。利用した攻撃の一例です。この攻撃は、ターゲットとするユーザーのパスワードを新しいパスワードに変更します。表示すると、ユーザー設定の更新リクエストが作成されます。このリクエストは、正当なユーザーのリクエストとまったく同じですが、フォームの値はすべてアタッカーによって制御されています。防ぐには、いくつかの一般的な方法があります。リクエストが信頼できるソースからのものでなければ、そのリクエストを拒否します。リファラーのチェックが詳細であればあるほど、優れたセキュリティーになります。request");ただし、この方法は絶対に確実なわけではありません。確実な対策は、セキュリティー・トークンを利用して、保護されたフォームごとに、サーバーが長くて十分にランダムなトークン値を組み込むことです。サーバー・サイドで各トークン値を追跡し、必ずそのトークン値が一度だけ使用されていること、そして事前に定義された期間が過ぎると失効するようにします。フォームの送信時に、トークン値が欠如していたり、無効な値になっていたり、失効していたりする場合には、そのリクエストは偽造されている疑いがあるという理由で拒否されます。トークン値を推測することができなければ、アタッカーは攻撃を作成することができません。防ぐことにもなります。以降のセクションでは、サーバー・サイドのいくつかの脆弱性を見て行きます。アクセス制御突破ほとんどの場合、自動化されたユーティリティーを使ってアクセス制御をテストするのは容易ではありません。このことから、アクセス制御の問題は見過ごされがちです。認証されていないユーザーや承認されていないユーザーが、本来はアクセスが拒否されるはずのリソースにアクセスできる場合、そのアプリケーションのアクセス制御は不完全と言えます。非特権ユーザーから隠すことで度々発生します。隠すだけでリソースを保護できるとは思わないでください。探し出すことができます。使うことで、許可されていないリソースにアクセスできてしまう恐れもあります。それは、認証迂回と特権昇格です。認証バグは、認証済みユーザーではないことを検出するプロセスを終了し損なうことが原因で発生します。参照)、一見したところ、想定通りの振る舞いとなります。ブラウザーはログイン・ページにリダイレクトされます。デバッグ・プロキシーを使ってトラフィックを調べると、見た目以上のかなりのことが行われていることが明らかになります。ステータス・コードで応答しましたが、レスポンスの本体には、認証済みユーザーが受け取るすべての情報が含まれています。パスワードの変更に成功し、ターゲット・アカウントは改ざんされています。つのアクセス制御の問題があります。フォームの隠しフィールドとしてフォームとともに送信されます。あることを確認するための検証は行われないまま、その値を使ってデータベースからレコードがロードされます。指定したりして、他人のユーザー・アカウントを変更できるというわけです。認証迂回を防ぐには、認証または承認のチェックが失敗した場合には、保護されたアプリケーション・ロジックが決して実行されないようにしてください。フィールドを設定しても、実行は終了されないことです。記載する承認コードであれば、正しく終了します。関数が呼び出されます。このステップにより、残りのスクリプトは実行されません。特権昇格を廃絶するには、すべての特権アクションに対して適切な承認が行われるようにしてください。データをサーバー・サイドに格納できる場合、クライアント・サイドにはデータを格納しないようにする必要があります。セッションに格納できるデータの好例です。以下に、修正の一部を記載します。インジェクションです。この有名な脆弱性は、さまざまな結果をもたらす可能性があります。インジェクションは、その認識度は高くなってはいるものの、依然として問題となっています。インジェクションが成功することでもたらされる結果は、脆弱性によってさまざまに異なりますが、例えば以下の脅威がもたらされることがあります。インジェクションに対して脆弱です。そのため、いくつかの入力ベクトルを操作することになります。認証については、ユーザー名フィールドに条件を注入し、クエリーの残りの部分をコメントアウトすることによって迂回することができます。意図されていたクエリーを記載します。悪意のあるストリングを使って最初の条件にコードを注入した文を記載します。テーブルに含まれるすべてのレコードのカウントを返します。評価され、アタッカーにアクセス権を与えることになります。ユーザー検索機能は、特に任意のデータを抽出するために悪用できるという点で脆弱です。本来は機能するはずの検索クエリーを記載します。演算子を使った、まったく新しい以下のクエリーを追加することで、自由自在にデータを取得することができます。上記の攻撃用ストリングを送信した後に動的に生成されたクエリーを記載します。インジェクションを防ぐには、ユーザーが送信するすべての入力を適切にエスケープして検証する必要があります。そのための機能が備わっています。示すように、攻撃ストリングの先頭にある区切り文字がエスケープされることにより、認証迂回は不可能になります。md5('');フォーマット・ストリングでは、正しい型の指定子を使用することが重要です。(int)$_GET['id']);次のセクションではファイル・インクルージョンを取り上げます。アプリケーションでよく発生するタイプのバグです。つのタイプがあります。その名前が示すように、このタイプの脆弱性は、アタッカーに任意のファイルをインクルードさせる隙を与えます。その結果、ファイルの内容が開示されるのか、それともコードとして実行されるのかは、その脆弱性を悪用した攻撃の性質次第です。無効にされていれば、リモート・ファイル・インクルージョンは不可能となるのが通常です。オープンできるように構成されている場合には、リモート・ファイル・インクルージョンに対しても脆弱です。バイトを渡すことで、任意のファイルをインクルードすることができます。ファイルをインクルードする、悪意のあるリクエストを示します。サーバーのレスポンスです。バイト攻撃は成功しなくなっていることに注意してください。使用することのみをファイル・インクルージョンの脆弱性に対する対策として考えないでください。コードとして解釈させることもあります。可能であれば、ファイルの読み込みまたはインクルードを行う関数には、ユーザー入力を渡さないようにしてください。行っているように、ホワイトリストを使ってデータを検証するという方法を採るようにしてください。サーバーがユーザーから送信されたファイル名の拡張子を追加するようにしてください。値しか許可されないため、ユーザーは言語選択機能を悪用して任意のファイルをインクルードすることはできません。ローカル・ファイル・インクルージョンも深刻な脅威ですが、次のセクションで説明する攻撃による結果は、それよりもさらに深刻です。コマンド・インジェクションはかなり深刻な脅威です。オペレーティング・システムのコマンドを実行する関数にユーザー入力を渡す場合には、必ずデータが適切にエスケープされるよう、くれぐれも十分注意してください。コマンド・インジェクションに対して脆弱なのは、ユーザー設定機能の擬似画像圧縮です。name="imagecompression"5|calc------WebKitFormBoundaryFnGBYVe08wA8NMrs-このリクエストによって、以下の値がシステム関数に渡されます。コマンドを実行する関数には、ユーザー入力を渡さないでください。関数を使用して、同様の結果を得ることができます。安全な手法を取ることが不可能で、信頼できないデータを使ってコマンドラインの引数を作成しなければならないとしたら、必ずそのデータが適切にエスケープされるようにしてください。関数が用意されています。修正後のユーザー設定コードを記載します。渡してからシステムに渡すことで、パイプなどの悪意を持って使われる可能性がある文字をサニタイズすることができます。コマンド・インジェクションと同じような結果をもたらす場合がよくあります。スクリプト言語インジェクションスクリプト言語インジェクションの脆弱性は、ユーザー入力がコードとして解釈される場合に発生します。多くの場合、この脆弱性はサーバーのセキュリティー侵害という結果をもたらします。アタッカーはこの脆弱性を利用して、インタープリター・プロセスのセキュリティー・コンテキストでコードを実行できるためです。電卓機能はスクリプト言語インジェクションに対して脆弱です。入力の両方を使用して任意のコードを実行することができますが、これらの入力は数値の型を持っているため、クライアント・サイドの制約を迂回しなければなりません。デバッグ・プロキシーを使用することで実現することができます。/CMA/insecure/calculator.php?x=1&y=1;system(%22calc%22)&operation=operation-addあるいは、以下のように手動でクエリー・ストリングを作成するという方法もあります。/CMA/insecure/calculator.php?x=1;system(%22calc%22);//&y=1&operation=operation-add評価後のコードでは、スクリプト・インジェクション攻撃の効果が以下のように現れます。スクリプト言語インジェクションの防止策ユーザー入力をコードとして評価することは避けてください。採っている手法です)。適用して、セキュアでないと思われる入力を一切拒否してください。ユーザー入力をサニタイズしようとはしないでください。使用していないため、スクリプト言語インジェクションに対してはセキュアです。次のセクションでは、スクリプト言語インジェクションと同じような効果を、任意のファイル作成を利用して実現する仕組みを説明します。多くの場合、任意のファイル作成による攻撃は、スクリプト言語インジェクションと同じような結果をもたらします。アタッカーが適当な拡張子を持つファイルを作成し、そのファイルにアクセスして任意のコードを実行できるということです。アタッカーはこうした攻撃を何通りもの方法で実現可能なため、ファイルを作成するために使用できる機能に取り組む際には十分注意してください。場合によっては、この機能をディレクトリー・トラバーサルなどの他の脆弱性と組み合わせることで、アタッカーがさらに大きな危害を加えることも考えられます。ファイルをアップロードするというものです。以下の単純なスクリプトでリモート・シェルを提供することができます。コマンドを難なく実行できるようになります。使って新しいスクリプトを作成できる場合もあります。サーバーの権限次第で、以下のようにディレクトリー・トラバーサルを使用して重要なシステム・ファイルを上書きし、実質的にサーバーのセキュリティーを侵害することさえ可能です。'../../htdocs/shell.php'クエリーの最初の列はお馴染みのはずです。注入するクエリーを作成するシェルhttp://localhost/CMA/insecure/search.php?query='and%201=0%20UNION%20SELECT%20'%3C?php%20system($_GET[%22CMD%22]);%20?%3E',''%20FROM%20dual%20INTO%20OUTFILE%20'../../htdocs/shell.php';%23このタイプの攻撃がターゲットとするパスは、試行錯誤によって見つけられます。利用して見つけることもできます。可能であれば、ユーザーが作成する可能性のあるファイルの拡張子に対して、ホワイトリスト検証を行ってください。修正で使用している手法です。同じような修正を実装できない場合には、ブラックリスト検証を適用して、悪意のある拡張子が許可されないようにします。複数の拡張子をブラックリストで拒否することになります。入力内容に悪意があると判断された場合にはその入力を拒否し、問題のあるデータをサニタイズしようとはしないでください。バイト攻撃されていないこと、そしてファイル拡張子がホワイトリストに含まれていることをチェックします。返された場合、スクリプトは強制終了されます。正規表現ベースの拡張子フィルターは使用しないようにすることをお勧めします。示す検証関数は、迂回することができます。バイト攻撃を受ける可能性があります。示すように、これを防ぐための対策はありますが、複雑さが増すため、この手段は避けてください。バイト攻撃の有無をチェックすることで、アタッカーがストリング終了文字を注入するのを防ぐことができます。インジェクションの脆弱性を確実に修正して、アタッカーがデータベース・サーバー機能を使用してファイル・システムを操作できないようにする必要があります。アプリケーションにデータベース・サーバー機能が必要ない場合には、データベース特権を使って機能を無効にすることを検討してください。サーバー以外のサーバーで実行します。サーバー機能を使用してユーザーへのアクセスを禁止してください。アタッカーがファイル拡張子のフィルタリングを迂回できるとしたら、この手法を適用することで、悪意のあるスクリプトにアクセスして実行することが困難になります。クライアントがアップロード先フォルダーを制御できるようにはしないでください。ディレクトリー・トラバーサルを使用して、保護されていないディレクトリーにファイルを格納する恐れがあります。まとめ冒頭で述べたように、このチュートリアルではソフトウェア・セキュリティーのすべてを網羅しているわけではありません。実際、ソフトウェア・セキュリティーの全体像は常に変化しているため、すべてを網羅した情報源などというものは存在しません。進化を続けるアタッカーに対して最も効果的な対策となるのは、常に新しいセキュリティーの脅威に関する情報を読んで、時流についていくことです。脆弱性が発生する理由とその防止策について詳しく検討している優れた資料の数々については、「参考文献」を参照してください。バグがないと宣言できるシステムが無いように、完全にセキュアであるとみなせるシステムも無いことを覚えておいてください。実装する方法について学んでください。よる開発方法について詳しく学んでください。変数の改ざん、バッファー・オーバーフロー攻撃、クロスサイト・スクリプト攻撃、ブラウザー内でのデータ改ざん、そしてリモート・フォーム送信などの最も一般的なセキュリティー脅威から守る方法について学んでください。アプリケーションのセキュリティーを強化してください。クライアント・サイド攻撃の詳細を知り、よくある攻撃を回避する方法を学んでください。脆弱性の悪用、報告、そして新旧両方のツールに関する優れた情報源を調べてください。アプリケーションのセキュリティーを大局的に把握してください。アプリケーション・ソフトウェアのセキュリティーを強化するための豊富な関連情報とツールを見つけてください。公に知られた情報セキュリティーの脆弱性および脅威に関する優れた情報源を調べてください。同様、公開された脆弱性に関するこの情報源をくまなく調べてください。ホーム・ページにアクセスしてください。フレームワークに関する記事、API、そしてデモ・コードにアクセスしてください。オープンソース・チームのホーム・ページにアクセスしてください。ベスト・プラクティスを調べてください。分野でのスキルを磨くための資料を入手してください。製品でオープンソース技術を使用するときに役立つ広範囲のハウツー情報、ツール、プロジェクト・アップデート、そして人気の高い記事とチュートリアルを調べてください。認定技術者になる方法について調べてください。ゾーンを参照してください。関するヒントを読んでください。ツイートをフォローしてください。ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。素早く入手してください。環境をまとめてインストールできるローカル・サーバー環境を入手してください。ディストリビューションを入手してください。デバッグ・プロキシーをダウンロードして試してみてください。オンライン試用版を試してみてください。コメントコメントを登録するにはサインインあるいは登録してください。