文件上传的知识总结在语雀:毕业实习-Day 7
之前写了一部分,但是没写全,今天继续干
Pass-01
提示
本pass在客户端使用js对不合法图片进行检查!
闯关
直接F12查看页面源代码,然后找到提交表单的位置
源码解析
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;
}
}
从上面的代码可以看到它只运行上传jpg png gif
后缀的文件,但因为它是前端校验,所以绕过方法有很多,下面是我想到的两种
- 直接在前端浏览器把调用这个检验函数的代码删除掉,这样浏览器在提交表单的时候就不会调用这个函数,自然也就绕过了,也就是我上面用的方法
- 先将咱们的一句话木马shell.php修改为
jpg png gif
其中之一的后缀,然后在前端提交,但是使用bp拦截下这个提交的数据包,然后将其中的文件名后缀修改回php即可,这样也可以实现绕过。不过比上面麻烦一点点。
Pass-02
提示
本pass在服务端对数据包的MIME进行检查!
闯关
抓取一下上传流量包,因为检查MIME,所以如下图所示,发送不是图片类型的文件时,MIME不是图片的格式,就会上传失败
所以将其修改为常见的图片格式如
image/jpeg
、image/png
、image/gif
后,再次上传即可发现上传成功并且我们可以在页面中找到返回的存储路径,说明上传成功,直接用冰蝎连接即可
源码解析
$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.'文件夹不存在,请手工创建!';
}
}
分析源码可以看到后端检测MIME,只允许image/jpeg
、image/png
、image/gif
类型的文件上传,除此之外没用其他检测,所以我们只需要抓包将上传的数据包的MIME修改为这三种之一即可成功上传。
Pass-03
我靠了,这一关docker拉的镜像有问题,没一个后缀能解析,服了。
提示
本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
闯关
直接上传发现不成功,禁止上传.asp|.aspx|.php|.jsp后缀文件!
在上传时,后端有时会通过检查后端文件名进行过滤,如果存在疑似恶意文件的后缀名,将会直接重置连接或者对文件进行初始化处理。为了绕过这种情况,我们以php文件为例,假设后端禁止或会初始化所有php文件的上传,我们常通过使用大小与,双写与或利用中间件解析漏洞进行绕过。比如
.Php
.php2-7
.phps
.pht
.phtm
.phtml
.pgif
.shtml
.htaccess
.phar
.inc
.hphp
.ctp
.module
这里我把下面的这些后缀都尝试了一遍,按理说应该是有一个可以解析为php正常执行的,我看了网上的通关也是这样,但是我没试出来到底哪个后缀可以解析为php,而且这里会把上传的文件重命名为随机数字字符串,所以也不能上传
.htaccess
,下面就是我尝试了的后缀php2
php3
php4
php5
php6
php7
pht
phtm
phtml
抽象的很,下面是我换成Windows后用小皮搭建的靶场,这里需要在phpstudy的设置 -> 配置文件,找到httpd.conf,然后进行编辑
#AddType application/x-httpd-php .php .phtml
#将上一行的#删除或者直接添加下面这行
AddType application/x-httpd-php .php .phtml .php5 .php3
然后把一句话木马后缀名修改为.phtml
.php5
.php3
中的一个然后上传连接即可成功。
源码解析
$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 . '文件夹不存在,请手工创建!';
}
}
看源码这里也只是不允许.asp
.aspx
.php
.jsp
这四种文件上传,然后获取到上传文件名后先把文件名末尾的.去掉后,转换为小写并去除::$DATA
(这个是windows特性),然后和上面的后缀进行比较。
Pass-04
提示
本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.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后缀文件!
这里的提示禁止上传的这么多后缀,也可以提示上一关有其他可以解析为php的后缀可以上传
闯关
这一关禁用这么多后缀,那就想办法不用这些可执行文件的后缀。通过前面的抓包可以看到服务器用的是apache的中间件,.htaccess
文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess
文件,可以帮我们实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许 / 阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能,我们用的就是它可以指定将某种文件后缀用什么方式解析
这里在本地创建一个.htaccess
,然后进行上传,前提是服务器不重命名你上传的文件,docker拉取的镜像这一关还进行重命名,给我整不会了。
.htaccess
文件内容如下,下面这个配置就是让把.p-hp的后缀文件当作类型 application/x-httpd-php 执行 (php 的类型),也就是当作 php 执行
AddType application/x-httpd-php .p-hp
这里虽然无法访问,但是文件上传成功,注意是403报错也是没有权限,但不是404不存在,所以这个配置文件上传成功了,不用担心,直接进行后续操作即可。然后此时.p-hp后缀的文件就会被php解析。
wc了,直接搞不来,整了我快一个小时,不搞了,搞不出来,不知道哪里出问题了,服了
源码解析
docker拉取的镜像这一关还会重命名,有点问题