BUUCTF/Upload-Labs-Linux

题目

在这里插入图片描述

步骤

打开靶机地址

在这里插入图片描述

是一个上传漏洞的闯关靶场,我们直接从第一关开始

Pass-01

在这里插入图片描述

我们先查看提示

在这里插入图片描述

因为是在客户端检查,我们直接f12,将源码中检查的函数删除掉

在这里插入图片描述

创建一句话木马,并将木马文件上传至服务器

在这里插入图片描述

在这里插入图片描述

右键图片,选择复制图片链接,使用中国蚁剑连接

在这里插入图片描述

成功获取shell,在根目录下找到flag文件

在这里插入图片描述

获取flag内容

在这里插入图片描述

Pass-02

因flag已获取,后续闯关均以上传webshell成功为闯关目标

先查看提示

在这里插入图片描述

在服务端对MIME进行检查,可以通过Burp Suite抓取数据包并修改MIME参数绕过

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

它是一个互联网标准,扩展了电子邮件标准,使其能够支持:

非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。

常见的MIME类型:

文件上传multipart/from-data
超文本标记语言文本.htmltext/html
xml文档.xmltext/xml
XHTML文档.xhtmlapplication/xhtml+xml
jpg图片格式image/jpeg
RTF文本.rtfapplication/rtf
PDF文档.pdfapplication/pdf
Microsoft Word文件.wordapplication/msword

在这里插入图片描述

将Content-Type参数修改为:image/png后放包,上传成功

在这里插入图片描述

Pass-03

查看提示

在这里插入图片描述

不允许上传.asp|.aspx|.php|.jsp格式文件

但是在文件中存在等价扩展名

语言等价扩展名
aspasa,cer,cdx
aspxashx,asmx,ascx
phpphp2,php3,php4,phps,phtml
jspjspx,jspf

我们直接修改webshell的后缀为php2后进行上传,上传成功

在这里插入图片描述

Pass-04

查看提示

在这里插入图片描述

将大部分扩展名都加入了黑名单,并且查看源码,大小写也无法绕过

$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");
        $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后缀文件

.htaccess——超文本入口

.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

.htaccess文件内容
<FilesMatch "\.jpg">                               //如果匹配到.jpg 的文件 就执行该文件
       SetHandler  application/x-httpd-php         //把文件当成php的代码来解析
</FilesMatch>       

我们将webshell文件后缀改为jpg后连同.htaccess文件都上传至服务器,使用中国蚁剑链接

在这里插入图片描述

提示连接失败,经过查证是由于服务器http服务配置未更改导致,将None改为ALL即可,但是因未拥有权限,无法进行修改,本关卡不涉及提权操作。

在这里插入图片描述

我们可以尝试使用在文件后缀名末尾添加点-空格-点的方式绕过

在这里插入图片描述

上传成功

在这里插入图片描述

尝试用中国蚁剑连接,这里需要注意,因为在Linux系统中,文件名后缀可以带空格,所以实际上webshell文件的后缀是.php.空格

所以我们输入的地址应为

http://b3b730e2-9d3f-473f-a37a-3f50bf5315da.node5.buuoj.cn:81/upload/webshell.php.%20
//  %20代表空格

在这里插入图片描述

连接成功

Pass-05

在这里插入图片描述

查看提示,将.htaccess加入了黑名单

接着查看源码,发现未对后缀名大小写进行检查,将webshell后缀改为.PHP后即可上传成功

在这里插入图片描述

在这里插入图片描述

Pass-06

查看源码,未对后缀名空格进行去除,在后缀名后加入空格即可绕过

在这里插入图片描述

上传成功

在这里插入图片描述

Pass-07

查看源码发现没有去除后缀名后加的 . ,将webshell后缀名改为.php.即可绕过

strrchr()函数作用为查找字符串在另一字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符,本用来返回后缀名,如:webshell.php,则会返回.php,但是如果我们在.php后再加入一个 . ,则该函数只会返回 . ,可以轻松绕过检查

在这里插入图片描述

上传成功

在这里插入图片描述

Pass-08

查看源码发现没有对::DATA进行过滤,所以本关可以采用::DATA绕过

php在window的时候如果文件名+"::DATA"会把::DATA之 后 的 数 据 当 成 文 件 流 处 理 , 不 会 检 测 后 缀 名,且保持::DATA之前的文件名 他的目的就是不检查后缀名。ps:只能是Windows系统,并且只能是php文件

但是由于该关卡部署于Linux系统,故无法使用该方法,该关卡略过

Pass-09

查看源码,发现可以使用点+空格+点的方式绕过检测,和第四关一样

在这里插入图片描述

上传成功

在这里插入图片描述

Pass-10

查看源码发现并不是禁止黑名单后缀名,而是将黑名单后缀名过滤,可以考虑复写后缀来实现

在这里插入图片描述

上传成功

在这里插入图片描述

Pass-11

该关卡源码做了白名单限制,只允许上传jpg,png,gif类型文件,但是有个GET请求,可以通过%00绕过

原理是move_uploaded_file()方法遇到%00会截断,但是因为本靶机环境PHP版本大于5.3.4

