[Upload-labs]ファイルアップロードの脆弱性の原理と操作の詳細な説明
ファイルアップロードの脆弱性とは何ですか?
ファイルアップロードの脆弱性とは、ユーザーのファイルアップロード部分の制御が不十分であったり、処理の欠陥が原因で、プログラマーが自分の権限を超えて実行可能な動的スクリプトファイルをサーバーにアップロードできることを指します。ここにアップロードされるファイルは、トロイの木馬、ウイルス、悪意のあるスクリプト、またはWebShellなどです。この攻撃方法は最も直接的で効果的であり、「ファイルのアップロード」自体に問題はありません。問題は、ファイルがアップロードされた後、サーバーがファイルを処理および解釈する方法です。サーバーの処理ロジックが十分に安全でない場合、深刻な結果につながります。
ウェブシェル?
WebShellは、asp、php、jsp、またはcgiであり、他のWebファイルはコマンド実行環境の一種の存在を形成します。これはWebページのバックドアとして説明できます。攻撃者は通常、Webサイトを攻撃した後、これらのaspまたはphpバックドアファイルをWebサイトサーバーのWebディレクトリ内の通常のWebページファイルと混合し、ブラウザを使用してこれらのバックドアにアクセスし、Webサイトを制御するコマンド実行環境を取得します。サーバーの(ファイルのアップロード、ダウンロードまたは変更、データベースの操作、任意のコマンドの実行など)。
ファイルアップロードの脆弱性の原因
- アップロードされたファイルのサフィックス(拡張子)に厳密な制限はありません
- アップロードされたファイルのMIMETYPE(コンテンツタイプ)はチェックされません
- パーミッションに関しては、ファイルアップロードのファイルディレクトリに実行不可能なパーミッションが設定されていません
- サーバーは、ファイルのアップロードやディレクトリの指定の動作を制限しません
Webでのファイルアップロードの原則は、フォームをmultipart / from-dataとして設定し、同時にファイルドメインを追加してから、HTTPプロトコルを介してファイルのコンテンツをサーバーに送信し、サーバーに送信することです。サイドはマルチパートデータ情報を読み取り、ファイルの内容を抽出して保存します。
通常、ファイルを保存するときに、サーバーはファイルの元のファイル名を読み取り、元のファイル名からファイル拡張子を取得してから、ファイルにファイル名をランダムに割り当てます(重複を防ぐため)。元のファイルの拡張子を追加して、サーバーに保存します。
害
- Webトロイの木馬ファイルのアップロード、Webサーバーファイルの制御、リモートコマンドの実行など。
- マイニングとボットネット用のシステムウイルスとトロイの木馬ファイルをアップロードします。
- 特権昇格のためのシステムオーバーフロープログラムをアップロードします。
- Webページを変更して、フィッシング、馬の吊り下げ、ダークリンクなどの操作を実装します。
- イントラネットの浸透。
- 昇格された権限の場合は、必要なことをすべて実行してください。
一般的な守備位置
- フロントエンドJS検証
- MIMEタイプの検証
- ブラックリスト/ホワイトリスト
- ファイルの内容を確認してください
- ローカルファイルに脆弱性が含まれないようにする
- 安全なWebサービスを使用する(apache(a.php.xxx)、nginx(/test.png/xxx.php)、IIS解析の脆弱性(1.php; jpg))
バイパス姿勢
- フロントエンドJSバイパス
- MIMEタイプバイパス
- サフィックス名ケースバイパス/ php4、php5
- 00切り捨て
- .htaccessを上書きする
- Windowsファイルストリーム機能のバイパス
- 二重書き込みファイル名バイパス
- 条件付き競争
[Pass-01] JS検出バイパス
BingScorpionマレーシアをアップロードしてみてください。
その結果、傍受を促すポップアップウィンドウが表示され、フロントエンドのjsが傍受される可能性があると推測されます。
Webページのソースコードを表示します。
ファイルをアップロードして送信をクリックすると、checkFile()関数が実行されます
これはcheckFile()関数です:
この関数はホワイトリストフィルタリングを使用し、.jpg、.png、および.gifのサフィックスが付いたファイルのアップロードのみを許可していることがわかります。
これはフロントエンドの制限であるため、コードを直接変更し、checkFile()関数を削除します。
図に示すように、アップロードは成功しました!
写真のように、氷のサソリが正常に接続されています!
[Pass-02]ファイルタイプバイパス
1.テストプロセス
マレーシア人をアップロードしてみてください:
パケットをキャプチャし、Content-Typeフィールドの値をimage / pngに変更します。
パッケージを入れて正常にアップロードしてください!
2.ソースコード分析
<?php
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
}
}
?>
上記のコードの分析は、バックエンドが最初$_FILES['file']['type']
にファイルタイプ(httpリクエスト本文のContent-Typeコンテンツ)を取得するために使用し、コンテンツ(image / gif、image / jpeg、image / png)をホワイトリストに登録することを示しています(それがそうであったのも不思議ではありません)現在画像に変更されています)/ jpgはアップロードできません)この時点で、パッケージを直接キャプチャし、Content-Typeフィールドの値を3つのうちのいずれかに変更してバイパスします。
move_uploaded_file(file,newloc)
:アップロードしたファイルを新しい場所newlocに移動します。
[Pass-03]ブラックリストバイパス
1.テストプロセス
パッケージをキャプチャするには、サフィックスをphp4に変更します | 正常にアップロードされました! |
---|---|
ブラウザを使用してアクセスすると、結果は未解決です。
apache構成ファイルを変更します
apacheによって解析されたサフィックスを追加します。
ブラウザを使用してファイルにアクセスします。
結果は空白のページになり、shell.php4が正常に解析されたことを示します。
でも氷サソリとは繋がらない
インターネットで情報を確認したところ、phpバージョンに問題があるとのことで、php5 +に接続できませんでしたが、php7は問題ありませんでした。最後に、php7のバージョンが変更され、接続が成功しました。
2.ソースコード分析
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']); //去除开头结尾空格和其他预定义字符
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.'); //查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
//黑名单过滤
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
総括する
一般的なスクリプトによって解析されるサフィックス:
ASP:asa / cer / cdx
ASPX:ashx / asmx / ascx
PHP:php4 / php5 / phtml
JSP:jspx / jspf