0%

upload-lab练习

upload-lab

序言: 最新需要补充点web安全的知识,找了些靶场来练手,先部署环境

下载

搭建

1
2
docker pull c0ny1/upload-labs
docker run -d -p 80:80 upload-labs:latest

注意需要进docker里创建upload文件夹以及,设置权限为777

1

查看源代码,发觉前端验证,抓包或者禁用js都行,这里直接禁用js绕过,

2

这里不知道怎么绕过,没系统学过,查找wp后说可以改content-type绕过,因为服务端这里可能做了检测,接着便改content-type,过程改错了,改了打包的content-type,实际要改的是底下的WebKit里面的

1
Content-Type:image/gif
  • mime是多用途互联网邮件扩展类型,用于设定某扩展名文件的打开方式,如.png在数据包的中的content-type为image/png
  • $_FILES是一个全局变量数组,各个值的含义为
$_FILES[‘myFile’][‘name’]上传文件的原名称
$_FILES[‘myFile’][‘type’]文件的 MIME 类型
$_FILES[‘myFile’][‘size’]已上传文件的大小,单位为字节
$_FILES[‘myFile’][‘tmp_name’]文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定
$_FILES[‘myFile’][‘error’]和该文件上传相关的错误代码

查看源码

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

确实如此

3

我还是学原理吧,这里

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 . '文件夹不存在,请手工创建!';
}
}

发觉是黑名单,查询wp后得知,可以用.phtml .php3后缀可以绕过

百度一番

利用apache的解析特性:它将.php3,.php5,.phtml等都可以解析为php

配置apache

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

我感觉谁会这么傻配置这个去?

至于apache版本,可以随意输入报错获得,哈哈一本正经的说胡话,测试完毕,发觉全tmd不行,找了个.htaccess改写配置文件的方法,然后发觉也改不了,因为重命名了,这时候感觉死了,搞不定了,只能找别的方法绕过了。。。目前没有办法绕过,暂时先过

4

黑名单,没有过滤.htaccess,利用.htaccess修改解析

1
2
3
<FilesMatch "03.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

再上传一个03.php,抓包改为jpg就行了,然后访问即可

5

还是一样的?黑名单,不过加了个.htaccess

不过这次没有转换小写,意思可以大小写绕过,上传后有球用。。。我没法读取,服务器不解析这个文件。。。哦,应该是linux的锅,linux大小写敏感,win下不敏感,所以应该解析不了

6

什么鬼,网上的wp全都是不能用的,我空格绕过了,连不上的马。。

原理

  • 查看源码,没有对文件名的空格去除
  • windows中文件扩展名后的空格会做空处理,但是文件名后加空格使得本来的扩展名改变,绕过黑名单

7

windows特性??

1.php. 他会自动去除最后一个.,所以我linux不用测试了

原理

  • 查看源码,没有去除文件名后的点
  • windows下最后一个.会被自动剔除

8

又是windows特性

1.php::$DATA这个可以绕过

原理

windows下,如果上传的文件名后缀为php::$DATA会在服务器生成后缀为Php的文件,内容和上传内容相同,并被解析

9

构造 1.php. . 点+空格+点

原理

查看源码,首先利用trim去除末尾空格,又l利用deldot去除末尾点,又去除空格,所以组合点空格点,去除点去除空格,最后剩下点自动剔除

10

后面不做了

别人博客,还讲原理

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/4d95e9f2/
版权声明:转载请注明出处!