文章目錄
- 前言
- 一、靶場需要了解的前置知識
- 1、%00截斷
- 2、0x00截斷
- 3、00截斷的使用條件
- 1、php版本小于5.3.29
- 2、magic_quotes_gpc = Off
- 二、靶場第十二關通關思路
- 1、看源代碼
- 2、bp抓包%00截斷
- 3、驗證文件是否上傳成功
- 總結
前言
此文章只用于學習和反思鞏固文件上傳漏洞知識,禁止用于做非法攻擊。注意靶場是可以練習的平臺,不能隨意去尚未授權的網站做滲透測試!!!
一、靶場需要了解的前置知識
1、%00截斷
%00截斷常在url中get請求使用,在url中%00表示ascll碼中的0 ,而ascii中0作為特殊字符保留,表示字符串結束,所以當url中出現%00時就會認為讀取已結束。所以一般文件上傳繞過%00會在路徑上使用。
http://xxx.com?filename=test.php%00.txt
這樣服務器讀取%00的時候就會中斷讀取,造成只讀取了test.php。
2、0x00截斷
0x開頭表示16進制,0在十六進制中是00, 0x00就是%00解碼成的16進制。其實和%00的原理沒有太大區別,只是使用的方式不一樣,這個0x00是手動修改為16進制變成的,通常通過bp修改,其實%00解碼就是0x00,0x00通常在post請求使用。
3、00截斷的使用條件
1、php版本小于5.3.29
2、magic_quotes_gpc = Off
去php.ini修改就行
二、靶場第十二關通關思路
- 1、看源代碼
- 2、bp抓包%00截斷
- 3、驗證文件是否上傳成功
1、看源代碼
$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文件。那么白名單繞過最常見的方法就是00截斷了。這里發現有一個路徑拼接,也就是如果上傳的文件后綴名符合白名單就會隨機命名文件然后拼接到文件所在的絕對路徑上。那么我們可以在文件路徑進行截斷,把成功上傳的文件后綴名截斷掉,保留我們需要的php后綴名。
2、bp抓包%00截斷
這里我上傳含有一句話木馬的文件為23.jpg,然后%00截斷讓其上傳23.php。因為這里的save_path是get傳參,也就是說url會把%00自動解碼成空字符,上傳后服務器就會以為是結束符就不會讀取拼接上來的jpg文件了。
3、驗證文件是否上傳成功
這里訪問的時候記得把9020231122143153.jpg去掉,因為成功上傳的其實是23.php
最后蟻劍連接成功。
總結
這一關是基于白名單的%00截斷繞過,原理就是%00其實在計算機眼里是結束符,我們通過路徑截斷,讓其拼接的正常jpg文件變成我們修改的php文件。此文章是小白自己為了鞏固文件上傳漏洞而寫的,大佬路過請多指教!