upload-labs_pass12_文件名截断_URL要编码为%00_pass13_文件名截断_Hex修改为00
關(guān)于靶場說幾點:單純用phpstudy 可能無法復(fù)現(xiàn)所有的漏洞,而且phpstudy中的php可能是線程不安全的,所以建議大家在自己本機或者虛擬機的中親自搭建一下apache和php的環(huán)境,便于復(fù)現(xiàn)upload-labs的所有靶場環(huán)境。配置有問題的可以參考我寫的這篇文章:
https://blog.csdn.net/qq_51550750/article/details/124062273
pass12-環(huán)境說明:
這一關(guān)啊真是奇葩,試了一圈,只有php版本是下面這個才成功:5.5.9nts
如果你也沒有成功,也看看這個這個版本你行不行吧。
其實 upload-labs這個靶場要是實在做不出來也沒有關(guān)系,因為牽扯到環(huán)境問題,還牽扯到php的版本問題。沒做出來要放棄也很正常,不用灰心。
pass12-源碼提示
源碼:
$is_upload = false; $msg = null; if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上傳出錯!';}} else{$msg = "只允許上傳.jpg|.png|.gif類型文件!";} }提示:
源碼中,限制了文件名(白名單,‘jpg’,‘png’,‘gif’)
再注意一下上傳的路徑:
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;有一個參數(shù)是save_path
上傳抓包:
上傳shell.php
看到save_path在URL中的路徑,其實提示中說的“路徑可控”就是這個意思。
在這個請求頭中,可以看到一個比較特別的字段:
介紹一下Content-Disposition這個字段
首先學(xué)習(xí)安全的小伙伴們一定對于Content-Type這個字段很熟悉。在客戶端,發(fā)送Content-Type這個字段是告訴服務(wù)器應(yīng)該響應(yīng)給客戶端什么字段,在服務(wù)端,這個字段的發(fā)送就是告訴客戶端應(yīng)該以什么格式去解析數(shù)據(jù)包。
而Content-Disposition這個字段其實是作為對下載文件的一個標(biāo)識字段。
可以看一下firefox網(wǎng)站對于這個字段的說明:
Content-Disposition這個字段簡單來說就是:當(dāng)瀏覽器彈出一個下載框的時候,會給出一個文件名。比如在服務(wù)器上放置了一個文件,通過Content-Disposition去響應(yīng)給瀏覽器,指定文件名叫做1.txt,打開保存框的時候,文件名就是1.txt。
但是看到我們包中的這個字段,是放在請求中使用的。
Content-Disposition: form-data; name=“upload_file”; filename=“shell.php”
前面有一個保存路徑,后面有一個文件名,估計filename會用來做白名單的校驗,“…/upload/”會用來做實際的文件保存。
如何繞過?
1.將shell.php改成shell.png(或者其他圖片的格式,在白名單中的格式)
2.路徑“…/upload/”改成“…/upload/shell.php”
這時候會有一個問題:路徑會和文件名進(jìn)行拼接,變成:“…/upload/shell.php/shell.png”
那不就會有問題嗎?
其實pass12和pass13都要用到一個知識點:
文件名截斷
什么是文件名截斷?
簡單來說,就是在文件名最后加上一些特殊的字符或者控制字符,當(dāng)程序遇到這個字符的時候,就會認(rèn)為字符串結(jié)束了,后面的會跳過忽略。
所以我們在pass12這一關(guān)中,可以這么做:在文件名之后加一些特殊的字符,再拼接一些在白名單之中的后綴。
因此,我們就可以繞過白名單,又能使得一些特殊控制字符使無效而最終保存在靶機上的是我們想要的文件名。
截斷字符:
chr(0),類似于C++的"\0"
filename=test.php%00.txt -------------- filename=test.php
| %00 | 0 |
在很多編程語言(比如java,PHP)中,ASCII中的0都是作為字符串的結(jié)束符號來看待的。
產(chǎn)生這個字符:
特別注意:這一關(guān)的路徑實在URL中的,所以需要對0進(jìn)行URL編碼
所以最后我們應(yīng)該這么改正:
上傳之后,貌似是成功了:
但是我查看文件路徑的時候非常奇怪:
而且是404頁面:
嘗試訪問:
/upload-labs/upload/shell.php
是可以的。
嘗試連接蟻劍:
沒有問題。pass12就可以了
pass13-源碼和提示
第13關(guān)其實和第12關(guān)是同一組。
源碼:
$is_upload = false; $msg = null; if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上傳失敗";}} else {$msg = "只允許上傳.jpg|.png|.gif類型文件!";} }提示:
提示和pass12是一樣的。源碼好像也是一致的。
具體區(qū)別通過下面的文件上傳來抓包獲取:
pass13-文件上傳和抓包
上傳文件之前我先把自己環(huán)境的已經(jīng)上傳的文件清除了:
然后開始上傳shell.php并且抓包。
一抓包就能看到區(qū)別:
可以看到保存路徑和文件名都放在了Content-Disposition中。
按照上一關(guān)的套路,應(yīng)該進(jìn)行差不多的修改。
特別注意這里應(yīng)該寫十六進(jìn)制的%00
利用Hex這個模塊
首先用+進(jìn)行占位(注意+的十六進(jìn)制是2b)
然后切換到Hex將其改為00
改之前:
改之后:
再回到Raw中,注意,看起來沒有其實是有的。
最終的效果是:
放包。
上傳成功。
然后連接webshell
Pass也成功了。
pass1-pass13總結(jié)
| 1 | 前端繞過 |
| 2 | Content-Type |
| 3 | 等價擴展名 |
| 4 | .htaccess文件 |
| 6 | 大小寫過濾不全面,一樣大小寫繞過 |
| 7 | 擴展名最后加一個空格 |
| 8 | 擴展名最后加一個點 |
| 9 | 擴展名最后加上::$DATA |
| 10 | 擴展名最后加上點空點 |
| 11 | 雙寫文件擴展名 |
| 12 | 文件名截斷(URL)%00 |
| 13 | 文件名截斷(HEX)加號[2b]占位再改為00 |
歡迎關(guān)注公眾號“小東方不敗”。寫博客不容易,歡迎交流!!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的upload-labs_pass12_文件名截断_URL要编码为%00_pass13_文件名截断_Hex修改为00的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel操作
- 下一篇: upload-labs_pass14_p