Pass-01#
フロントエンド js バイパス
Java を無効に設定
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("アップロードするファイルを選択してください!");
return false;
}
// アップロードを許可するファイルタイプを定義
var allow_ext = ".jpg|.png|.gif";
// アップロードファイルのタイプを抽出
var ext_name = file.substring(file.lastIndexOf("."));
// アップロードファイルタイプが許可されているか判断
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "このファイルはアップロードできません。次のファイルタイプをアップロードしてください:" + allow_ext + "、現在のファイルタイプは:" + ext_name;
alert(errMsg);
return false;
}
}
Pass-02#
MME 検証
アップロードファイルの拡張子は上記の通り
パケットキャプチャを行う
Content-Type タイプを変更
application/octet-stream を image/png に変更
これでアップロード可能
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = 'アップロードエラー!';
}
} else {
$msg = 'ファイルタイプが正しくありません。再度アップロードしてください!';
}
} else {
$msg = UPLOAD_PATH.'フォルダが存在しません。手動で作成してください!';
}
}
Pass-03#
ブラックリストバイパス
パケットキャプチャを行い、拡張子を変更した後、直接アップロード可能
しかし接続できない
拡張子のアルファベットを大文字にしてもアップロードできない、
php1、pht、phtml、phps を使用してブラックリストをバイパス
ウェブページのソースコードからパスを見つける
シェルに接続
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$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); //前後の空白を削除
Pass-04#
ブラックリストバイパス -.htaccess
.htaccess#
.htaccess は Apache サーバーの設定ファイルで、関連ディレクトリのウェブページ設定を担当
ウェブページの 301 リダイレクト、カスタム 404 エラーページ、ファイル拡張子の変更、特定のユーザーまたはディレクトリへのアクセスの許可 / 禁止、ディレクトリリストの禁止、デフォルトドキュメントの設定などの機能を実現できます。
.htaccess ファイルの内容:
SetHandler application/x-httpd-php
現在のディレクトリのすべてのファイルが PHP で解析されるように設定されるため、アップロードするファイルの内容が PHP 言語コードの規範に合致していれば、PHP として実行されます。合致しない場合はエラーが表示されます。
そのため、最初に.htaccess の設定ファイルをアップロードし
次に一文字の木馬をアップロード
シェルに接続
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
$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); //前後の空白を削除
Pass-05#
大文字バイパス
ランダムな大文字小文字の混合でバイパス可能
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//ファイル名の末尾の点を削除
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//文字列::$DATAを除去
$file_ext = trim($file_ext); //前後の空白を削除
$file_ext = strtolower($file_ext); //小文字に変換
Pass-06#
スペースバイパス
原理:Windows システムでは、ファイル名中のスペースは空として処理され、プログラム内の検出コードは自動的にスペースを削除できない。これによりブラックリストをバイパスします。
そのため、パケットキャプチャを行い、ファイル拡張子の後にスペースを追加
成功してバイパス
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = $_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); //前後の空白を削除
Pass-07#
ドットバイパス
拡張子の後にドットを追加して成功バイパス
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_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); //前後の空白を削除
$file_name = deldot($file_name);//ファイル名の末尾の点を削除
Pass-08#
::$DATA バイパス
原理:Windows ではファイル名 +"::$DATA" があると、::$DATA 以降のデータがファイルストリームとして処理され、拡張子が検出されず、::$DATA 以前のファイル名が保持されます。目的は拡張子をチェックしないことです。空白と同様に
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//ファイル名の末尾の点を削除
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //小文字に変換
$file_ext = trim($file_ext); //前後の空白を削除
$file_ext = str_ireplace('::$DATA', '', $file_ext);//文字列::$DATAを除去
Pass-09#
ソースコードを見て、パケットをキャプチャして拡張子を変更
php 拡張子の後に '. .' を追加
成功してアップロード
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$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); //前後の空白を削除
GPT 分析:
この PHP コードは主にファイルアップロードを行い、最初に POST リクエストで送信されたデータがあるかどうかを確認します(submit ボタンがクリックされたかどうか)。次に、アップロードディレクトリが存在するかどうかを確認し、アップロードを許可しないファイルタイプの配列deny_extを定義します。次に、ユーザーがアップロードしたファイル名を取得し、末尾の点を削除します。次に、strrchr関数を使用してファイルの拡張子を取得し、小文字に変換し、::DATA 文字列を除去します。次に、ユーザーがアップロードしたファイル名を取得し、末尾の点を削除し、strrchr関数を使用してファイルの拡張子を取得し、小文字に変換し、::DATA 文字列を除去し、前後の空白を削除してファイル拡張子の一貫性を確保します。最終的に、これらの情報に基づいてファイルのアップロードが許可されるかどうかを判断します。ファイルタイプが $deny_ext 配列に含まれている場合はアップロードを許可せず、そうでなければアップロード可能です。
Pass-10#
ヒントによれば、このパスではファイル名から削除されます
つまり、上記の拡張子のファイルをアップロードすると、自動的に削除されます
例えば hack.php -->hack 拡張子が消えます。
しかし、一度だけ削除されるため、ダブル書き込み文字を利用してバイパス可能
ダブル書き込み形式は pphphp であるべきです
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
ChatGPT:このコードの原理は、ファイルタイプのアップロードを制限してアプリケーションのセキュリティメカニズムを保護するために使用されます。このコードは、アップロードを許可しないファイルタイプのリストを含む "$deny_ext" という配列を定義します。ファイルをアップロードする前に、コードはアップロードされたファイルの名前を取得し、その名前から "$deny_ext" 配列にリストされているすべてのファイルタイプを削除し、変更されたファイル名を "$file_name" 変数に再代入します。
次に、コードは $ _FILES ['upload_file']['tmp_name'] 変数から一時ファイルのパスを取得し、それを "$ _SERVER ['DOCUMENT_ROOT'] . UPLOAD_PATH . '/' . $file_name" ディレクトリに移動します。この時、移動プロセスが成功した場合、アプリケーションは以下のコードでアップロードが完了したことを示します($is_upload = true;)、移動プロセスが失敗した場合、アプリケーションはエラーメッセージを出力します($msg = ' アップロードエラー!';)。
Pass-11 GET 00 トランケーション#
00 トランケーションとは何か
0x00 でも %00 でも、最終的に解析されると同じものになります: chr(0)
chr () は、引数に対応する文字を返すための関数です。つまり、引数は ASCII コードであり、返される値は文字で、型は string です。
chr (0) は NULL(空文字)に対応します。
文字列に空文字が存在する場合、解析されると空文字以降の文字が捨てられます
00 トランケーションを使用する状況:
- パス結合で直接使用される $file_name というファイル名
- ファイルパスが制御可能
ヒントによれば、アップロードパスが制御可能であるため、ファイルアップロードパスを見つけます
<?php
include '../config.php';
include '../head.php';
include '../menu.php';
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = 'アップロードエラー!';
}
} else{
$msg = "jpg|png|gifタイプのファイルのみアップロード可能です!";
}
}
?>
GPT 分析:
この PHP コードはシンプルなファイルアップロード機能を含んでいます:
- 最初に、include 文を使用して config.php、head.php、menu.php などの他のファイルを読み込みます。
- 次に、POST データが送信されているかどうかを確認し、送信されている場合は処理を続けます。そうでない場合は何も行いません。
- ここでは、アップロードを許可するファイルタイプの配列 $ext_arr を定義し、jpg、png、gif の 3 種類のファイルタイプを含めます。後で使用されます。
- プログラムは $_FILES 配列を使用してアップロードされたファイル名を取得し、その拡張子を $file_ext 変数に保存します。
- $file_ext が $ext_arr 配列に含まれている場合、アップロードされたファイルタイプが要件を満たしていることを示し、アップロード操作を実行できます。
- 一時ファイルは $temp_file 変数に保存され、rand () 関数を使用してランダムな数と現在の日付時間を新しいファイル名として生成し、元のファイル拡張子を加えて $file_path 変数に保存します。
- move_uploaded_file () 関数を使用してファイルアップロード操作を行い、アップロードが成功した場合は is_upload 変数を true に設定します。そうでない場合は msg 変数に「アップロードエラー!」と設定します。
- ファイルタイプが要件を満たさない場合、msg 変数には「jpg|png|gif タイプのファイルのみアップロード可能です!」と設定されます。
Pass-12 POST 00 トランケーション#
同様に 00 トランケーションですが、POST
burp でパケットキャプチャを行い
hex を変更
%00 の hex 値を 00000 に変更すればアップロード可能