打靶归来 - 详解upload-labs靶场(下)
一、環境準備
① - 靶場的搭建
- 下載地址:upload-labs
- upload-labs靶場曾有過一次更新,更新新添加了一道Pass-05,有一些以前的教程的題號與這篇教程不符合,請各位自行分辨
- 本篇作者所用到的PHP版本為5.4.45(之前更改設置忘記調回來了,后面用的都是5.2.17,但是5.4.15親測可用),只有在做部分題目時需要修改
- Pass16需要打開php.ini中的php_exif模塊
注意:更改配置之后記得重啟服務器
② - 準備webshell
[01.png 為圖片,大小不宜過大 | test.php為webshell | shell.png為生成的圖片馬文件]
③ - 說明
二、題解
【Pass14 - 利用添加gif圖片的文件幻數繞過】
題目:
繞過方法:
因為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圖片馬,上傳之后,將網站回顯的圖片下載下來進行比較
發現少了一堆的數據,很不幸,寫入的webshell被刪了
第二步:找一個數據沒有被更改的地方插入webshell代碼
如果顯示不為gif圖片,則需要重新挑選一個位置插入webshell
第三步:上傳圖片馬,并測試是否成功
作者用到的Hex編輯器的下載鏈接在文章開頭有介紹
【Pass18 - 條件競爭繞過文件刪除】
題目:
繞過方法:
根據題目可知,此操作是先將文件移動至目錄,再判定是否符合上傳規范,若不符合則刪除文件。我們可以利用php代碼生成新的webshell文件,再利用條件競爭1在上傳的文件未被刪除之前訪問它,則可以添加webshell文件至服務器
第一步:制作創建webshell的代碼
# 若上傳一句話木馬,需要特別注意引號的問題:寫入數據的時候需要使用單引號包裹,因為使用雙引號會解析里面的$變量 <?phpfputs(fopen('shell.php','w'), '<?php phpinfo(); ?>'); ?>第二步:利用Burp的爆破模塊制造條件競爭訪問創建webshell的代碼
訪問文件的爆破模塊出現長度不同的返回包即可停止爆破,查看包的內容
由返回包可知訪問成功
第三步:訪問創建的webshell代碼
【Pass19 - apache的后綴名識別漏洞 + 條件競爭繞過重命名】
題目:
繞過方法:
繞過白名單過濾:利用apache的后綴名識別漏洞 —— 從右往左依次識別后綴,遇到不能識別的后綴名便跳過 ,因此可以文件名改為create.php.7z(.7z這個后綴apache不能識別)
繞過重命名(因為重命名會把shell.php重命名為其它的字符串,導致后綴名識別漏洞不可用):利用條件競爭繞過
只需要對添加了.7z后綴的文件進行條件競爭繞過即可,步驟與Pass18一致,這里就不做演示
【Pass20 - ./繞過黑名單檢測】
題目:
繞過方法:
就是一個很簡單的一個繞過黑名單檢測,不明白為什么會放到Pass20來。只需要修改POST傳參中的save_name參數即可,點繞過、大小寫繞過啥的都可以
為了弄清楚這一題的考點,我去看了其它的靶場教程,發現是考move_uploaded_file()會忽略掉文件末尾的/.,也就是將save_name的參數改為shell.php/.,親測有效,應該是黑名單檢測補充的一個新方法,這種方法沒有系統的限制
【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的數據,否則使用upload_file的數據$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name']; # 通過.將文件名分為一個數組 if (!is_array($file)) {$file = explode('.', strtolower($file));}# 提取數組的最后一項作為后綴名進行后綴名判定$ext = end($file);# 白名單檢測后綴名$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上傳該后綴文件!";}else{# 將file的第一個元素與位于數組長度-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 = "請選擇要上傳的文件!"; }繞過方法:
由代碼審計可得,是通過讀取數組的最后一個元素來進行后綴名白名單檢測,通過位于數組長度-1的元素拼接文件名作為保存所用的文件數據。我們只需要讓數組的最后一個元素符合條件,讓數組長度-1的元素為空即可完成繞過
第一步:修改webshell的文件類型為白名單內的文件類型
第二步:修改請求包,將save_name[1]空出來,不填入數據
Note:這一題的save_name參數最好要加上在結尾加上/,利用/.繞過,而不要單純的使用.繞過,因為.繞過只適用于Windows系統
第三步:訪問上傳的文件
以下為注釋內容
條件競爭:多個線程或進程在讀寫一個共享數據時結果依賴于它們執行的相對時間 ??
??
總結
以上是生活随笔為你收集整理的打靶归来 - 详解upload-labs靶场(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IN Tech 2022|英特尔技术产品
- 下一篇: 【硬件细分知识-线材与连接器】2、不同A