【文件上傳】---黑名單,白名單---day21
一、文件上傳常見驗證
1、后綴名,類型,文件頭等
2、后綴名:黑名單,白名單
在黑名單限制不完整的情況下,可以用php5,phtml等繞過,執行php代碼。前提是網站能解析。
3、文件類型:MIME信息
4、文件頭:內容頭信息
二、相關知識
1、PHP $_FILES()
PHP $_FILES函數詳解
在PHP中上傳一個文件建一個表單要比ASP中靈活得多。具體的看代碼。
如:
代碼如下:
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
<input name="myFile" type="file">
<input type="submit" value="上傳文件">
</form>
然后upload.php中可以直接用
$_FILES
$_POST
$_GET
等函數獲取表單內容。
今天我們着重講$_FILES函數。
當客戶端提交后,我們獲得了一個$_FILES 數組
$_FILES數組內容如下:
$_FILES['myFile']['name'] 客戶端文件的原名稱。
$_FILES['myFile']['type'] 文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上傳文件的大小,單位為字節。
$_FILES['myFile']['tmp_name'] 文件被上傳后在服務端儲存的臨時文件名,一般是系統默認。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函數設置是不起作用的。
$_FILES['myFile']['error'] 和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的說明:(它們在PHP3.0以后成了常量)
UPLOAD_ERR_OK
值:0; 沒有錯誤發生,文件上傳成功。
UPLOAD_ERR_INI_SIZE
值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上傳。
UPLOAD_ERR_NO_FILE
值:4; 沒有文件被上傳。
值:5; 上傳文件大小為0.
文件被上傳結束后,默認地被存儲在了臨時目錄中,這時您必須將它從臨時目錄中刪除或移動到其它地方,如果沒有,則會被刪除。也就是不管是否上傳成功,腳本執行完后臨時目錄里的文件肯定會被刪除。所以在刪除之前要用PHP的 copy() 函數將它復制到其它位置,此時,才算完成了上傳文件過程。
<html>
<head><title>upload picture more once</title></head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:<br />
<input type="file" name="pictures[]" /><br />
<input type="file" name="pictures[]" /><br />
<input type="file" name="pictures[]" /><br />
<input type="submit" name="upload" value="Send" />
</p>
</form>
</body>
</html>
<?php
error_reporting(0);
if($_POST['upload']=='Send'){
$dest_folder = "picture/";
if(!file_exists($dest_folder)){
mkdir($dest_folder);
}
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
$uploadfile = $dest_folder.$name;
move_uploaded_file($tmp_name, $uploadfile);
}
}
}
?>
三、Upload-labs案例演示
1、Pass-02
① 源代碼
②試着上傳一個php后綴的文件,使用bp抓包。
查看MIME的值
與代碼里白名單的不一樣。所以上傳不成功。
③通過修改type的值來提交
上傳成功
2、Pass-03
①源代碼
②使用php5 php3 phtml等繞過
但是需要在apache的配置文件當中去修改一下注釋
3、Pass-04 .htaccess解析
①.htaccess學習
.htaccess是什么
.htaccess文件(或者"分布式配置文件")提供了針對目錄改變配置的方法, 即,在一個特定的文檔目錄中放置一個包含一個或多個指令的文件, 以作用於此目錄及其所有子目錄。作為用戶,所能使用的命令受到限制。管理員可以通過Apache的AllowOverride指令來設置。
概述來說,htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過htaccess文件,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。
啟用.htaccess,需要修改httpd.conf,啟用AllowOverride,並可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令來改變。例如,需要使用.config ,則可以在服務器配置文件中按以下方法配置:AccessFileName .config 。
籠統地說,.htaccess可以幫我們實現包括:文件夾密碼保護、用戶自動重定向、自定義錯誤頁面、改變你的文件擴展名、封禁特定IP地址的用戶、只允許特定IP地址的用戶、禁止目錄列表,以及使用其他文件作為index文件等一些功能。
工作原理
.htaccess文件(或者"分布式配置文件")提供了針對每個目錄改變配置的方法,即在一個特定的目錄中放置一個包含指令的文件,其中的指令作用於此目錄及其所有子目錄。
說明:
如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令來改變。例如,需要使用.config ,則可以在服務器配置文件中按以下方法配置:
AccessFileName .config
通常,.htaccess文件使用的配置語法和主配置文件一樣。AllowOverride指令按類別決定了.htaccess文件中哪些指令才是有效的。如果一個指令允許在.htaccess中使用,那么在本手冊的說明中,此指令會有一個覆蓋項段,其中說明了為使此指令生效而必須在AllowOverride指令中設置的值。
.htaccess解析漏洞
代碼:
<FilesMatch "shana">
Sethandler application/x-httpd-php
</Filesmatch >
意思就是說,如果碰到了cimer的文件名,就以下面的格式去解析執行。
②上傳.htaccess文件到upload中
因為黑名單中沒有.htaccess的限制。
然后這個文件夾下的所有文件都將以這個配置文件的規則來執行。
③上傳個名字為shana.jpg的圖片,里面有php代碼。
然后就可以成功執行了,訪問路徑。
4、Pass-06
在06中過濾了.htaccess
①源代碼
通過大小寫來繞過。
5、缺少首尾去空
如果缺少首尾去空的話,加上空格就能過濾。
並且在windows中,會自動把空格去除,所以在上傳到對方服務器后,操作系統自動把我們上傳的文件轉化成PHP了。
6、Pass-08
①源代碼
少了刪除文件末位的點的代碼。
繞過 的話直接在數據包里后綴加個點,並且在上傳到服務器后,操作系統會自動去除點。
7、Pass-09
①源代碼
少了
②::$DATA學習
在window的時候如果文件名+"::$DATA"會把::$DATA之后的數據當成文件流處理,不會檢測后綴名,且保持::$DATA之前的文件名,他的目的就是不檢查后綴名
例如:"phpinfo.php::$DATA"Windows會自動去掉末尾的::$DATA變成"phpinfo.php"
8、單次過濾和循環過濾
例如代碼將字符串里的php替換為空
①單次過濾
將a.php------------>a.
繞過:a.pphphp----------->匹配第一個php---------------->過濾后衛a.php
test11.php. . ---------->去除空格test111.php..------------->去除末位的點---------------->test11.php.---------->操作系統默認test11.php
②循環過濾
比一次過濾安全,最終過濾完成之后還是a. 。
9、Pass-12 白名單 GET
①源代碼
②繞過方式%00(地址)截斷,0x00(文件命名)截斷
#00 后面的文件名是隨機的
../upload/1.php%0011121221312.jpg
#%00的作用就相當於是截斷,所以最終保存的就是1.php
10、Pass-13 白名單 POST
①源代碼
②繞過方式
但是這樣還是不行,我們要把%00進行url編碼。
或者直接改hex十六進制的值為00
GET請求中,編碼會自動轉,會自動解碼,能識別%20為空格。而POST當中不會自動解碼。