私は長い間 PHP を開発してきましたが、プロジェクトを完了することに集中するたびに、セキュリティの問題にあまり注意を払ったことはありませんでしたが、最近インターネットでセキュリティに関する記事を目にしました。それを読んだ後、私は以前のプロジェクトに大きなセキュリティホールがあったことに気付き、プロジェクトを選んでテストしてみたところ、簡単にその被害に遭ってしまうことが分かりました。ここでは、PHP のセッションがどのように安全でないのか、またプロジェクト内のセキュリティを強化する方法を説明するために私が作成したテスト例を共有します。
セッションの原理や仕組みについては、インターネット上に良い紹介記事がたくさんありますので、自分で確認することも可能です。テスト用の例を直接共有しましょう。
このテストの例は主にログインページです。ログインに成功した後、パスワードを変更できます。
インターフェイスは次のとおりです
まず、プロジェクトの入り口で関数 session_start() を使用してセッションを開きます。このようにして、クライアントがリクエストを開始すると、ID 識別子、つまり SessionID が生成されます。これは、Cookie を通じてクライアントに保存され、クライアントとサーバー間の各通信は、識別のためにこの SessionID に依存します。
ログインに成功すると、ユーザーIDとユーザー名がセッションに保存されます
今後のすべての操作では、$_SESSION['userid'] が存在するかどうかを判断することで、ユーザーがログインしているかどうかがチェックされます。コードは次のとおりです:
パスワード変更インターフェイスの呼び出しは、ajax post を通じてサーバーにデータを送信します。
このコードは HTML ページに記述しているので、HTML コードを見ればインターフェースのアドレスがわかることに注意してください。
このようにしてパスワードを変更するためのインターフェースが実装されます。まず、ユーザーがログインしているかどうかを判断します。ユーザーがログインしている場合は、パスワードの変更操作が実行されます。
テスト例の実装アイデアは大まかに上記の通りです。
SessionID 攻撃を使用する
1. 1 つ目は、SessionID を取得することです。もちろん、攻撃者がこの ID を取得する方法はたくさんあります。ここでは取得方法を紹介しません。最初に通常どおりこのプロジェクトにアクセスし、次にブラウザを通じて SessionID を確認して正当なユーザー ID を取得することで、これをシミュレートできます。この ID はリクエストヘッダーで確認できます
セッションIDを取得後、ユーザーがログインに成功すると、サーバー側のセッションにユーザーの情報が残ります。
2. SessionID を取得した後、攻撃者がパスワードを変更するためのインターフェイスをすでに知っている場合、ユーザーのパスワードを直接変更できます。攻撃者がまだインターフェイス アドレスを取得していない場合は、ページ コードを調べることでインターフェイス アドレスを見つけることができます。次のコマンドを使用できます
上で述べたように、この例では、Ajax コードが HTML ページに記述されているため、インターフェイスのアドレスはこのページで確認できます
HTMLコードの一部は以下の通りです
3. インターフェースを取得したら、curl を使用して投稿をシミュレートし、データを送信してパスワードを変更できます
コマンドは以下の通りです
このユーザーがすでにログインしている場合、攻撃者は上記のコマンドを実行することでユーザーのパスワードを変更できます。
解決策
上記の攻撃に対しては、検証方法を複雑にすることで安全性を高めることができます。方法の 1 つは、リクエスト ヘッダーで User-Agent 項目を使用してセキュリティを強化することです
プロジェクトの開始時に、session_start() 関数を使用してセッションを開始しました。これで、このコードを session_start() の下に追加できるようになりました
その後、ログインするかどうかを判断するたびに、以下のように判断条件を追加します
これにより、上記の単純な攻撃を回避できます。
概要:
もちろん、実際の攻撃はそれほど単純ではありません。まず、SessionID を取得することが困難です。次に、上記の状況を回避するために、サーバーと通信するコードを可能な限り暗号化する必要があります。コードを 2 回変更した後は、攻撃の複雑さを増すことはできますが、攻撃を排除することはできません。攻撃にはさまざまな方法がありますが、これは単なるアイデアを示したものに過ぎませんが、実際の状況に応じてコードのセキュリティを強化することができるという原理は同じです。
ここでは私が仕事上で遭遇した問題を共有しているだけですが、皆さんももっと深く学んでいただければ幸いです。