少し前に、ハブでのSQLインジェクションに関する次の記事を読みました。この記事はPHPの真実に焦点を当てており、ユーザーからのデータを処理する方法、それらを実行する機能を通して、論争が生じました。 次に、ASP.NET MVCでのセキュリティの仕組みを示すためにアイデアが生まれました。
まず、簡単なサイトを作成します。ステップバイステップの作成については説明しません。ASP.NETMVC4とEntity Framework 4.3.1(データベースを操作するためのORM)を使用するテクノロジの束について説明します。 プロジェクトは記事の最後にダウンロードできます。
その結果、静的なニュースが1つとコメントを追加できるサイトができました。
クロスサイトスクリプティング(XSS)
XSSでハックを始めましょう。コメントを追加して、ページにスクリプトを埋め込みます。
次に、スクリプトを使用してコメントを追加しようとします。
クリックしてコメントを追加すると、エラーが発生します。
ウェブサイトを機能させる最も速い方法は何ですか? もちろん、メソッドの検証を切り捨てます:
[ValidateInput(false)]
これはタスクではありません。繰り返しますが、スクリプトは実行されません。
これは、デフォルトで、すべてのテキストがエンコードされ、出力がエンコードされるため、状況が変わる可能性があるためです。
@Html.Raw()
ユーザーを信頼できないことを覚えておく価値があります。たとえば、ハーバーパーサーが行うように、チェックされたコンテンツを保存するだけで、潜在的に危険なコンテンツを削除できます。 また、XSSの助けを借りて、閉じられていないimgタグを使用してデータを盗むことができます。ページが読み込まれると、機密データが第三者に届く可能性があります。 スクリプトをデータベースに書き込む方法の例を挙げましたが、jqueryを使用して$ .html()を使用してXSSホールを返す新しい開発者がいつか現れることを覚えておく価値があります。セキュリティ。
SQLインジェクション
インジェクションを使用してサイトをハックするために、著者の名前でコメントを検索するフィールドがある別のページを作成しました。リンクの段階で行を渡さないため、数値モデル、ブール値などを操作する方法を作成しても意味がありません(結合)入力パラメーターとモデル、このデータは除かれます。
実際に、私が何かをしようとしなかった限り、それはうまくいきませんでした、ORMの使用は非難することです、そこに文字列の連結はありません、データはパラメータによって送信され、エスケープされます データベースを操作するときにORMまたは他の安全な方法を使用しない人( servitRMの例)を想像するのは難しいです(まず、ユーザーがラインを接続して受け取ったフォームにデータが挿入されないようにすることについて話します)プロジェクトはゼロからであり、技術に制限はありません。おそらくいくつかの古いモジュールが使用されている場合、それらを書き換える時間はありません-何らかの方法で正当化できますが、責任は開発者にあります。
クロスサイトリクエストフォージェリ(CSRF)
この攻撃の例としては、たとえば、内部通貨を持つサイトがあり、別のユーザーに送金するために必要なPOST要求は1つだけです。 攻撃者は自分のサイトでフォームを作成し、アクション(フォームアクション)で別のサイトをポイントし、隠されたパラメーターを作成します:量、
ウォレットなど...そのサイトで承認されたら、彼にお金を送金します(他のオプション:何かを削除する、一般に、ほとんどのPOSTリクエストを追加する)。
これに対処するために、MVCにはプレゼンテーション用のヘルパーがあります。これはフォームボディである必要があります。
@Html.AntiForgeryToken()
これで、コントローラーの(アクション)メソッドの属性:
[ValidateAntiForgeryToken]
何をしたかを確認しましょう(XSSを使用してこのロジックをページに追加しました)。通常のリクエストを行います。
非表示フィールドに加えて、Cookieも取得しました。
ここで、この非表示フィールドを削除して結果を確認します(少なくとも3つのオプション、ビューから削除、Firebugで削除し、FiddlerのComposerを使用してより興味深い、成功したリクエストをドラッグし、リクエスト本体でこのパラメーターを削除します):
このパラメーターはすべてのリクエストで生成されるわけではなく、将来パケットを傍受することはハッキングされる可能性があることを覚えておく価値があります。
情報隠蔽
多くはこれに注意を払っていませんが、この項目は非常に重要だと思います。 金属製のドアのロックを選択すると、多くのロックはドリルで簡単に開けることができることを学びました。3本の太いボルト(シリンダーが外に出る)がありますが、右の1つの穴を開けるだけで十分です
場所(いわば弱点でのポイントストライク)と城が開いています。 同様に、そのようなIIS、ASP.NETのそのようなバージョンなどがあると言う場合 攻撃者に非常に貴重な支援を提供します! Elmahのログをお茶できれいにして、サイトでphp、mysqlを見つけようとしている様子、すばらしいサービスを使用してどのCMSが使用されているかなどを確認したい
ここに私のサイトが今戻っているものがあります:
X-Powered-Byを削除します。
<system.webServer> ... <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> </httpProtocol> ... </system.webServer>
ASP.NETバージョン:
<system.web> ... <httpRuntime enableVersionHeader="false" /> ... </system.web>
Application_StartのMVCバージョン:
MvcHandler.DisableMvcResponseHeader = true;
そして最も難しい部分はサーバーであり、そのためにHttpModuleを作成します。
public class CustomServerHeaderModule : IHttpModule { public void Init(HttpApplication context) { context.PreSendRequestHeaders += OnPreSendRequestHeaders; } public void Dispose() { } private void OnPreSendRequestHeaders(object sender, EventArgs e) { HttpContext.Current.Response.Headers.Set("Server", "Apache 2000 Server"); } }
構成に追加します:
<system.webServer> ... <modules runAllManagedModulesForAllRequests="true"> ... <add name="CustomServerHeader" type="HackingMVC.HttpModules.CustomServerHeaderModule" /> </modules> ... <system.webServer>
その結果、次の結果が得られました。
結論の代わりに
ASP.NETがセキュリティで有名であることは何の理由でもありません。MVCは非常に活発に開発されており、各バージョンでますます興味深いものになっています。 いくつかの点は考慮されず、私は何かを見逃しましたが、何かを言及するだけで十分です。いずれにせよ、1つの記事の枠組み内でこのような膨大なトピックを考慮することは不可能です。 サイトでSSLを使用することが非常に重要であるという事実に注目する価値があります。そうしないと、認証中にデータが盗まれたり、ページ上のセッション、認証トークン、またはその他のデータが盗まれたりして、多くの保護が無効になります。 JSONハイジャックと、許可を指定せずにGETリクエストを介してデータを受信しようとすると警告をスローするのは簡単ではないという事実を忘れないでください。この方法では、失うことを恐れないデータのみを与える必要があります。 発生する可能性があり、開発時に注意すべき問題の一部のみを示しました。
PSこのサイトの要望とハッキングオプションは大歓迎です: zipアーカイブ 。 (ダウンロードしたNuGetパッケージがソリューション/プロジェクトに含まれているため、8.7 MB)またはパッケージなしでzipアーカイブ (706 Kb)。
更新:パッケージなしでアーカイブを追加しました。 ハッシュに関するいくつかの言葉:サイトは管理パネルにフォーム認証を使用し、パスワードはweb.configにクリア形式で保存されます。これはソースを表示するときにわかりやすくするために行われました。 実際のプロジェクトでは、設定とデータベースの両方でパスワードハッシュを使用する必要があります。また、既知のハッシュアルゴリズムでデータを受信した後、テーブルを介してパスワードを渡すことができず、ソルトが異なるため、値を見つけることができないように、ソルトを使用する必要があります同じパスワードを見つけるための1つのパスワードのハッシュ。