ホームページ >バックエンド開発 >PHPチュートリアル >PHPコードの監査
この文書は昨年作成されたものであり、十分に書かれていない部分もあります。
owasp コードレビューといえば、2.0 がリリースされる時期が来ました。
牛たちが通りかかり、アドバイスをしてくれました。
目次
1. 概要3
2. 入力検証と出力表示3
2.1 コマンドインジェクション4
2.2 クロスサイトスクリプティング4
2.4 コードインジェクション5
2.5 SQL インジェクション6
2.6 XPath インジェクション6
2.7 HTTP応答分割 6
2.8 ファイル管理 6
2.9 ファイルアップロード 7
2.10 変数カバレッジ 7
2.11 動的関数 7
3.1 HTTPOnly 設定 8
3.2 ドメイン設定 8
3.3 パス設定 8
3.4 クッキー期間 8
3.5 安全な設定 8
3.6 セッション固定 9
3.7 CSRF 9
4.1 パスワードを平文で保存する 9
4.2 弱いパスワード暗号化 9
4.3 攻撃者がアクセスできる場所にパスワードを保存するファイルが到着しました 9
5.1 ユーザー認証 10
5.2 関数またはファイルへの認証されていない呼び出し 10
5.3 パスワードのハードコーディング 10
6.1 rand() 10
6. 2 mt_srand()および mt_rand() 11
7.1 マルチバイト エンコーディング 11
8. PHP の危険な関数 11
8.1 バッファ オーバーフロー 11
8.2 session_destroy() によるファイルの削除脆弱性 12
8. 3 unset()-zend_hash_del_key_or_index 脆弱性 12
9.1 phpinfo 13
10. PHP 環境 13
10.1 open_basedir 設定 13
10.2allow_url_fopen 設定 13
10.3allow_url_include設定13
10.4safe_mode_exec_dir設定14
10.5magic_quote_gpc設定 14
10.6 register_globals 設定 14
10.7 セーフモード設定 14
10.8 session_use_trans_sid 設定 14
10.9 display_errors 設定 14
10.10 Expose_php 設定 14
1. コードレビューはアプリケーションの体系的なレビューです。ソースコード 動作を確認します。その目的は、開発段階でアプリケーションに存在する抜け穴やプログラム ロジック エラーを見つけて修正し、企業に不必要なリスクをもたらすプログラムの脆弱性の不正使用を回避することです。
コードレビューは単にコードをチェックするだけではなく、コードが情報やリソースを安全に保護できるかどうかを確認するためのものであるため、アプリケーション全体のビジネスプロセスを理解し、可能性を制御することが非常に重要です。リスク。レビュー担当者は、以下のような質問を使用して開発者にインタビューすることで、アプリケーション情報を収集できます。
アプリケーションにはどのような種類の機密情報が含まれていますか?また、アプリケーションはこの情報をどのように保護しますか?
アプリケーションは内部または外部にサービスを提供しますか?誰がそれを使用しますか? 彼らは全員信頼できるユーザーですか?
アプリケーションはどこにデプロイされていますか?
企業にとってアプリケーションはどの程度重要ですか?
最善の方法は、チェックリストを作成し、開発者に記入してもらうことです。チェックリストは、アプリケーション情報と開発者が作成したコーディングのセキュリティをより直観的に反映できます。データ検証、ID 認証、セッション管理、認可、暗号化、エラー処理、ロギング、セキュリティなど、重大な脆弱性がある可能性のあるモジュールをカバーする必要があります。構成、ネットワーク アーキテクチャ。
2. 入力の検証と出力の表示
ほとんどの脆弱性の主な原因は、入力データが安全に検証されていないか、出力データが安全に処理されていないことです。
1.完全に一致する
2. ホワイトリストからのデータを受け入れる 3. ブラックリストからのデータを拒否する
4. ブラックリストに一致するデータをエンコードする
PHP でユーザーが入力できる変数のリストは次のとおりです:
$ _SERVER
$ _GET
$_POST
$_COOKIE
$_REQUEST
$_FILES
$_ENV
$_HTTP_COOKIE_VARS
$_HTTP_ENV_VARS$_HTTP _GET_VARS
$_HTTP_POST_FILES
$_HTTP_POST_VARS
$_HTTP_SERVER_VARS
これらの入力変数がチェックされます
1. コマンドインジェクション
PHP は次の関数を使用してシステムコマンドを実行できます: system、exec、passthru、"、shell_exec、popen、proc_open、pcntl_exec
これらの関数を検索しますすべてのプログラム ファイルを確認し、外部からの送信によって関数のパラメーターが変更されるかどうかを判断し、これらのパラメーターが安全に処理されたかどうかを確認します。
予防方法:
2. コマンド パラメータを処理する関数
3. 実行可能ファイルのパスを指定するために、safe_mode_exec_dir を使用します
2. クロスサイト スクリプティングユーザーが受け入れられて処理され、出力がクライアントに直接表示されます。ストレージ このタイプのクロスサイトは、ユーザーによって送信された変数が処理されてデータベースに保存され、その後、情報がデータベースから読み取られて、クライアントへの出力はよく使用されます: echo、print、printf、vprintf、< %=$test%>
リフレクティブ クロスサイトの場合、出力はすぐにクライアントに表示されます。現在のPHPページで変数が顧客によって送信された直後に表示されるかどうか、および変数がこのプロセス中に表示されるかどうかを確認します セキュリティチェックに合格しました
ストレージ型クロスサイトの場合、変数をデータベースに入力して表示用に出力するプロセスで、変数がセキュリティチェックに合格しているかどうかを確認します。
防止方法:
1. 入力データに文字と数字のみが含まれている場合は、特殊文字をブロックする必要があります
2. 電子メール形式、ユーザー名には英語または中国語、アンダースコアのみが含まれるなど、入力データと厳密に一致します。 、ハイフン
3. 出力の HTML エンコード、エンコード仕様
( (
) )
" "
' ..完全に一致するようにデータを入力します。たとえば、変数の値に基づいて言語 en.php と cn.php を決定し、これら 2 つのファイルを同じディレクトリ ' language/'.$_POST['lang'] に配置します。 .'.php', 次に、送信されたデータが en か cn かをチェックするのが最も厳密です。
2. パラメーターに /、.. およびその他の文字が含まれているかどうかをチェックすることもできます。
4. コードインジェクションコードインジェクションは PHP 関数で発生する可能性があります: eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function
プログラム内でこれらの関数が使用されている場所を見つけ、送信された変数がユーザー変数であるかどうかを確認します。制御可能か、入力検証の有無
防止方法:
1.入力データの完全一致
2.実行可能関数をフィルタリングするホワイトリスト方式
5.SQLインジェクション
SQLインジェクションはデータベースの操作を必要とするため、一般的にSQL ステートメントのキーワードを検索します: 挿入、削除、更新、選択、チェック 渡された変数パラメーターがユーザー制御可能かどうか、およびそれらが安全に処理されたかどうか防止方法:
パラメーター化されたクエリを使用する
6.関数は安全に処理されました
予防方法:
データの正確な一致
7. HTTP レスポンスの分割
PHP で HTTP レスポンスの分割が発生する可能性がある状況は、header 関数の使用と $_SERVER 変数の使用です。 PHP の上位バージョンでは HTTP ヘッダーに改行文字を使用することが禁止されているため、このテストを直接スキップできることに注意してください。
回避方法:
1. 入力データと完全に一致します
2. 入力に r または n があるかどうかを検出し、それを直接拒否します
8. ファイル管理のための PHP の関数 (入力変数の場合)ユーザーが送信できますが、プログラム内でデータ検証が行われていないため、高リスクの脆弱性となる可能性があります。プログラム内で次の関数を検索する必要があります: copy、rmdir、unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、fputs ですが、通常はすべてファイル操作機能であっても危険な場合があります。
http://ir.php.net/manual/ja/ref.filesystem.php
防止方法:
1. 提出されたデータと厳密に一致する
2. ファイルを操作できるディレクトリを制限する
9. ファイルのアップロード
PHP ファイルのアップロードでは通常、move_uploaded_file が使用されます。特定の分析用のファイル アップロード プログラムも見つかります
防止方法:
1. ファイルのサフィックスを検出するためにホワイトリスト メソッドを使用します
2.時間に基づいてアルゴリズムで生成できます 名前
3. アップロード ディレクトリのスクリプト ファイルは実行可能ではありません
4. %00 の切り捨てに注意してください
PHP 変数の上書きは、次の状況で発生します。初期化変数のトラバース
例:
foreach($_GET as $key => $value)
$$key = $value;
2. 関数カバレッジ変数: parse_str、mb_parse_str、import_request_variables3. Register_globals の場合=ON、GET モードで変数を送信すると、直接オーバーライドされます
防止方法:
1. Register_globals=OFF を設定します
2. 動的関数を使用する場合、
ユーザーが変数を制御できるため、攻撃者が任意の関数を実行する可能性があります。
例:
< ?php $myfunc = $_GET['myfunc']; ?>
このような関数は使用しないでください
3.
1. HTTPOnly 設定
session.cookie_httponly = ON、クライアント スクリプト (JavaScript など) が Cookie にアクセスできないようにすることで、XSS 攻撃によるセッション ID のハイジャックを効果的に防ぐことができます
2. ドメイン設定
を確認します。 session.cookie_domain にはこのドメインのみが含まれます。親ドメインの場合、他のサブドメインはこのドメインの Cookie を取得できます3.パス設定
Web サイト自体が /app に適用されている場合は、パスが必要です。セキュリティを確保するために /app/ に設定する必要があります
4.cookie 期間
session.cookie_lifetime を確認します。時間設定プロセスが長すぎる場合、ユーザーがブラウザを閉じたとしても、攻撃者はアカウントのセキュリティを侵害します
5.安全な設定
HTTPS を使用する場合は、Cookie の転送に HTTPS が使用されるようにするために session.cookie_secure=ON を設定する必要があります
6.session は修正されました
権限レベルが変更された場合 (たとえば、ユーザー名とパスワードを確認した後、一般ユーザーが管理者に昇格した場合)、再生成されるセッション ID を変更する必要があります。そうしないと、プログラムがセッション固定のリスクに直面します。攻撃。
7.CSRF
クロスサイトリクエストフォージェリ攻撃とは、攻撃者が悪意のあるリクエストリンクを偽造し、通常のユーザーがさまざまな方法でそれにアクセスできるようにし、ユーザーとしてこれらの悪意のあるリクエストを実行することです。ユーザーのパスワード変更やユーザーの追加機能など、より重要なプログラム モジュールを見直し、CSRF 攻撃に対する防御にワンタイム トークンが使用されているかどうかを確認する必要があります。
4. 暗号化
1. パスワードを平文で保存する
パスワードを平文で保存すると、ユーザー、アプリケーション、システムのセキュリティが著しく脅かされます。
2. 弱いパスワード暗号化
簡単に解読できる暗号化アルゴリズムを使用しているため、MD5 クラッキング Web サイトを使用すると、MD5 暗号化を部分的に解読できます
3. パスワードは、攻撃者がアクセスできるファイルに保存されます
例: パスワードを保存するtxt、ini、conf、inc、xml などのファイル、または HTML コメントに直接記述されています
5. 認証と認可
1. ユーザー認証のコードの場所を確認し、ユーザー認証をバイパスできるかどうかを確認します。認証、例:login コード内にフォームインジェクションが存在する可能性があります。ブルートフォースクラッキングを防ぐために、ログインコードが認証コードなどを使用していないか確認してください
2. 認証されていない関数やファイルの呼び出し
一部の管理ページは一般ユーザーによるアクセスが禁止されており、開発者が権限を付与し忘れている場合があります。これらのファイルの検証は、脆弱性につながります
一部のページでは、index.php?action=upload などの権限検証を行わずにパラメーター呼び出し関数を使用します
3. ハードコードされたパスワード
一部のプログラムは、アカウントとパスワードをデータベースにリンクし、データベースリンク関数に直接書き込みます。
6. ランダム関数
1.rand()
rand() 最大乱数は 32767 です。 rand を使用してセッションを処理する場合、攻撃者は mt_rand() を使用することを推奨します。
2.mt_srand() および mt_rand()PHP4 および PHP5 7.特殊文字とマルチバイトエンコーディング
1.マルチバイトエンコーディング
8.PHPの危険な関数
1.バッファオーバーフロー
confirm_phpdoc_compiled
影響を受けるバージョン:
phpDocumentor phpDocumentor 1.3.1
phpDocumentor phpDocumentor 1.3 RC4
phpDocumentor phpDocumentor 1.3 RC3
phpDocumentor phpDocumentor 1.2.3
phpDocumentor phpDocumentor 1.2.2
phpDocumentor phpDocumentor 1.2
phpDocumentor phpDocumentor 1.2
mssql_pconnect/mssql_connect
影響を受けるバージョン: PHP crack_opendict
影響を受けるバージョン: PHP = 4.4.6
snmpget
影響を受けるバージョン: PHP ibase_connect
影響を受けるバージョン: PHP = 4.4.6
uns シリアライズ
インパクトバージョン: PHP 5.0.2、PHP 5.0.1、PHP 5.0.0、PHP 4.3.9、PHP 4.3.8、PHP 4.3.7、PHP 4.3.6、PHP 4.3.3、PHP 4.3.2、PHP 4.3。 1. PHP 4.3.0、PHP 4.2.3、PHP 4.2.2、PHP 4.2.1、PHP 4.2.0、PHP 4.2-dev、PHP 4.1.2、PHP 4.1.1、PHP 4.1.0、PHP 4.1、 PHP 4.0.7、PHP 4.0.6、PHP 4.0.5、PHP 4.0.4、PHP 4.0.3pl1、PHP 4.0.3、PHP 4.0.2、PHP 4.0.1pl2、PHP 4.0.1pl1、PHP 4.0.1
2.session_destroy() 削除ファイルの脆弱性
影響を受けるバージョン: 不気味、特定のテストが必要
テストコードは次のとおりです:
01
session_save_path('./');
session_start();