Upload_labs by L0st
8474 ワード
ミドルウェアの脆弱性
IIS
Apache
Nginx
Tomcat
Upload-Labs練習
pass-01
phpファイルを転送して、ポイントアップロードして、弾窓はこのファイルがアップロードできないと言って、処理の速度によってフロントエンドがファイルが合法かどうかを判断するべきだと推定して、だからソースコードを見て、やはりjavascriptがあります:
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;
}
}
ページ要素からonsubmitイベントを直接削除すると、アップロードできます.ファイル名を1に変更することもできます.jpg、burp suiteパッケージでファイル名を1に変更します.php、フロントエンドチェックを迂回します.
pass-02
アップロード1.jpgでburpsuiteで接尾辞を変更すればいいです.
$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.' , !';
}
}
サービス側はMIMEをチェックすることでファイルタイプを決定することがわかります
pass-03
アップロードします.phpファイル、ヒントasp、aspx、php、jsp接尾辞ファイルのアップロードは許可されていません.では、接尾辞から始めましょう.
Apacheサーバには、右から左へファイル接尾辞を解析する特性があり、右端の拡張子が認識できない場合は、認識可能な接尾辞に出会うまで左へ判断し続けるので、ここでは1をアップロードする.php.xxxxは迂回できます
$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 . ' , !';
}
}
ブラックリストの判断に基づいている以上、Apacheがphp、phtml接尾辞のファイルを解析できることを知る必要があるので、アップロードします.phtml直接迂回
pass-04
SetHandler application/x-httpd-php
または
SetHandler application/x-httpd-php
そして任意の接尾辞のファイルを勝手にアップロードするとapacheはphp解析として扱われる.ソース:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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); //
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 = ' !';
}
} else {
$msg = $UPLOAD_ADDR . ' , !';
}
}
pass-05
pass-06
pass-07
pass-08
ソースコードを見ると、ここにはファイル名がありません.DATAは迂回できます.
pass-09
ソースコードのフィルタルールを表示し、ファイル名を'1に設定します.php. .' ルールチェックを省略できます
pass-10
プログラム使用str_Ireplace関数はファイル名の敏感な字を置き換えたが、この関数は1回しか一致しないので、接尾辞名を2回書いて迂回した:1.pphphp
pass-11
ソースコードを表示するとホワイトリストでフィルタリングされますがurlでgetでsave_がコミットされます.pathパラメータをファイル名に接続するため、/?を変更します.sava_path=../upload/1.php%00使用%00は$GET('save_path')の後ろのファイル名が切り捨てられています.次に1をアップロードします.jpg迂回
$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 !";
}
}
pass-12
pass-11と変わらずsave_をコミットするだけですpathパラメータの方法はPOSTに変更し、burpsuiteでパッケージをキャプチャして修正すればよい.
pass-13
ソースコードを見ると、ファイルの最初の2バイトを読み取ることでファイルのタイプが判断されるので、画像馬を作成する必要があります:
copy normal.jpg/b+shell.php/a webshell.jpg
パラメータ/bは、ファイルをバイナリ形式でコピー、マージすることを指定します.画像クラス/音声クラスファイルパラメータ/aは、ASCII形式でファイルをコピー、マージすることを指定します.txtなどのドキュメントクラスファイルに使用pass-14
プログラムはgetimagesize()関数を用いて画像情報を取得するので,画像馬を作成してチェックを迂回する
pass-15
プログラムはexif_を使用します.imagetype()関数はファイルタイプを取得するので、画像を作成して馬を迂回してチェックします.
pass-16
ソースコードを見てバックエンドプログラムが画像に対してimagecreatefromgif()操作を行ったことを見て、つまりファイルが合法gifファイルであるかどうかを判断して、ここで私達は画像馬をアップロードして、burpsuiteでパッケージをつかんで、Content-Typeの下で2行、つまりファイルの内容の冒頭でGIF 89 aを追加して、検証を迂回することができます
imagecreatefromgif()関数を迂回する方法https://secgeek.net/bookfresh-vulnerability/
pass-17
競合条件
pass-18
競合条件
pass-19
ファイル名で0 x 00トランケートを使用して迂回