PHP漏洞全解 九 檔案上傳漏洞

2021-06-22 17:02:33 字數 2374 閱讀 4041

一套web應用程式,一般都會提供檔案上傳的功能,方便來訪者上傳一些檔案。

下面是乙個簡單的檔案上傳表單

<

form

action

="upload.php"

method

="post"

enctype

="multipart/form-data"

name

="form1"

>

<

input

type

="file"

name

="file1"

/>

<

br/>

<

input

type

="submit"

value

="上傳檔案"

/>

<

input

type

="hidden"

name

="max_file_size"

value

="1024"

/>

form

>

php的配置檔案php.ini,其中選項upload_max_filesize指定允許上傳的檔案大小,預設是2m

$_files陣列變數

php使用變數$_files來上傳檔案,$_files是乙個陣列。如果上傳test.txt,那麼$_files陣列的內容為:

$files

array  } 

如果上傳檔案按鈕的name屬性值為file

<

input

type

="file"

name

="file"

/>

那麼使用$_files['file']['name']來獲得客戶端上傳檔名稱,不包含路徑。使用$_files['file']['tmp_name']來獲得服務端儲存上傳檔案的臨時檔案路徑

存放上傳檔案的資料夾

php不會直接將上傳檔案放到**根目錄中,而是儲存為乙個臨時檔案,名稱就是$_files['file']['tmp_name']的值,開發者必須把這個臨時檔案複製到存放的**資料夾中。

$_files['file']['tmp_name']的值是由php設定的,與檔案原始名稱不一樣,開發者必須使用$_files['file']['name']來取得上傳檔案的原始名稱。

上傳檔案時的錯誤資訊

$_files['file']['error']變數用來儲存上傳檔案時的錯誤資訊,它的值如下:

錯誤資訊

數值說 明

upload_err_ok

0沒有錯誤

upload_err_ini_size

1上傳檔案的大小超過php.ini的設定

upload_err_from_size

2上傳檔案的大小超過html表單中max_file_size的值

upload_err_partial

3只上傳部分的檔案

upload_err_no_file

4沒有檔案上傳

檔案上傳漏洞

如果提供給**訪問者上傳的功能,那必須小心訪問者上傳的實際可能不是,而是可以指定的php程式。如果存放的目錄是乙個開放的資料夾,則入侵者就可以遠端執行上傳的php檔案來進行攻擊。

下面是乙個簡單的檔案上傳例子:

php

// 設定上傳檔案的目錄 

$uploaddir

= "d:/www/images/"

; // 檢查file是否存在 

if (isset($_files['file1'])) 

?>

…… <

form

method

="post"

enctype

="multipart/form-data"

name

="form1"

>

<

input

type

="file"

name

="file1"

/>

<

br/>

<

input

type

="submit"

value

="上傳檔案"

/>

<

input

type

="hidden"

name

="max_file_size"

value

="1024"

/>

form

>

這個例子沒有檢驗檔案字尾,可以上傳任意檔案,很明顯的上傳漏洞

PHP漏洞全解 九 檔案上傳漏洞

本文主要介紹針對php 檔案上傳漏洞。由於檔案上傳功能實現 沒有嚴格限制使用者上傳的檔案字尾以及檔案型別,導致允許攻擊者向某個可通過 web 訪問的目錄上傳任意php檔案,並能夠將這些檔案傳遞給 php直譯器,就可以在遠端伺服器上執行任意php指令碼,即檔案上傳漏洞。一套web應用程式,一般都會提供...

PHP漏洞全解 九 檔案上傳漏洞

本文主要介紹針對php 檔案上傳漏洞。由於檔案上傳功能實現 沒有嚴格限制使用者上傳的檔案字尾以及檔案型別,導致允許攻擊者向某個可通過 web 訪問的目錄上傳任意php檔案,並能夠將這些檔案傳遞給 php直譯器,就可以在遠端伺服器上執行任意php指令碼,即檔案上傳漏洞。一套web應用程式,一般都會提供...

PHP漏洞全解

server php self 變數的值為當前頁面名稱 例 get.php中上述的表單 那麼我們提交 mysql close conn 使用post,不要使用get 傳遞表單字段時,一定要是用post,不要使用get,處理變數也不要直接使用 request http響應拆分 http請求的格式 1 ...