文章目录
- 前言
- 一、靶场需要了解的前置知识
- 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文件。此文章是小白自己为了巩固文件上传漏洞而写的,大佬路过请多指教!