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