avatar

web渗透学习笔记[四]--文件上传

文件上传漏洞和解析漏洞

用户上传了可执行的脚本文件,并且可以执行。

本文使用靶场为2019年12月更新的upload-labs新增了个pass05,后面的顺序向后调整

https://github.com/c0ny1/upload-labs
环境下载地址
burpsuit下载地址

1.1 绕过

1.1.1 抓包更改请求

站点如果只是在js检测了类型可以直接禁用js,或者抓包更改请求绕过,还有些事检查HTTPHeader中的Content-Type修改可上传的类型即可。

例子1:upload-labs第一关 js

当随意上传一个文件的时候,显示,js拦截了

image-20200503160216615

方法1:

禁用js

这里使用的是浏览器插件NoScript

我们尝试上传一个文件: 1.php

内容是

1
<?php phpinfo();?>

image-20200503163726761

成功上传

image-20200503185110554

方法2:

抓包

image-20200503185434510

例子2-upload-labs第二关 Content-Type

尝试上传php文件发现

image-20200503191450284

先抓个包看一下

image-20200503191533160

尝试修改Content-Type:image/jpeg

上传成功

打开链接同样能够显示phpinfo信息

也可以查看源码来判断

1.1.2 Magic检测绕过

站点如果是通过文件头部来检测文件的类型,这种检测可以在Shell前面修改添加相应的二进制值,头部添加标识文件类型的头部字节。

常用的头字节:

类型 二进制值
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF 47 49 46 38 39 61
PNG 89 50 4E 47
TIF 49 49 2A 00
BMP 42 4D
例子1:upload-labs第十四关 头字节

利用

image-20200504155112152

得出的GIF89a加到

image-20200504155153538

上传发现成功,需要结合文件包含

例子2:upload-labs第十五关

getimagesize获取文件类型

同上

例子3:upload-labs第十六关

php_exif模块来判断文件类型

同上

例子4:upload-labs第十七关

本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片

https://xz.aliyun.com/t/2657

1.1.3 后缀绕过

部分服务仅根据后缀、上传时的信息或Magic Header来判断文件类型,此时可以绕过。

php

有些配置不当可能可以使得服务器的解析器支持/ph(p[2-7]?|t(ml)?)/后缀。

就可以使用php/php3/php5/pht/phtml/shtm/pwml/phtm等后缀上传。

jsp

jspx / jspf / jspa / jsw / jsv / jtml

asp

asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90}

其他后缀:

vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini

还有些未设置大小写,可以通过后缀大小写绕过

双写绕过

例子1:upoad-labs第三关 addtype

image-20200503192647062

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$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 . '文件夹不存在,请手工创建!';
}
}

使用黑名单的形式

可以绕过黑名单,使用php3,phtml绕过

如果使用的是phpstudy搭建的环境,需要在httpd.conf文件内添加

1
AddType application/x-httpd-php .php .phtml .php3

image-20200503195219193

例子2:upload-labs第五关 ,第十关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$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 . '文件夹不存在,请手工创建!';
}
}

大部分内容都加入了黑名单,大小写也限制

但是$img_path = UPLOAD_PATH.'/'.$file_name;

可以尝试使用xx.php. .

image-20200504123536558

上传成功

复制图片地址,访问

执行成功

第十关也可以用此方法

例子3:upload-labs第六关 大小写

查看源码可以发现并没有对大小写进行控制

使用burpsuit将后缀改为phP可以上传成功

例子4:upload-labs第七关 空格

查看源码可以发现没有对去除空格

使用burpsuit在filename后面加上空格

上传成功,可执行

例子5:upload-labs第八关 .

查看源码发现黑名单中没有.

可以上传1.php.

上传成功,可执行

例子6:upload-labs第十一关 双写

尝试上传php文件,上传成功但是,发现后缀名被删除

双写后缀1.pphphp

image-20200504150111867

上传成功,可执行

1.1.4 系统命名

windows里index.php.会被重命名为index.php

其他:

index.php%20 / index.php:1.jpg / index.php::$DATA

linux中

index.php/. / ./aa/../index.php/.

例子1:upload-labs第九关 ::$DATA

查看源码内没有对::$DATA过滤

::$DATA在win里会把::$DATA之后的数据当做文件流处理,不会检测后缀名,并且保持::$DATA之前的文件名

image-20200504144721495

上传成功,复制链接,删除链接中的::$DATA

访问,可以执行

image-20200504145322807

例子2:upload-labs第十二关 %00

​ 1、需满足 php 版本<5.3.4

​ 2、php.ini中的magic_quotes_gpc是off状态的

本关采取的是白名单

image-20200504150617306

上传图片的时候发现有显示save_path

查看源码,$img_path是直接拼接而成,可以利用%00截断

image-20200504151336067

上传成功,可执行

例子3:upload-labs第十三关 post%00

image-20200504153758495

将a对应的位置改为00

image-20200504153841720

上传成功

1.1.5 竞争上传

有些服务器在删除不合法的文件之前会先将其保存下载,可以通过反复上传一个会生成webshell的文件并且尝试访问。

1.2 攻击技巧

1.2.1 apache重写GetShell

apache可以根据是否允许重定向考虑上传.htaccess文件

内容为

1
AddType application/x-httpd-php .png

就可以用png或者其他后缀的文件做php脚本了

例子:upload-labs第四关

查看源码,采取了黑名单的方式,过滤了较多有问题的后缀,但是没有过滤.htaccess

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".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",".ini");
$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 . '文件夹不存在,请手工创建!';
}
}

新建一个.htaccess文件,将以下内容写入并且上传文件:

1
AddType application/x-httpd-php .png

文件上传成功

这样png格式的文件会以php解析

之后制作一个图片马

方法1:

在windows下,右键点击图片,进入属性窗口,进入详细信息选项,

image-20200504102105315

在可以输入的地方输入php语句,上传图片

image-20200504102208977

上传成功

image-20200504102304622

打开图片链接发现,php代码被成功执行

image-20200504102449824

方法2:

抓包修改

image-20200504121404582

同样能成功运行

1.2.2 软链接任意读文件

上传的压缩包文件会被解压的时候,可以考虑上传含有符号链接的文件若是服务器没有做好防护,可以实现任意文件的读取

1.3 防护

  1. 白名单
  2. 严格检查文件类型
  3. 限制web server对上传文件下的解析

Asp一句话:<%eval request(“xxx”)%>
Php 一句话:<%php @eval($_POST[xxx]);?>
Aspx一句话:<%@ Page Languag=”xxx”%><%eval(Request.Item[“xxx”])%>

文章作者: jia9yo
文章链接: http://wlaqstcs.com/1001/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 jia9yo-网络安全渗透测试

评论