upload-labs是一個練習文件上傳的靶場
我們需要先安裝中間件和PHP,推薦使用小皮面板,如何安裝使用見sqli-labs搭建前部分
upload-labs下載:https://gitcode.net/mirrors/c0ny1/upload-labs/-/archive/master/upload-labs-master.zip
解壓拷貝到WWW目錄即可使用
Pass-1 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) {
// indexOf函數會查找 上傳文件后綴 + | 是否存在 allow_ext 變量中,如果不存在,indexOf 返回 -1 文件上傳失敗
var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name;
alert(errMsg);
return false;
}
}
1.創建一個info.php內容為phpinfo();
上傳info.php
必須使用后綴名為.jpg|.png|.gif圖片才可以上傳,猜測是javascript禁用,我們使用瀏覽器自帶的javascript禁用功能
F12打開控制台,右上角的三個小點,設置,往下拉就可以看到禁用javascript
禁用后直接上傳文件,上傳成功
這里由於我們不是真正的圖片,所以顯示不出來,上傳成功后,文件上傳到了upload根目錄下:http://192.168.84.232/upload-labs-master/upload/info.php
2.可以使用burpusite抓包更改后綴名
我們先更改文件名為圖片jpg/png后綴
上傳圖片使用burpusite抓包,將jpg/png后綴改為php,修改后 Forward 轉發即上傳成功
這里已經上傳成功,因為我們上傳的本來就不是圖片,可以訪問文件測試
3.將頁面保存,刪除javascript內容,將action提交地址改為目標地址
首先我們 Ctrl + s保存名為Pass3.html文件,這里我們保存到root目錄
修改Pass3.html將javascript內容刪除,命令vim Pass3.html
找到上傳區,在form標簽中加入action提交地址
修改前:
修改后:
那么提交地址如何獲取到呢?我們真正上傳一個圖片,在上傳的同時瀏覽器控制台,網絡(Network),上傳得到提交地址
修改后,使用瀏覽器打開Pass3.htm,命令firefox Pass3.html
會看到使用的是file協議打開,直接上傳我們的info.php,即可上傳成功
上傳成功,訪問測試http://192.168.84.232/upload-labs-master/upload/info.php
Pass-2 MIME繞過
這一關是文件類型驗證,驗證MIME信息
源代碼如下:
$is_upload = false;
// 定義 is_upload函數 為 false
$msg = null;
// 定義 msg函數 為 null
if (isset($_POST['submit'])) {
// 查詢 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')) {
// 獲取 上傳文件名 和 上傳文件類型 ,並判斷 文件類型 是否為 'image/jpeg' 或者 'image/png' 或者 'image/gif'
$temp_file = $_FILES['upload_file']['tmp_name'];
// 獲取文件臨時上傳位置
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
// 定義文件上傳位置為 ../upload/上傳文件名
if (move_uploaded_file($temp_file, $img_path)) {
// 將臨時文件移動到,當前目錄的上一級目錄中upload目錄中去,文件名為上傳文件名
$is_upload = true;
// 移動文件成功, is_upload = true 文件上傳成功
} else {
$msg = '上傳出錯!';
}
} else {
$msg = '文件類型不正確,請重新上傳!';
}
} else {
$msg = UPLOAD_PATH.'文件夾不存在,請手工創建!';
}
}
使用$_FILES
全局變量type屬性
通過獲取請求頭 Content-type
判斷文件類型是否為 image/jpeg
、image/png
或者image/gif
那么使用burpsuite
抓包上傳php
文件將,Content-type
改為圖片image/jpeg
即可文件上傳成功。
更改后,點擊Forward
提交
文件上傳成功,訪問測試
成功執行phpinfo(),漏洞利用成功
Pass-3 黑名單不完全
查看源代碼,這一關為黑名單驗證
$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']);
// 獲取上傳文件名,trim刪除執行的字符串,在沒有指定值得情況下是刪除左右兩邊的空格
$file_name = deldot($file_name);
// 這里deldot為作者自定義的函數,刪除文件名末尾的點
$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)) {
// 檢測后綴名是否在 deny_ext 數組中,默認存在為 Ture 這里使用 ! 進行了取反,所以找到為 False
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
// 將臨時文件移動到 ../upload/當前時間 + 上傳后綴名
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上傳出錯!';
}
} else {
$msg = '不允許上傳.asp,.aspx,.php,.jsp后綴文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';
}
}
驗證文件后綴名如果為.asp
、.aspx
、.php
、.jsp
則無法上傳,這里黑名單並不完整,可以使用.php5 .phtml .phps .php5 .pht
進行繞過上傳
這里我們上傳一個.php5
后綴的文件
上傳成功,訪問驗證,訪問文件時,名稱為服務器上傳文件的時間,訪問
這里如果配置不當會照成下載文件
或者訪問空白頁
,在apache配置文件httpd.conf加入AddType application/x-httpd-php .php5
即可
這里我在位置文件中添加了AddType application/x-httpd-php .php5
了還是無法正常解析php5
為php
文件,訪問會下載文件
可能是phpstudy
的問題,我將upload-labs
靶場在復制到了Centos-7
中使用apache
進行測試,執行成功
Pass-4 .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",".ini");
$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)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上傳出錯!';
}
} else {
$msg = '此文件不允許上傳!';
}
} else {
$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';
}
}
這次還是黑名單
,增加了好多后綴名,但是還有漏網之魚,例如上次的php5
也禁止了
通過觀察,並沒有禁止.htaccess
,.htaccess
是apache的配置文件,apache在運行的時候會讀取每個目錄的的.htaccess
文件對其所在目錄進行配置
可以寫上配置文件,讓.png .jpg .jpeg
當做為php
文件執行
首先我們上傳.htaccess
文件,內容為
AddType application/x-httpd-php .png
注意,文件名必須是.htaccess
上傳png
文件,圖片內容為<?php phpinfo();?>
,執行phpinfo
上傳p.png
訪問p.png
查看
成功執行