upload-labs部分wp
配置
-
php-5.2.17
-
关闭
magic_quotes_gpc, 打开allow _url_fopen,allow_url_include,php_exif -
所有关卡我都是看源码解题, 因为先要学习有那些检测方法才能学习绕过
pass-1
考点: 前端绕过
(对上传文件检测分为检测和后端检测, 前端检测就是通过 JavaScript 检测)
绕过: 在禁用浏览器 JavaScript

pass-2
考点: MIME 类型检测
(MIME 类型是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。就像我们看到文件后缀 .jpg 就知道他是图片文件一样, 浏览器可以通过查看 MIME 类型知道收到的文件是什么类型)
绕过: 使用 burpsuit 拦截上传请求, 修改其中 MIME 类型为允许上传的类型 (MIME 类型在 content-Type 字段)

黑名单绕过思路
pass-3 开始有黑名单限制了, 先总体说一下黑名单绕过思路:
windows有个特性,它会对于文件的后缀名自动的修改,例如空格和点,冒号后面的内容都省略掉,可以利用window特性进行绕过。还有文件名结尾隐藏属性::$DATA写不写都一样. 比如a.php和a.Php和a.pHp是一样的- 后缀
a.php和a.php是一样的(第二个是.php空格) a.php和a.php.和a.php...是一样的a.php和a.php::$DATA是一样的
但是, 这些 一样 是因为 windows 对后缀已经进行处理后才 一样, 而一个网站拿到的是原始的, 没有经过处理的数据, 这些后缀对网站来说就是不一样的, 比如对网站来说 a.php 和 a.php::$DATA 是不一样的
pass-3
考点: 文件后缀黑名单限制
绕过: 上传黑名单中没有的后缀(.php2, .php3), 在 bp 拦截的请求中修改后缀为 php3

#pass-3
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
pass-4(未解决)
考点: .htaccess配置文件
绕过:上传111.htaccess配置文件, 这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为php代码执行

接着上传 4.png 图片马,访问图片马
pass-5
绕过: 后缀加点空格点 a.php. .
代码分析: 会发现它依次去除后缀名末尾的点, ::$DATA, 空格. 如果我上传 a.php. ., 经过去除点与空格剩下 a.php., 它对于 windows 来说和 a.php一样
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
pass-6
绕过: 大小写绕过 a.PHP
代码分析: 发现相比于 pass-5 ,这关没有过滤大小写
#pass-6部分代码
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
pass-7
绕过: 空格绕过 a.php (a.php空格)
代码分析: 限制了大小写, 点, ::$DATA,没限制大小写
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = $_FILES['upload_file']['name'];
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
pass-8
绕过: 点绕过 a.php.
分析: 这关提示如图, 再看源码没有过滤空格

if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
pass-9
绕过:后缀加 ::$DATA, 如 a.php::$DATA
pass-10
绕过: 后缀加点空格点, a.php. .
pass-11
绕过: 双写绕过, a.pphphp
代码分析: 发现本关是把黑名单的后缀替换为空, 那我后缀改为 a.pphphp, 他会把 后缀中 php 换为空, 剩下了 a.php
$file_name = str_ireplace($deny_ext,"", $file_name);
这关开始有白名单了
pass-12
考点: 白名单和 GET的%00截断
url中%00会编码为0x000x00相当于是一个注释符, 它(这行)后面代码不会执行
绕过: 上传 a.php ,在bp拦截中修改后缀和路径
代码分析:可以看到上传路径可以通过 GET 方式上传
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

- 上传成功后在新标签中打开图片发现
Not Found,这是正常的, 因为我们修改了上传路径, 只需要把路径改为我们修改的就能访问了
![image]()
![image]()
pass-13
考点: 白名单和 POST 的%00截断
绕过: 和pass-12 差不多, 但这关是在请求体中修改, 在请求体中添加路径 111.php%00 再对添加的路径进行 url编码 (因为post不会对上传路径进行编码), 同时也要修改文件后缀
代码分析:跟 pass-12 相似, 不过这次是 post
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
-
先添加路径, 修改后缀
![image]()
-
选择添加的路径, 编码路径
![image]()
-
编码后的路径中
%00看不见了, 这是正常的
![image]()
-
上传成功后在新标签中打开图片发现
Not Found, 这是正常的, 因为我们上传时候修改了上传路径, 把路径改为我们修改的路径即可访问
![image]()

pass-14
考点: 图片马制作, 文件幻数检测, 文件包含漏洞
-
图片马制作
- 在同一文件夹内有一张图片, 一个
php代码文件(php马) - 在此文件夹内打开cmd
-
点一下文件路径
![image]()
-
输入
cmd![image]()
-
回车, 会弹出一个命令行界面,输入
回车copy 111.jpg/b + 222.php/a 333.jpg
4. 当前目录下多了一个333.jpg, 这333.jpg就是图片马
![image]()
-
- 在同一文件夹内有一张图片, 一个
-
文件幻数检测
文件幻数可以用来标记文件或者协议的格式
查看文件类型除了看后缀还可以看他的文件幻数, 以十六进制打开一个文件, 最前面几个数字就是他的文件幻数
![image]()
我们可以通过修改文件幻数绕过检测- 修改文件幻数的其他方法
- 方法一: 在
post上传请求的请求体中修改
![image]()
方法二: 在php文件最前面添加文件幻数对应的字符串(因为文件幻数检测的是十六进制数字,而我们写的是字符), 如GIF89a![image]()
-
文件包含漏洞
文件包含漏洞详解
文件包含漏洞利用的前提条件:
(1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的方式引入;
(2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;
绕过: 上面介绍的图片马制作就是把 php代码加到图片文件最后面, 目的是为了不破坏最前面的文件幻数,上传上面的图片马后在新标签中打开图片并不会执行 php 代码

想要执行代码得利用文件包含漏洞,本关告诉存在文件包含漏洞的是此页面
在此页面路径后面接上图片马路径即可

pass-15
绕过: 依旧上传 pass-14 图片马绕过
分析: 本关通过函数 getimagesize()检查是否为图片文件
pass-16
绕过: 依旧上传 pass-14 图片马绕过
分析: 本关使用函数exif_imagetype()检查是否为图片文件
pass-17(未解决)
考点: 图片马,二次渲染
pass-18
考点: 条件竞争
绕过: 使用 bp 一直发送同一次请求, 用另一个浏览器访问这个上传文件
代码分析: 这关是先上传文件,再对文件后缀进行判断,二次渲染, 如果不符合上传条件就删除文件, 我们可以不停的访问这个文件,一旦访问成功,文件就被打开,就无法删除了
pass-19
绕过: 上传图片马,文件包含漏洞访问
pass-20
考点: move_uploaded_file()特性
绕过:
- 法一: 保存文件名称后缀大小写, 点, 空格绕过,如
a.php. - 法二: 利用
move_uploaded_file()特性,它会会忽略掉文件末尾的 /. 如a.php/.
代码分析:
查看代码会发现判断的是保存文件名后缀
![image]()
可以大小写,点, 空格绕过, 或者文件名末尾加/.
然后直接访问上传文件即可
pass-21(未解决)
网上是用数组做出来的, 我拿文件包含漏洞做出来了,明天看看数组做法














浙公网安备 33010602011771号