【文件上傳】---黑名單,白名單---day21


【文件上傳】---黑名單,白名單---day21

一、文件上傳常見驗證

1、后綴名,類型,文件頭等

2、后綴名:黑名單,白名單

image-20210412132946329

在黑名單限制不完整的情況下,可以用php5,phtml等繞過,執行php代碼。前提是網站能解析。

3、文件類型:MIME信息

image-20210412133248924

4、文件頭:內容頭信息

二、相關知識

1、PHP $_FILES()

image-20210412133905166

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

① 源代碼

image-20210412135040698

②試着上傳一個php后綴的文件,使用bp抓包。

查看MIME的值

image-20210412135639147

與代碼里白名單的不一樣。所以上傳不成功。

③通過修改type的值來提交

image-20210412135754357

上傳成功

2、Pass-03

①源代碼

image-20210412140453365

②使用php5 php3 phtml等繞過

image-20210412141117345

但是需要在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解析漏洞

image-20210412141928490

代碼:

<FilesMatch "shana">
Sethandler application/x-httpd-php
</Filesmatch >

意思就是說,如果碰到了cimer的文件名,就以下面的格式去解析執行。

②上傳.htaccess文件到upload中

因為黑名單中沒有.htaccess的限制。

image-20210412142604437

然后這個文件夾下的所有文件都將以這個配置文件的規則來執行。

③上傳個名字為shana.jpg的圖片,里面有php代碼。

然后就可以成功執行了,訪問路徑。

4、Pass-06

在06中過濾了.htaccess

①源代碼

image-20210412144554045

通過大小寫來繞過。

5、缺少首尾去空

如果缺少首尾去空的話,加上空格就能過濾。

並且在windows中,會自動把空格去除,所以在上傳到對方服務器后,操作系統自動把我們上傳的文件轉化成PHP了。

6、Pass-08

①源代碼

image-20210412145219005

少了刪除文件末位的點的代碼。

繞過 的話直接在數據包里后綴加個點,並且在上傳到服務器后,操作系統會自動去除點。

7、Pass-09

①源代碼

image-20210412145514096

少了image-20210412145529855

②::$DATA學習

在window的時候如果文件名+"::$DATA"會把::$DATA之后的數據當成文件流處理,不會檢測后綴名,且保持::$DATA之前的文件名,他的目的就是不檢查后綴名

例如:"phpinfo.php::$DATA"Windows會自動去掉末尾的::$DATA變成"phpinfo.php"

image-20210412145843271

8、單次過濾和循環過濾

例如代碼將字符串里的php替換為空

①單次過濾

將a.php------------>a.

繞過:a.pphphp----------->匹配第一個php---------------->過濾后衛a.php

​ test11.php. . ---------->去除空格test111.php..------------->去除末位的點---------------->test11.php.---------->操作系統默認test11.php

②循環過濾

比一次過濾安全,最終過濾完成之后還是a. 。

9、Pass-12 白名單 GET

①源代碼

image-20210412160914522

②繞過方式%00(地址)截斷,0x00(文件命名)截斷

image-20210412161634452

image-20210412161740558

#00 后面的文件名是隨機的
../upload/1.php%0011121221312.jpg
#%00的作用就相當於是截斷,所以最終保存的就是1.php

image-20210412162024282

10、Pass-13 白名單 POST

①源代碼

image-20210412162512478

②繞過方式

image-20210412162439426

但是這樣還是不行,我們要把%00進行url編碼。

image-20210412162610627

或者直接改hex十六進制的值為00

GET請求中,編碼會自動轉,會自動解碼,能識別%20為空格。而POST當中不會自動解碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM