upload-labs通关教程。【小白必看】

免责声明:仅供参考学习,禁止非法活动,如有违法犯罪,概不追究本人责任。

目录

pass-01(前端绕过)

pass-02(MIME类型过滤)

pass-03(黑名单过滤)

psaa-04(.htaccess文件 )

pass-05( .user.ini 绕过)

pass-6(大小写绕过)

pass-7(空格绕过)

pass-8(后缀加点绕过)

pass-9(额外数据流绕过"::$DATA")

pass-10( 点+空格+点绕过)

pass-11(双写绕过)

pass-12(%00截断)

pass-13(%00截断)

pass-14(文件头绕过)

pass=15(getimagesize 绕过)

pass-16(图片马绕过;exif_imagetyp)

pass-17(二次渲染)

pass-18(条件竞争 逻辑漏洞)

pass-19(apache解析漏洞+条件竞争)

pass-20(直接点绕过)

pass-21(数组绕过)


pass-01(前端绕过)

我们先上传一个php文件,然后前端页面显示不允许上传。此时我们就猜到应该是前端检验后缀名了

思路:

1.首先在前端关闭js弹窗,

2.先将一个写有后门的木马文件后缀名改成 前端验证要通过的文件后缀名,然后抓包将后缀改成php文件

实现:

第一个思路

浏览器搜索:about:config------->搜索:javascript.enabled---------->关闭就行了。

然后直接上传就可以了。

第二个方法:

抓包直接修改后缀名

pass-02(MIME类型过滤)

查看源码以及根据提示可以知道本关卡是对于MIME类型进行过滤的,

思路:思路很简单,我们只需要通过抓包,然后修改Content-Type的类型就行,根据源码我们看的出来,只能 修改Content-Type: image/jpeg、image/png、image/gif(上述三种任选其一),这个格式才能绕过服务端。

操作:

抓包,将Content-Type修改成图片格式。

然后提交数据就行

成功上传。

直接用蚁剑进行连接后台,上传的地址可以直接在上传的图片右键,然后直接新建标签打开图像,就可以知道位置了。

成功上线,(后面蚁剑连接的步骤都是差不多的,不在累述)。

pass-03(黑名单过滤)

查看源码可以看出不允许上传asp、aspx、php、jsp后缀名

思路:不能上传php、asp等后缀,那么我们可以上传php3、php5等,因为 在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。

操作:

修改php一句话木马的后缀为php5,

成功上传。

psaa-04(.htaccess文件 )

尝试上传4.php、4.php5、4.phtml以及各种大小写后缀均绕过失败,查看提示发现存在很多很多的黑名单后缀名,然后我们就发现没有过滤.htaccess文件,所以直接上传.htaccess文件。

根据提示以及源码可以知道不能上传的文件后缀类型。

思路: 发现有一个文件是没有过滤的,即上传中常用到的 .htaccess文件

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。
AddType application/x-httpd-php .png
#如果当前目录下有以.png结尾的文件,就会被解析为.php

这一关的我的思路是没有我问题的,但是上传上去.htaccess文件以后,并没有执行这个文件,可能是版本问题。

在网上找到了其他的网址靶场,可以成功。upload-labs

操作:

创建.htaccess文件,代码如下:

方法一:
<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>
#如果当前目录下有4.png,就会被解析为.php
 
方法二:
AddType application/x-httpd-php .png
#如果当前目录下有以.png结尾的文件,就会被解析为.php

方法二:
AddType application/x-httpd-php
#如果当前目录下的文件,就会被解析为.php

先上传.htaccess再上传4.png,

然后访问图片利用HackBar构造post请求,或者用蚁剑进行连接。

补充知识点:

.htaccess文件简介

.htaccess是Apache HTTP服务器中的一种分布式配置文件,用于控制特定目录下的访问权限、重定向、错误处理等。它允许网站管理员或开发者在服务器根目录之外的各个目录层级中设置权限和配置,而无需修改服务器全局的配置文件(如httpd.conf)。

在文件上传漏洞中的作用

  1. 解析漏洞

:当Web应用程序允许用户上传文件但未正确配置或验证上传文件类型时,攻击者可以通过上传一个.htaccess文件来修改服务器对该目录下文件的处理方式。例如,攻击者可以创建一个.htaccess文件,内容如下:

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

这段代码告诉Apache将该目录下所有文件当作PHP脚本来解析。这意味着,即使攻击者上传了一个看似无害的图片文件文件名是 2.jpg,只要它包含PHP代码,Apache也会执行这些代码。

  1. 绕过黑名单

:有时,Web应用会使用黑名单过滤上传文件的扩展名,以防止PHP等可执行脚本的上传。但通过上传.htaccess,攻击者可以设置特定规则,使得特定命名模式的文件(如包含特定关键词的文件名)也被当作PHP执行,绕过了文件扩展名的过滤。

  1. 访问控制

:攻击者还可以利用.htaccess来改变目录的访问权限,比如限制或允许特定IP访问某些文件,这可能有助于隐藏他们的恶意活动或进一步渗透。

防御措施

  1. 严格验证文件类型:不仅仅依赖文件扩展名检查,还应该通过MIME类型或文件内容分析来验证上传文件的真实类型。
  2. 限制上传目录权限:确保上传目录的权限设置足够严格,避免执行权限(如给上传目录设置755权限,而不是777)。
  3. 禁用或严格管理.htaccess:在Apache配置中禁用.htaccess文件的使用,或者严格限制其能覆盖的指令范围。
  4. 使用白名单而非黑名单:在可能的情况下,使用文件类型白名单而非黑名单,只允许已知安全类型的文件上传。
  5. 定期审计和监控:定期检查上传目录,使用WAF(Web应用防火墙)和日志监控来检测异常行为。

总之,.htaccess文件在文件上传漏洞中的利用,展示了Web应用程序安全配置的重要性,以及如何通过精心设计的配置文件来绕过安全机制,进而控制服务器的行为。防御此类攻击需要综合考虑多方面的安全策略。

pass-05( .user.ini 绕过)

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

看源码上的都是黑名单以及.htaccess也不允许上传,属于黑名单,所以可以试试.user.ini 绕过。

思路:

  1. 仔细分析代码里的黑名单可以发现纯大写后缀可以绕过
  2. .user.ini 绕过。

第一种的思路我就不演示了,很简单。直接抓包修改后缀就行。直接演示第二种。

.user.ini 绕过

意思是在上传.user.ini文件中写入 Auto-prepend-file=1.txt 之后该目录下的所有 文件都会先去执行 这行代码

是的,您的理解基本正确,但需要澄清一些细节。在.user.ini文件中,如果包含了如auto_prepend_file=1.txt这样的配置指令,其含义是指示PHP在处理该目录下所有PHP脚本之前,先自动包含并执行名为1.txt的文件。这意味着,只要PHP配置允许.user.ini生效,并且该指令被正确解析,那么每当该目录下的任何PHP脚本被执行时,1.txt文件(假设攻击者已上传并包含恶意代码)就会首先被执行。

.user.ini使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)。

操作

上传一个.user.ini文件:auto_prepend_file=5.jpg

然后在上传一个5.jpg文件,是一个php一句话木马。

然后直接访问会提示存在错误,无法解析,这是因为只有在访问PHP文件时候才会包含5.jpg,也就是.user.ini才会生效。

所以提示的时候才会提示有一个readme.php文件,所以直接访问readme.php,然后就可以了

这是因为PHP解析器的版本太低,换成7.3.4的就可以了。

直接利用HackBar构造post请求,或者用蚁剑进行连接。

pass-6(大小写绕过)

$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",".ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $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 = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

看到源码和提示可以知道是大小写绕过,因为源码中没有函数声明把所有的文件后缀变成小写。

思路

直接上传jsp格式的一句话木马,然后抓包修改后缀。

操作

看我们上传的文件确实上传了,但是解析错误,不知道为什么。但是思路是没错的。参考了其他的文章,也就是这个方法没有错,具体的原因我还没有找到。

pass-7(空格绕过)

尝试大小写绕过,.htaccess文件等均显示此文件禁止上传,查看源码 。发现没有对上传的文件名做去空格的操作->trim()

原因:原理是 windos 系统 后缀名 后加空格,会自动把空格删去,与其匹配的黑名单里面没有 后缀名加空格的格式所以就可以绕过

思路

利用burp抓包,修改对应的文件名 添加空格。

操作

直接抓包修改。

直接getshell

pass-8(后缀加点绕过)

显示所有的后缀都不允许上传,我们仔细看代码就会发现与第七关相似,

发现对上传的文件后缀名未做去点.的操作—>strrchr($file_name, '.')
Windows系统下,文件后缀名最后一个点会被自动去除。上传 8.php.

思路

与第七关一样,在后缀后面加上点。

直接拿下

pass-9(额外数据流绕过"::$DATA"

仔细和上面的代码作比较,发现这关的过滤相较于上一关又少了一个过滤(::$DATA)的字符串

解释:在windows环境下,不光会自动去除文件末尾的点和空格,同时(::$DATA)这个字符串,windows也会认为是非法字符,默认去除掉

思路

在文件后缀加上::$DATA

操作

成功拿下

补充:

额外数据流绕过

文件上传功能中的“额外数据流”通常指的是在上传文件时,除了文件本身的内容外,伴随文件一同传输或存储的附加信息。这些信息可以用于多种目的,包括但不限于安全性验证、元数据记录、用户上下文关联等。

echo语句

原理就是 电脑允许数据流存在,就是上面的cmd操作,但是 如果上传文件的时候以数据流格式 上传 (1.txt:jj) 这样的后缀 没有过滤 电脑会自动把后缀修改 (1.txt)

pass-10( 点+空格+点绕过)

可以看到,结合上面几个的过滤,转小写、空格、点、.htaccess都给我们防住了

那这时候该怎么办呢?

代码是死的,人是活的。他每过一句代码,执行一次,那我们就在文件末尾多加几个空格点之类了,反正他也就每执行一次取出一个。

原理: 比如 1.php.. 是从后往前删 遇到空格就会停下来 所以就是 把最后一个点删掉,过滤机制 没有过滤 1.php.的名单 所以就会上传上去,但是这种后缀名,在上传到服务器上会自动恢复到本来的后缀 1.php 所以就成功上传php文件了

思路

直接在后缀加上(点+空格+点)

操作

pass-11(双写绕过)

上传php文件发现没有后缀了。

那就说明将后缀置为空了。直接双写试一试

思路

后缀双写

操作

pass-12(%00截断)

思路

设置上传路径为upload/12.php%00 ,添加12.php%00内容为了控制路径,上传文件后缀为白名单即可 例:12.png,保存后为/upload/12.php%00***.png,但服务端读取到%00时会自动结束,将文件内容保存至12.php中

操作

因为拼接的%00是get传输,所以不用解码,直接%00就可以。(这里一定要记得把php版本换成低于5.3的,并且需要在phpstudy把魔术引号函数magic_quotes_gpc关闭掉)

pass-13(%00截断)

此关卡与pass-12相似,但不同的是pass-12的save_path参数是通过get请求获取的,而这关是通过post请求获取的,get清求传递的参数后端会白动进行解码,但是post请求传递的参数后端不会自动解码,因此我们要对截断符%00进行url解码。

思路

与第十二关一样,但是这里的%00要进行一次url编码

操作

然后直接访问2.php就可以了,这里我的php版本有问题,5.2的一直下载不下来,所以无法演示,但是我想应该都懂了。

pass-14(文件头绕过)

可以看得出来,此关卡通过获取上传文件的内容的前两个字节来判断该文件的类型,简单来说就通过识别文件头来判断文件类型,我们只需修改文件头为图片格式的,例如gif文件头:GIF89A,就能实现绕过,

  1. cmd里面制作图片马。

  1. 或者直接二进制改木马的文件头。

思路

直接制作图片马然后上传一张图片马进行连接,但是图片马网站解析的是jpg文件,所以图片马生效需要要有文件包含漏洞,这一题正好有文件包含漏洞。

操作

pass=15(getimagesize 绕过)

这个主要是用getimagesize()函数检测是不是图片文件,

直接用第十四关的方法就可以直接绕过。第十四关本来是修改文件头,但是我直接上传图片马了,所以也行都是一样的,本关卡利用图片马及进行绕过。

pass-16(图片马绕过;exif_imagetyp)

exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快

和第十四关一样,步骤都是一样的

pass-17(二次渲染)

根据源码以及提示可以知道,网站对于图片进行了二次渲染。我们可以上传一个图片马,然后将上传的图片下载下来,发现后面的php一句话木马没有了,这就确定了网站进行了二次渲染。

这一关就没有前面几关简单了,他是会使用imagecreatefromjpeg()函数将我们的图片打散进行二次渲染,这就会导致我们的一句话木马消失,所以我们就要想办法在他没有打散的对方将我们的一句话写进去

思路

上传一个正常的照片,然后下载下来,查看下载下来的照片和原照片二进制之间的差别,看哪里没有渲染修改,将一句话木马写到没有渲染的地方。然后在上传以后,一句话木马就不会消失,不会渲染。

操作

红色的部分是渲染后更改的部分,所以我们将php一句话木马放在没有更改的地方

然后另存为一个图片马,然后上传本次修改的图片马,再利用文件包含漏洞进行解析。

但是上传的思路是没问题的,但是一直出现错误,我也试了其他的,都是一样的,我感觉是php版本的问题,但是我无法下载5.2的版本。

pass-18(条件竞争 逻辑漏洞)

本关卡主要是,逻辑有问题,代码中是先上传文件,然后再看文件的格式是否符合过滤,如果符合就留下来,不符合就删除,但是这样的话,就有一个问题,那就是在上传成功以后,我在服务器删除之前执行一次上传的恶意文件。这个恶意文件就是写入一个另外一个恶意文件,只要执行一次,就会成功写入一个恶意代码。

<?php
    fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>');
?>
//当访问 shell.php 时候 会创建 shell.php 并且写入 一句话木马

思路

  1. 首先一直发包,访问一个即将上传的包19.php。
  2. 然后一直发包,上传19.php的包
  3. 一旦访问的包有一个返回码200,就说明成功了。

操作

首先抓上传的包,发送到intruder模块中

这是访问的包。接下来是上传的包。

其他的和访问的包的设置一样。然后就是看着两个包只要访问的包有一个返回码是200,就说明成功了

然后就就是等访问的返回码出现200就行,然后我这里直接成功了getshell。

pass-19(apache解析漏洞+条件竞争)

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

这个 是 图片 还没有到 服务器里面 就会被 删掉 所以 第18关的思路 是不行的

上传一个图片,发现不是在upload目录下,而是在当前目录下。

思路

而apache框架 对.7z 才有 这样漏洞

如下代码规定了白名单后缀,这里要特别注意.7z这个后缀,这后缀浏览器是无法解析的,当浏览器遇到无法解析的后缀时,就会往前解析,要是我们上传文件名为3/

webshel.php.7z,那么浏览器就会解析.php后缀而不会解析.7z后缀

意思就是 如果 上传 1.php.7z 文件 是过滤不掉的 ,按正常 源码逻辑 1.php.7z 会被 修改为 随机数.7z 这个文件 不会被执行 但是 1.php.7z 是会被执行成 1.php 所以说 如果 在 文件被修改之前 成功访问了 1.php 那是不是 就能像第 18关一样自动生成一个小木马文件

操作:

重发

1.php.7z 里面 写入 生成小马的内容

其中的原理和十八关一样。就不再演示了,主要的区别就是有一个配合apache的解析漏洞。

pass-20(直接点绕过)

直接后缀加个点

pass-21(数组绕过)

漏洞原理

explode(a,b)函数以a为分割,把b转为数组。
reset()函数把数组内部指针移动到数组第一个元素,并返回值。
end() 把数组内部指针移动到数组最后一个元素,并返回值。
count()函数数组元素的数量。

漏洞来源:count()函数漏洞。

通过$file_name=reset($file)...$fle[count($file)-1];可以知道最终的文件名是由数组的第一个和最后一个元素拼接而成。如果是正常思维来讲,无论如何都是没有办法绕过的,但是有个地方给了一个提示。

这里有个判断,如果不是数组,就自己拆成数组,也就是说,我们是可以自己传数组进入的。

原理

现自定义一个数组 ar!,定义arr0]=1,arr{3]=2,此时count(arr)的值为2,则arr[count[arr]即为arr[2],但是ar[2]未定义,即为一个空值,若使用count()函数的本意是指向ar数组的最后一个元素,此时却指向arr[2],形成数组漏洞。

操作

  1. 首先上传 21.php 文件,然后进行抓包,发现save_name是利用_POST形式上传的,利用count()函数漏洞手动将 save_name改为数组形式,绕过白名单,并且合法化$image_path路径。

然后就直接绕过成功。

直接全部拿下!!!!个人观点,仅供参考

更多好用工具可以关注“胖虎学安全”,让我们一起从小白变成大神。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值