文件上传 upload-labs 1~20做题记录
pass-01:
解題思路:(繞開前端js檢測)
(1):F12 ,直接修改js 允許文件的上傳類型 ,
(2):將webshell 文件后綴名改為允許上傳的,然后用 burp suite 攔截后修改 文件后綴名 ,
(3):利用 瀏覽器插件 Noscrip? 屏蔽js腳本?
pass-02:
操作過程: 1,禁用了js 腳本依舊不能上傳,猜測可能是 content-type 檢測
解題思路:(Content-type 檢測)
(1):將webshell 文件的后綴名改為圖片類型 ,再利用 bs 抓包 修改文件后綴
(2):直接上傳 webshell 文件 ,利用 bs 修改 Content-type :為 image/gif? ?繞過
pass-03:
操作過程:修改了webshall 的后綴名,再利用bs 修改成原來的后綴名沒有上傳成功,猜測服務器端也有文件后綴名檢測
? ? ? ? ? ? ? ? ?查看源代碼發(fā)現(xiàn)有 文件后綴名的黑名單,以及大小寫的過濾
解題思路:(服務端 拓展名檢測? 之? 黑名單后綴名不全)
(1) ,? 用PHP 的別名進行黑名單繞過,如 php2, php3, php4, php5, phps, pht, phtm, phtml.
(2),?重寫文件解析規(guī)則繞過。上傳先上傳一個名為.htaccess文件,內(nèi)容如下:
<FilesMatch "1.jpg"> SetHandler application/x-httpd-php </FilesMatch>然后再上傳一個 1.jpg 此時1.jpg 就會被當作 PHP來執(zhí)行
pass-04:
操作過程:查看源代碼 發(fā)現(xiàn)黑名單幾乎過濾了全部的違法后綴名 ,但少過濾了 .htaccess 后綴
解題思路:(拓展名檢測 之 繞過黑名單 之 后綴名缺少繞過)
(1),上傳一個.htaccess 文件 重寫 服務器的文件解析??
創(chuàng)建一個.htaccess文件
內(nèi)容可以是 :?AddType application/x-httpd-php .jpg,可將jpg文件解析為php文件.
或者是 :?SetHandler application/x-httpd-php,可將其他所有文件解析為php文件.
(2),利用PHP 和 Windows環(huán)境的疊加特性,以下符號在正則匹配時的相等性:
雙引號" = 點號. 大于符號> = 問號? 小于符號< = 星號*先把4.php文件后綴改為4.jpg? 然后用bs 將文件名改為?4.php:.jpg,上傳成功后會生成4.php的空文件,大小為0KB.
然后再在bs 中把文件名 改為4.<或4.<<<或4.>>>或4.>><后再次上傳,重寫4.php文件內(nèi)容,Webshell代碼就會寫入原來的4.php空文件中。
?
pass-05:
操作過程: 查看源代碼發(fā)現(xiàn) 黑名單里加上了 .htaccess 后綴 ,但是沒有 進行大小寫 過濾
解題思路:(拓展名檢測? 之? 黑名單繞過 之? 大小寫繞過)
(1),可以利用 沒有進行大小寫 進行繞過 ,將1.php 改為 1.phP 上傳
? ? ? ? ? ? ??(在Linux沒有特殊配置的情況下,這種情況只有win可以,因為win會忽略大小寫)
(2)也可以用? pass-04 的(2)利用PHP 和 Windows環(huán)境的疊加特性,進行繞過
?
pass-06:
操作過程:查看原第阿瑪發(fā)現(xiàn) 在 pass-05 的基礎上 加上了 大小寫 過濾, 但發(fā)現(xiàn) 去掉了 收尾去空
查了一下:trim()函數(shù) :?移除字符串兩側(cè)的空白字符或其他預定義字符.
Win下xx.jpg[空格] 或xx.jpg.這兩類文件都是不允許存在的,若這樣命名,windows會默認除去空格或點
解題思路:( 拓展名檢測? 之? 黑名單? ?之? ?收尾去空)
(1) 用bs 在1.php 后綴名后面加一個空格? 成功繞過
?
pass-07:
操作過程:查看源代碼后 發(fā)現(xiàn)沒有 刪除文件名末尾的點? 的過濾
解題思路:(拓展名檢測? 之 黑名單? 收尾去點)
(1),利用windows特性,會自動去掉后綴名中最后的”.”? 用bs 在文件名后加 “ .” 成功繞過
?
pass-08:
操作過程:查看源代碼后 發(fā)現(xiàn)? 黑名單過濾? 沒有 去字符串 ::$DATA?
解題思路:(拓展名檢測之? 黑名單 之 去字符串 ::$DATA)
(1),NTFS文件系統(tǒng)包括對備用數(shù)據(jù)流的支持。這不是眾所周知的功能,主要包括提供與Macintosh文件系統(tǒng)中的文件的兼容性。備用數(shù)據(jù)流允許文件包含多個數(shù)據(jù)流。每個文件至少有一個數(shù)據(jù)流。在Windows中,此默認數(shù)據(jù)流稱為:$ DATA。
上傳.php::$DATA繞過。(僅限windows)? 上傳后 自動保存為 1.php
?
pass-09:
操作過程:查看源代碼 發(fā)現(xiàn) 他把之前的漏洞都 補上了? ?但他 代碼本身就有問題? : 之過濾了? ?一個點? 和 一個 空格?
? ? ? ? ? ? ? ? ?還有PATH :
解題思路:(拓展名檢測? ?之? ?黑名單? ?之? 末尾 點和空格 過濾)
(1) 可以用 bs? 將1.php 改為? 1.php.? .? ?(點+空格+點)? 成功繞過
(2)這里發(fā)現(xiàn)$_FILES['upload_file']['name']獲取的是文件名中/后面的字符串,本來還想用move_uploaded_file會忽略/.的trick繞過
?
pass-10:
操作過程:查看源代碼 發(fā)現(xiàn)? 依舊是黑名單過濾? ? ?關鍵過濾就這兩句:
$file_name = trim($_FILES['upload_file']['name']);$file_name = str_ireplace($deny_ext,"", $file_name); #當file_name中出現(xiàn)deny_ext中存在的字符串,就把它去掉,但只處理了一次.解題思路:(拓展名檢測? ? 之? ?黑名單? ?之? ?后綴名雙寫)
(1),可以用雙寫后綴名 進行繞過? 將1.php 改為? 1.pphphp? 成功繞過
?
pass-11:
操作過程:查看源代碼,發(fā)現(xiàn)是白名單過濾
$ext_arr = array('jpg','png','gif');但是img_path直接使用點號拼接路徑,這里就存在風險.
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;我們可以使用%00截斷來實現(xiàn)繞過.
但這東西有點過氣了,因為需要兩個條件
如果要完成這一個題目就必須要實現(xiàn)上面的兩個條件,但是現(xiàn)在都PHP7了,這東西也就很少見了,滿足上面的條件的時候php就是把它當成結(jié)束符,后面的數(shù)據(jù)直接忽略
解題思路:(前臺檢測? 之? 白名單? ?之? ?img_path 直接用點號拼接)
(1) 用bs? 將save_path 和文件名 filename 改為:
save_path=../upload/1.php%00 filename="1.jpg"網(wǎng)頁顯示地址?<img src="../upload/1.php /4620180731010238.jpg" width="250px" />
訪問地址 :?http://localhost/upload-labs/Pass-01/../upload/1.php
這里可本地測試發(fā)現(xiàn)通過%00截斷,使得無法復制/4620180731010238.jpg" width="250px" />,即表明截斷成功.
?
此方法沒有繞過
?
pass-12:
操作過程:產(chǎn)看源代碼 發(fā)現(xiàn) 此題在上題 將GET? 換為 POST? ,還是利用pass-11 的方法 ,但在url解碼中%00不會被解析.
但是這里我們可以使用0x00進行截斷.
解題思路:(前臺檢測? ?之? 白名單? 之? img_path 直接拼接? post傳參)
(1)?
?
pass-13:
操作過程:查看源代碼 發(fā)現(xiàn):
代碼通過讀取上傳文件的前兩字節(jié)判斷是否為圖片.(漏洞)
$bin = fread($file, 2); //只讀2字節(jié)fclose($file);$strInfo = @unpack("C2chars", $bin);所以我們可以將圖片和一句話木馬合并在一起上傳.
解題思路:(圖片馬? ? 之? ?通過前兩個字節(jié)判斷是否為圖片? )
(1)最最最簡單的圖片馬直接一條命令即可生成:生成一個名為 1.png 的圖片馬
cope 2.jpg/b + 1.php/a 1.png上傳即可,但無法直接利用!
查看upload文件夾? 發(fā)現(xiàn)? 上傳的1.png 的后綴名? 變成了原來的 .jpg
?
pass-14:
操作過程:查看源代碼 發(fā)現(xiàn):
關鍵代碼 :
$info = getimagesize($filename); $ext = image_type_to_extension($info[2]);getimagesize通過檢查圖像文件的大小并返回圖像的尺寸以及文件類型.
image_type_to_extension根據(jù)指定的圖像類型返回對應的后綴名.
解題思路:(圖片馬? 之? ?使用getimagesize()檢查是否為圖片文件)
(1)與pass-13 一樣直接上傳 圖片馬1.png 成功繞過
查看upload 文件夾 發(fā)現(xiàn)? 文件的后綴名 變?yōu)?#xff1a;? .jpeg? ?原圖片為.jpg 都會被改為 .jpeg?
?
pass-15:
操作過程:查看源代碼 發(fā)現(xiàn)更換了函數(shù):
$image_type = exif_imagetype($filename);解題思路:(圖片馬 之?使用exif_imagetype()檢查是否為圖片文件)
(1)解法同pass-13? ? 可能是環(huán)境有問題? 上傳后直接空白了
?
pass-16:
操作過程:查看源代碼,發(fā)現(xiàn)這一關對后綴名和文件類型啥的都進行了很嚴格的控制,而且在后面還對圖片進行了二次編譯
解題思路:(二次渲染)
(1)jpg和png很麻煩,gif只需要找到渲染前后沒有變化的位置,然后將php代碼寫進去,就可以了
jpg? 和png? 的處理方法? 參照https://xz.aliyun.com/t/2657? ?講的很細致
?
pass-17:
操作過程:查看提示,發(fā)現(xiàn)是 條件競爭:
條件競爭
條件競爭是指一個系統(tǒng)的運行結(jié)果依賴于不受控制的事件的先后順序。 當這些不受控制的事件并沒有按照開發(fā)者想要的方式運行時,就可能會出現(xiàn) bug。 尤其在當前我們的系統(tǒng)中大量對資源進行共享,如果處理不當?shù)脑?#xff0c;就會產(chǎn)生條件競爭漏洞。如果文件檢測是先保存后檢測,文件不合法再刪除的方式進行的,典型的“引狼入室”。
就可以利用條件競爭的方式在木馬文件在被刪除之前訪問它,使他成功的執(zhí)行
具體的操作過程就是,利用工具,一邊不斷地快速上傳木馬文件,一邊不斷的請求訪問上傳的木馬文件,使一些來不及被刪除的木馬文件被成功執(zhí)行
解題思路:(條件競爭)
$is_upload = false; $msg = null;if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允許上傳.jpg|.png|.gif類型文件!";unlink($upload_file);}}else{$msg = '上傳出錯!';} }可以看到文件先經(jīng)過保存,然后判斷后綴名是否在白名單中,如果不在則刪除,此時可以利用條件競爭在保存文件后刪除文件前來執(zhí)行php文件。
先利用burp suite抓一個文件上傳的包,右鍵? Send to Intruder 》添加爆破點 》添加payload,先暫時不開始爆破
我是在一句話后面加了個 爆破點,不影響一句話的執(zhí)行,至于payload我隨便找了個相對較長的字典10000.txt
然后再在瀏覽器上訪問 127.0.0.1/upload-labs/upload/1.php,利用 burpsuite抓包,右鍵 Send to Intruder 》添加爆破點 》添加payload字典, 字典還用 10000.txt
?
然后兩個爆破 同時點擊 Start Attack ,一個上傳,一個訪問,然后你就會發(fā)現(xiàn)有成功訪問的包
成功訪問到了還沒來得及刪除的非法文件
?
pass-18:
操作過程:根據(jù)apache的后綴名識別漏洞:從右往左依次識別后綴,遇到不能識別的后綴名便跳過?,因此可以文件名改為
1.php.7z,然后利用bs 快速發(fā)包,
本關對文件后綴名做了白名單判斷,然后會一步一步檢查文件大小、文件是否存在等等,將文件上傳后,對文件重新命名,同樣存在條件競爭的漏洞。可以不斷利用burp發(fā)送上傳圖片馬的數(shù)據(jù)包,因為move在rename之前,move操作進行了一次文件保存,然后rename進行了一次更改文件名,由于條件競爭,程序會出現(xiàn)來不及rename的問題,從而上傳成功
解題思路:(條件競爭)
(1)利用Apache 的漏洞,將webshell 腳本文件名改為1.php.7z (白名單中 有.7z 這個apache 不能識別的后綴,所以用.7z)
然后利用bs 去不斷快速發(fā)包,實現(xiàn)條件競爭,進而保留了腳本名,使apache 將其識別為1.php
(2)單純利用 條件競爭,利用bs 去不斷快速發(fā)包,實現(xiàn)條件競爭,進而保留了圖片馬的文件名,成功繞過
?
pass-19:
操作過程:發(fā)現(xiàn)move_uploaded_file()函數(shù)中的img_path是由post參數(shù)save_name控制的,因此可以在save_name利用00截斷繞過.? ?還有就是move_uploaded_file底層會調(diào)用tsrm_realpath函數(shù)導致,遞歸刪除文件名最后的/.導致繞過了后綴名檢測
解題思路:(0x00截斷)
(1), 利用00截斷進行繞過,將文件名改為:xx.php【二進制00】.x.jpg?
(2)遞歸刪除文件名最后的/.導致繞過了后綴名檢測,在bs中將文件名改為:1.php/.? ?成功繞過
(3),不知道怎么回事,用大小寫就成功繞過了,1.phP
?
pass-20:
操作過程:而最終的文件名后綴取的是$file[count($file) - 1],因此我們可以讓$file為數(shù)組。
$file[0]為smi1e.php/,也就是reset($file),然后再令$file[2]為白名單中的jpg。
此時end($file)等于jpg,$file[count($file) - 1]為空。
而?$file_name = reset($file) . '.' . $file[count($file) - 1];,也就是smi1e.php/.,最終move_uploaded_file會忽略掉/.,最終上傳smi1e.php。
解題思路:(數(shù)組 + /. 繞過)
(1)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的文件上传 upload-labs 1~20做题记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 18.x 环境下mysql
- 下一篇: PHP+Mysql 实现用户登录,注册