日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

打靶归来 - 详解upload-labs靶场(下)

發(fā)布時間:2024/1/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 打靶归来 - 详解upload-labs靶场(下) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、環(huán)境準備

① - 靶場的搭建

  • 下載地址:upload-labs
  • upload-labs靶場曾有過一次更新,更新新添加了一道Pass-05,有一些以前的教程的題號與這篇教程不符合,請各位自行分辨
  • 本篇作者所用到的PHP版本為5.4.45(之前更改設(shè)置忘記調(diào)回來了,后面用的都是5.2.17,但是5.4.15親測可用),只有在做部分題目時需要修改
  • Pass16需要打開php.ini中的php_exif模塊

注意:更改配置之后記得重啟服務(wù)器

② - 準備webshell

  • 測試用webshell
  • # shell.php → 測試所用的phpinfo <?php phpinfo(); ?>
  • 圖片馬的制作
  • 準備工作:準備好.jpg / .png / .gif 三種類型的圖片,圖片大小越小越好,推薦使用截圖工具的截圖;準備好webshell文件,將圖片與文件放到一個目錄下
  • 在cmd下執(zhí)行:copy 01.png/b + test.php/a shell.png
    [01.png 為圖片,大小不宜過大 | test.php為webshell | shell.png為生成的圖片馬文件]
  • ③ - 說明

  • Pass1 ~ Pass13 見打靶歸來 - 詳解upload-labs靶場(上)
  • 確認webshell上傳成功的演示在上篇做了說明,這里就不再贅述
  • Pass14 ~ Pass17的圖片馬我們將各挑選一種來做演示,不會三種后綴都上傳一遍
  • Pass14 ~ Pass17使用的文件包含漏洞的簡單介紹:只要被包含的文件符合php語法,無關(guān)該文件的后綴類型,都會當作php代碼執(zhí)行。這就導(dǎo)致了我們可以上傳任意類型的webshell,所以我們可以上傳圖片馬作為webshell,不用考慮后綴問題
  • Pass17需要用到的Hex編輯器下載 —— 網(wǎng)盤鏈接 【提取碼:8888】
  • 二、題解

    【Pass14 - 利用添加gif圖片的文件幻數(shù)繞過】

    題目:


    繞過方法:

  • 可以給webshell添加文件幻數(shù)(文件開頭2個字節(jié))繞過
  • 可以上傳圖片馬繞過。

  • 因為Pass15和Pass16我們是使用圖片馬繞過,這一題我們使用第一種方法嘗試,我們以較為簡單的gif圖為例(有興趣的朋友們可以去試試其它的文件格式),步驟:在原有webshell代碼前添加字符串GIF89a

    第一步:上傳webshell

    可以看到,webshell被自動識別為了gif文件

    第二步:利用文件包含漏洞訪問圖片馬

    【Pass15 - 利用png圖片馬繞過】

    題目:


    繞過方法:

    上傳圖片馬繞過

    第一步:上傳圖片馬

    第二步:使用利用文件包含漏洞訪問圖片馬

    Pass16 - 利用jpg圖片馬繞過】

    題目:
    別忘記打開php_exif模塊


    繞過方法:

    上傳圖片馬繞過

    第一步:上傳圖片馬

    第二步:使用利用文件包含漏洞訪問圖片馬

    【Pass17 - 二次渲染繞過】

    題目:

    # 使用二次渲染過濾 $is_upload = false; $msg = null; if (isset($_POST['submit'])){// 獲得上傳文件的基本信息,文件名,類型,大小,臨時文件路徑$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];$target_path=UPLOAD_PATH.'/'.basename($filename);// 獲得上傳文件的擴展名$fileext= substr(strrchr($filename,"."),1);//判斷文件后綴與類型,合法才進行上傳操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "該文件不是jpg格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上傳出錯!";}}else if(($fileext == "png") && ($filetype=="image/png")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefrompng($target_path);if($im == false){$msg = "該文件不是png格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".png";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagepng($im,$img_path);@unlink($target_path);$is_upload = true; }} else {$msg = "上傳出錯!";}}else if(($fileext == "gif") && ($filetype=="image/gif")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefromgif($target_path);if($im == false){$msg = "該文件不是gif格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".gif";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上傳出錯!";}}else{$msg = "只允許上傳后綴為.jpg|.png|.gif的圖片文件!";} }

    繞過方法:

    具體方法可以參考這篇文章
    這里作者使用文章中介紹的GIF繞過方法進行打靶,其它方法比較麻煩,想玩玩的朋友們可以自行嘗試

    第一步:上傳一個gif圖片馬,上傳之后,將網(wǎng)站回顯的圖片下載下來進行比較

    發(fā)現(xiàn)少了一堆的數(shù)據(jù),很不幸,寫入的webshell被刪了
    第二步:找一個數(shù)據(jù)沒有被更改的地方插入webshell代碼

    如果顯示不為gif圖片,則需要重新挑選一個位置插入webshell

    第三步:上傳圖片馬,并測試是否成功


    作者用到的Hex編輯器的下載鏈接在文章開頭有介紹

    【Pass18 - 條件競爭繞過文件刪除】

    題目:

    繞過方法:

    根據(jù)題目可知,此操作是先將文件移動至目錄,再判定是否符合上傳規(guī)范,若不符合則刪除文件。我們可以利用php代碼生成新的webshell文件,再利用條件競爭1在上傳的文件未被刪除之前訪問它,則可以添加webshell文件至服務(wù)器

    第一步:制作創(chuàng)建webshell的代碼

    # 若上傳一句話木馬,需要特別注意引號的問題:寫入數(shù)據(jù)的時候需要使用單引號包裹,因為使用雙引號會解析里面的$變量 <?phpfputs(fopen('shell.php','w'), '<?php phpinfo(); ?>'); ?>

    第二步:利用Burp的爆破模塊制造條件競爭訪問創(chuàng)建webshell的代碼

  • 抓取上傳文件的包,并通過爆破模塊進行持續(xù)無字典爆破2
  • 由源碼可知,上傳的文件不會被重命名。我們可以訪問該文件(可以任意上傳一個圖片,找到保存的位置),并抓包,然后爆破模塊進行持續(xù)無字典爆破
  • 訪問文件的爆破模塊出現(xiàn)長度不同的返回包即可停止爆破,查看包的內(nèi)容

    由返回包可知訪問成功

    第三步:訪問創(chuàng)建的webshell代碼

    【Pass19 - apache的后綴名識別漏洞 + 條件競爭繞過重命名】

    題目:

    繞過方法:

    繞過白名單過濾:利用apache的后綴名識別漏洞 —— 從右往左依次識別后綴,遇到不能識別的后綴名便跳過 ,因此可以文件名改為create.php.7z(.7z這個后綴apache不能識別)


    繞過重命名(因為重命名會把shell.php重命名為其它的字符串,導(dǎo)致后綴名識別漏洞不可用):利用條件競爭繞過

    只需要對添加了.7z后綴的文件進行條件競爭繞過即可,步驟與Pass18一致,這里就不做演示

    【Pass20 - ./繞過黑名單檢測】

    題目:

    繞過方法:

    就是一個很簡單的一個繞過黑名單檢測,不明白為什么會放到Pass20來。只需要修改POST傳參中的save_name參數(shù)即可,點繞過、大小寫繞過啥的都可以


    為了弄清楚這一題的考點,我去看了其它的靶場教程,發(fā)現(xiàn)是考move_uploaded_file()會忽略掉文件末尾的/.,也就是將save_name的參數(shù)改為shell.php/.,親測有效,應(yīng)該是黑名單檢測補充的一個新方法,這種方法沒有系統(tǒng)的限制

    【Pass21 - /.繞過白名單檢測】

    題目:

    $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{//檢查文件名# 如果save_name存在則使用save_name的數(shù)據(jù),否則使用upload_file的數(shù)據(jù)$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name']; # 通過.將文件名分為一個數(shù)組 if (!is_array($file)) {$file = explode('.', strtolower($file));}# 提取數(shù)組的最后一項作為后綴名進行后綴名判定$ext = end($file);# 白名單檢測后綴名$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上傳該后綴文件!";}else{# 將file的第一個元素與位于數(shù)組長度-1的元素拼接組成保存用的文件名$file_name = reset($file) . '.' . $file[count($file) - 1];$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 = "請選擇要上傳的文件!"; }

    繞過方法:

    由代碼審計可得,是通過讀取數(shù)組的最后一個元素來進行后綴名白名單檢測,通過位于數(shù)組長度-1的元素拼接文件名作為保存所用的文件數(shù)據(jù)。我們只需要讓數(shù)組的最后一個元素符合條件,讓數(shù)組長度-1的元素為空即可完成繞過

    第一步:修改webshell的文件類型為白名單內(nèi)的文件類型
    第二步:修改請求包,將save_name[1]空出來,不填入數(shù)據(jù)

    Note:這一題的save_name參數(shù)最好要加上在結(jié)尾加上/,利用/.繞過,而不要單純的使用.繞過,因為.繞過只適用于Windows系統(tǒng)
    第三步:訪問上傳的文件

    以下為注釋內(nèi)容


  • 條件競爭:多個線程或進程在讀寫一個共享數(shù)據(jù)時結(jié)果依賴于它們執(zhí)行的相對時間 ??

  • ??

  • 總結(jié)

    以上是生活随笔為你收集整理的打靶归来 - 详解upload-labs靶场(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。