在这里插入图片描述

故无法使用该方法,且该方法还需在PHP.ini中启动magic_quotes_gpc该功能

Pass-12

这关和11差不多,只是把get请求更换为了post请求,同样运用%00截断,但是得在HEX中修改

Pass-13

在这里插入图片描述

这关要求我们上传图片马,并运用文件包含漏洞来执行恶意代码

在这里插入图片描述

可以看到使用了include函数,后续可以通过该函数执行图片马

首先我们制作图片马,打开cmd终端输入以下命令

copy 777.png/b + webshell.php pass14.png
//777.png为图片的文件名
//webshell.php为木马的文件名
//pass14.png为合成后的图片马的文件名

在这里插入图片描述

随后将图片马上传到服务器

在这里插入图片描述

随后使用中国蚁剑连接,需要注意连接路径,使用该页面的文件包含漏洞

http://a492262b-844e-47b3-b210-7b98189dcf0d.node5.buuoj.cn:81/include.php?file=upload/9320240319002814.jpg

在这里插入图片描述

成功连接

Pass-14

查看源码,是通过getimagesize来检查是否为图片,依旧使用上传图片马,然后通过文件包含漏洞执行

在这里插入图片描述

Pass-15

这次换成使用exif_imagetype()读取文件的第一个字节并检查后缀名

依旧采用上传图片马的方法通关

Pass-16

此关将上传的图片进行了二次渲染,可能导致一句话木马失效

可以通过上传图片后,再下载回显的图片,对比找出Hex不变的部分,在该位置插入一句话木马,建议使用GIF格式的图片

首先我们上传一个gif图片

在这里插入图片描述

将上传后的被二次渲染的gif图片下载下来,并使用图片16进制查看器查看

可以发现这一部分内容是相同的

在这里插入图片描述

我们在这之中插入一句话木马

在这里插入图片描述

将gif文件再次上传

在这里插入图片描述

使用中国蚁剑连接

http://a492262b-844e-47b3-b210-7b98189dcf0d.node5.buuoj.cn:81/include.php?file=upload/2100350681.gif

在这里插入图片描述

成功连接

Pass-17

这关查看源码后发现,先允许上传任意文件,然后对比白名单检查上传的文件,如果不在白名单内则删除

文件的上传过程为:用户上传文件,服务器获取文件,然后保存临时文件,然后使用移动函数(比如php中的move_uploaded_file() ),才会将文件移动到站点的根目录下面

只要我们在非法文件被删除之前执行该文件,让其在服务器创建一个webshell即可

该原理也被称为文件上传竞争

首先创建一个php文件,该文件用来创建带有一句话木马的文件

在这里插入图片描述

将该文件上传,并使用burp suite抓包

在这里插入图片描述

设置有效载荷和选项

在这里插入图片描述

在这里插入图片描述

设置无限执行,且将线程设置大一点

然后编写一个python脚本去一直访问该文件,如果成功则返回ok并停止

import requests
url = "http://a492262b-844e-47b3-b210-7b98189dcf0d.node5.buuoj.cn:81/upload/pass-17.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print('OK')
        break

在执行步骤时,本人未成功,因为该站点设置了访问流量限制,访问过多时会失败,所以未继续进行,思路是没问题的

Pass-18

这关作者的代码有失误,文件的上传地址不是upload/而是变成了upload,后面直接接了文件名,这个需要注意

查看源码后发现这关对文件后缀名进行了限制,其他和17关相同,可以通过上传图片马来进行文件上传竞争

Pass-19

这关发现多了个设置保存后的文件名

在这里插入图片描述

并且通过源码知道只对用户输入的文件名有黑名单判断,名称保存使用upload-19.php.即可

在这里插入图片描述

Pass-20

这一关先查看源码

1.先检查了MIME类型,设置了白名单

2.检查了save_name,如果为空则 f i l e 为 f i l e n a m e ,如果不为空则 file为file_name,如果不为空则 filefilename,如果不为空则file为save_name

3.检查$file是否为数组,如果不为数组的话则以.为分界线划分为数组,例如webshell.php被划为[‘webshell’,'php]数组

4.检查$file数组最后一位,设置了白名单为’jpg’,‘png’,‘gif’

5.文件命名规则为$file数组第一个元素 + ‘.’ + $file[元素个数-1]

根据以上条件我们可以构建一个save_name达成绕过检测及可执行的目的

比如[‘webshell’,‘’,‘jpg’]

在burp suit中抓包,先修改MIME类型,然后修改save_name为数组,并设置元素

在这里插入图片描述

绕过所有检测,并且最终命名为upload-20.php + ‘.’ + f i l e [ 里面只有两个元素,虽然下标写到了 2 , 2 − 1 = 1 ] ,但是 file[里面只有两个元素,虽然下标写到了2,2-1=1],但是 file[里面只有两个元素,虽然下标写到了221=1],但是file[1]没有元素,所以为空,最终文件名为upload-20.php.

在这里插入图片描述

使用中国蚁剑连接

在这里插入图片描述

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值