この記事では、私はそれが.. まあ、セキュリティにあまり注意を払っていません。 私が作業するのは、デモ目的でSpring Bootで作成したサンプルJavaアプリケーションです。 しかし、実行される攻撃は、他のプログラミング言語やフレームワークに有効です。 実証される脆弱性とセキュリティ上の問題には、次のものがあります:
- SQLインジェクション
- 機密データの公開
- 不十分なロギング
- 壊れた認証
セットアップ
私たちは、あなたがいくつかのグループの一部であるユーザーとしてログインすることを可能にする架空のwebアプリケーションで作業します。 ユーザーの役割に基づいて、彼は基本データまたは機密データのいずれかを表示することができます。 この場合、会社の従業員のリスト、ステータスなどが表示されます。
このアプリケーションのソースはmy Github:https://github.com/rapasoft/hackmeで見つけることができます。
攻撃#1: Man in the middle attack
あなたがレストランに座っていて、上記のアプリケーションで何かをチェックしたいと想像してください。 あなたは、レストランのWi-Fiに接続し、ログインページを開き、資格情報を入力し、必要な情報(例えば、特定の従業員のリスト)を取得します。 あなたが今ではないかもしれないことは、あなたの資格情報が侵害されているということです。 ログインページをよく調べてみましょう:
このアプリケーションはSSL/TLSを使用しません(例:https://
接続なし)。 これは、送信された情報は、クライアントとサーバー間の通信にアクセスできるすべての人がプレーンテキストとして表示できることを意味します。
これはまさにいわゆる中間攻撃の男で起こっていることです。 具体的には、この場合、ARPスプーフィングはネットワーク全体を毒殺する方法として使用されているため、攻撃者はすべてのパケットを盗聴することがで ARPスプーフィングがどのように機能するかについては詳しく説明しませんが、このビデオでそれを実証します:
詳細を見るには、このYoutubeビデオを新しいウィンドウとフルスクリーンで開く必要があるかもしれません
上記で見ることができるのは、MITM攻撃の包括的なスイートであるEttercapを開始し、ローカルネットワークでARPスプーフィングを実行したことです。 その間、ユーザー(iPad経由で私)が資格情報を入力すると、EttercapとWireshark(ネットワークトラフィック分析ツール)の両方に表示されます。
攻撃#2: SQLインジェクション
このアプリケーションの攻撃者としての役割を続行すると、パスワードP4SSW0RD
を持つユーザーhgraves
の資格情報が得られます。 あなたは、このアプリケーションは、TLSを使用していないだけでなく、それはユーザーが本当にひどいパスワードを選んだ可能にする非常に弱いパ
私たちは、上記の資格情報を使用してログインし、人々のリストを検索するためのオプションを持つ一つの入力フィールドを見ることができます。 Search
を押すと、人の完全なリストが表示されます。 たとえば、”Fra”を入力すると、検索に基づいてフィルタリングされた結果が得られます。 違法な文字を入れたらどうなる? このアプリケーションの背後にいくつかのデータベースがあることは明らかですので、'
文字を試してみましょう:
これは失敗しただけでなく、POST
要求がSQL文全体の構造を公開する非常に具体的なエラーメッセージで失敗したことがわかります。 最後にWHERE P.NAME LIKE '%'%'
が使用されていることがわかります。
熟練したハッカーは、より多くを必要としません。 検索文字列を調整すると、いくつかの試行の後にこれらの結果が得られます:
この場合のインジェクションでは、ユーザー名とパスワードをロールとともにフェッチするunion to select文が作成されました。 これは成功しただけでなく、元のクライアントアプリケーションに表示することができました。
すべてのユーザーの資格情報とそのロール(”年齢”列に整数で表示されます)が表示されるようになりました。 したがって、hframe
がロール1を持つ場合、rgraves
はロール3を持つより重要なユーザーでなければなりません。
攻撃#3: 弱いハッシュ化されたパスワードの攻撃
最初の攻撃では、このアプリケーションにパスワードポリシーが設定されていない可能性があることを学びました。 これは、rgraves
がセキュリティにあまり注意を払わないことを願っています。
不十分なハッシュアルゴリズム(この場合はMD5のような)を使用するパスワードのハッシュを解読する最も簡単な方法は、辞書またはレインボーテーブル攻撃を実行することです。 そこに多くの可能性がありますが、最も簡単なものは、すでにパスワードとハッシュの組み合わせの大規模なデータベースを持っているインターネッ:
最初のものは
hframe
、2番目のものはrgraves
です。smorgan
は辞書にはないので、他のものよりも強いパスワードを使用しているようです。
あなたはrgraves
のパスワードがswordfishであることを見ることができます。 今、何もこのユーザーとしてログインし、”管理者”セクションと機密情報を発見することから私たちを停止しません:
あなたがドイツ語であればこれを読んではいけません:)
これを修正するには?
これはすべて簡単に防ぐことができると言うかもしれません。 これらは新人の間違いだったと言うかもしれません。 まあ、これは本当かもしれませんが、Open Web Application Securityプロジェクトは、Webアプリケーションの#1の脆弱性としてInjectionをリストしています(そして、それは数年前
だから、あなた自身がこのすべてを防ぐ方法を疑問に思っていたなら、要約してみましょう:
- サーバーに何かを送信するときは常にSSL/TLSを使用してください。 それは資格情報である必要はありません、それは現在一般的に良い習慣として考えられています。 あなたはすべてであなたのページ上の任意の入力を持っていない場合でも! 最も簡単な方法は、Let’S Encryptのようなサービスを介して証明書を提供することです。
- 自己署名証明書はデータ公開の問題を軽減するかもしれないが、MITM攻撃者が自分の自己署名証明書でサイト全体を偽るのを防ぐことはできないこ
- SQLクエリを扱う場合は、常にクライアントから取得したパラメータをエスケープします。 たとえば、Springではnamedparameterjdbctemplateを使用できますが、これは読みやすさにも適しています。
- 任意のユーザー入力を検証します。 再びJava/Springの世界では、Hibernate validatorのような
JSR-380
bean検証実装を使用して検証ルールを追加し、パラメータに注釈を付けることができます。@Pattern(regexp = "*") String name
は'
を入力できません。 - アプリケーションに無効な入力を渡そうとする試みをログに記録します。 さらに、エラーが発生した場合は、実装固有の情報をクライアントに公開しないでください。
-
- 可能であれば、少なくとも2要素認証を使用してください。
- カスタムパスワードストレージまたは暗号化アルゴリズムを実装しません。 あなた自身で行うことは非常に困難であり、あなたは間違いなく失敗します。 BCryptのような実績のある解決策があります。
- OWASPトップ10を読み、ブックマークします。 そこから始めて、ベストプラクティスのリストを調べてください。