概要
コードレビューは、アプリケーションのソースコードを体系的に検査することです。その目的は、開発段階でアプリケーションに存在する抜け穴やプログラムロジックのエラーを見つけて修正し、企業に不必要なリスクをもたらすプログラムの脆弱性の不正利用を回避することです。その理由はコードレビューではありません。コードの安全性を確保し、情報とリソースを適切に保護するには、アプリケーション全体のビジネス プロセスを理解し、潜在的なリスクを制御することが非常に重要です。
監査人は、次のような質問を使用して開発者にインタビューし、アプリケーション情報を収集できます。
アプリケーションにはどのような種類の機密情報が含まれていますか? アプリケーションはこの情報をどのように保護しますか?
アプリケーションは内部または外部にサービスを提供しますか? 誰がそれを使用しますか? それらはすべて信頼できるユーザーですか?
どこにありますか?アプリケーションは導入されていますか?
ビジネスにとってアプリケーションはどのくらい重要ですか?
入力検証と出力表示
ほとんどの脆弱性の主な理由は、入力データが安全に検証されていないか、出力データが安全に処理されていないことです。より厳格なデータ検証方法は、データの正確な照合です。ホワイトリストに登録されたデータを受け入れる ブラックリストに登録されたデータを拒否する
ブラックリストに登録されたデータと一致するデータをエンコードする
$_HTTP_POST_FILES$_HTTP_POST_VARS
$_HTTP_SERVER_VARSこれらの入力変数を確認する必要があります
コマンドインジェクション
セキュリティ脅威
コマンドインジェクション攻撃は、入力メカニズム (有効な検証制限がないフォームフィールドなど) に HTML コードを入力することにより、Web ページの動的に生成されたコンテンツを変更し、悪意のあるコマンドが乗っ取ることを可能にする可能性があります。ユーザーのコンピュータとそのネットワーク。 PHP は次の関数を使用してシステム コマンドを実行できます:
system、exec、passthru、``、shell_exec、popen、proc_open、pcntl_exec
すべてのプログラム ファイルでこれらの関数を検索し、関数のパラメーターが送信されるかどうかを判断します。変更する前に、これらのパラメータが安全に処理されたかどうかを確認してください。
コード例
例1:
コードをコピー
コードは次のとおりです:
//ex1.php
$dir = $_GET["dir"];
if (isset( $dir)){
echo "
";<div class="codetitle">system("ls -al".$dir);<span style="CURSOR: pointer" onclick="doCopy('code1292')">echo "";}?>
コードをコピーします
コードは次のとおりです:safe_mode = On
safe_mode_exec_di r= /usr/local/php/bin/
クロスサイト スクリプティングの脅威 (クロスサイト スクリプティング)
セキュリティの脅威
クロス サイト スクリプト (XSS)、クロスサイト スクリプティングの脅威。攻撃者は、アプリケーションの動的データ表示機能を利用して、HTML ページに悪意のあるコードを埋め込みます。ユーザーがページを閲覧すると、HTML に埋め込まれたこれらの悪意のあるコードが実行され、ユーザーのブラウザが攻撃者によって制御され、攻撃者の特別な目的が達成されます。出力関数はよく使用されます: echo、print、printf、vprintf、<%=$test%>
クロスサイトスクリプティング攻撃には、次の 3 つの攻撃形式があります。
(1) 反射型クロスサイトスクリプティング攻撃 攻撃者は、ユーザーがページを開いたときに、ソーシャル エンジニアリング手段を使用して、ユーザーに URL 接続を送信します。 、閲覧 サーバーはページに埋め込まれた悪意のあるスクリプトを実行します。
(2) ストア型クロスサイトスクリプティング攻撃
攻撃者は、Web アプリケーションが提供するデータ入力や変更機能を利用して、データをサーバーやユーザーの Cookie に保存し、他のユーザーがデータを表示するページを閲覧すると、ブラウザーがそのデータをサーバーまたはユーザーの Cookie に保存します。ページに埋め込まれた悪意のあるスクリプトを実行します。すべての視聴者が脆弱です。
(3) DOM クロスサイト攻撃
HTML ページ内に JS が定義されているため、ユーザーの入力に基づいて HTML コードが表示され、攻撃者は入力中に悪意のあるスクリプトを挿入することができます。最終的に表示されると、悪意のあるスクリプトが実行されます。 DOM クロスサイト攻撃と上記の 2 つのクロスサイト攻撃の違いは、DOM クロスサイト攻撃は純粋なページ スクリプトの出力であり、標準化された方法で JAVASCRIPT を使用することによってのみ防御できることです。
悪意のある攻撃者は、クロスサイト スクリプティング攻撃を次の目的で使用する可能性があります:
(1) ユーザーの Cookie を盗み、偽のユーザー ID でログインします。 (2) 攻撃目的を達成するために、閲覧者に特定のページ操作を強制し、ユーザーとしてサーバーへのリクエストを開始します。
(3) ブラウザの脆弱性と組み合わせて、ウイルス トロイの木馬をブラウザのコンピュータにダウンロードして実行します。
(4) 派生 URL ジャンプの脆弱性。
(5) 公式サイトにフィッシングページを表示させる。
(6) ワーム攻撃
コード例
「ユーザーが制御可能なデータ」を HTML ページに直接表示すると、クロスサイト スクリプティングの脅威に直接つながります。
セキュリティの脅威
アプリケーションがユーザー入力を SQL ステートメントに結合し、実行のためにデータベースに送信すると、SQL インジェクションの脅威が発生します。ユーザーの入力も SQL ステートメントの一部であるため、攻撃者はこの制御可能なコンテンツを使用して、独自に定義したステートメントを挿入し、SQL ステートメントの実行ロジックを変更し、必要な命令をデータベースに実行させることができます。攻撃者は、一部の SQL ステートメントを制御することで、データベース内の必要なデータをクエリし、データベースの特性を利用して、データベース サーバーのシステム権限を直接取得できます。本来、SQL インジェクション攻撃では、攻撃者が SQL ステートメントを十分に理解している必要があるため、攻撃者のスキルには一定の要件があります。しかし、数年前、SQL インジェクション悪用ツールが多数登場し、攻撃者がマウスを数回クリックするだけで攻撃効果を得ることができるようになり、SQL インジェクションの脅威が大幅に増大しました。
SQL インジェクション攻撃の一般的な手順:
1. 攻撃者は、SQL インジェクションの脆弱性のあるサイトにアクセスし、インジェクション ポイントを探します。
2. 攻撃者は、インジェクション ステートメントを構築し、そのインジェクション ステートメントを SQL ステートメントと結合します。プログラム内で新しい SQL ステートメントを生成します
3. 新しい SQL ステートメントが処理のためにデータベースに送信されます
4. データベースが新しい SQL ステートメントを実行し、SQL インジェクション攻撃をトリガーします
コード例
入力チェックが不十分な場合、SQL ステートメントはステートメントの一部としてユーザーによって送信された不正なデータを実行します。
例:
$id=$_GET['id'];
$name=$_GET['name'];
$sql ="select * from news where `id`=$id and `username`='$name' ";
?>
解決策
a) セキュリティ設定とエンコード方法、PHP 設定オプションは、 php.iniファイルを指定します。次の構成方法により、PHP のセキュリティを強化し、SQL インジェクション攻撃からアプリケーションを保護できます。
1)safe_mode=onPHP は、現在のスクリプトの所有者がファイル関数またはそのディレクトリを通じて操作されるファイルの所有者と一致するかどうかを確認します。現在のスクリプトの所有者がファイル操作の所有者と一致しない場合は、これは不正な操作です
2) magic_quotes_gpc=on / off、このオプションがアクティブ化されている場合、リクエストパラメータに含まれる一重引用符、二重引用符、バックスラッシュ、およびヌル文字はバックスラッシュで自動的にエスケープされます。
3) magic_quotes_sybase=on/off、オプションが無効な場合、PHP はすべての一重引用符を一重引用符でエスケープします。
数値変数を確認します
$id=(int)$id;
注: PHP6 では魔法の引用符オプションが削除されました
b) 前処理を使用して SQL ステートメントを実行し、SQL ステートメントで渡されたすべての変数をバインドします。このように、ユーザーが接続した変数の内容がどのようなものであっても、置換記号「?」に置き換えられた値とみなされ、データベースは接続されたデータを解析しません。悪意のあるユーザーを SQL ステートメントの一部として使用します。例:
{
/* マーカーのパラメーターをバインド */
mysqli_stmt_bind_param($stmt, "s", $city);
/* クエリを実行 */
mysqli_stmt_execute($stmt);
/* 結果変数をバインド */
mysqli_stmt_bind_result($stmt , $district );
/* 値を取得 */
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
/* 接続を閉じる */
mysqli_close($link);
セキュリティの脅威
PHP ファイルアップロードの脆弱性は、主にファイルタイプを検証する際にファイル変数を処理しないことによって引き起こされる攻撃にあり、プログラムの判定ロジックがバイパスされ、攻撃者はスクリプトファイルをアップロードします。サーバーによって解析され、SHELL が取得されたり、アップロード時にファイルが勝手にコピーされたり、スクリプト型トロイの木馬が Web サーバーにアップロードされ、Web サーバーを直接制御したりすることもあります。 コードサンプル
ユーザーのファイルアップロードリクエストを処理するコード このコードは、ファイル拡張子をフィルターしません。
コードをコピーします
// oldUpload.php
if(isset($upload) && $myfile != "none“ && check($myfile_name)) {
copy($myfile, "/var/www/upload/".$myfile_name);
echo "文件".$file_name."上传成功!点击继续上传";
exit;
}
//checkUpload.php
$DeniedExtensions =配列('html','htm','php','php2','php3','php4','php5','ph
tml','pwml','inc','asp','aspx' ,'ascx','jsp','cfm','cfc','pl','bat','exe','
com','dll','vbs','js','reg', 'cgi','htaccess','asis') ;
if($checkUpload($_FILE['myfile'][name], $DeniedExtensions)){copy($_FILE['myfile'][tmp_name],'upload /'.$_FILE['myfile'][name]);
}
?>>
gt;