0


CTFHUB-web-文件上传

1.前端验证

题目

document.getElementsByName

(关于它的用法可以参考JavaScript getElementsByName()方法介绍-CSDN博客)

file.lastIndexOf(".") 就是取file的扩展名

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

如果没有找到匹配的字符串则返回 -1

解读

代码大致的意思就是 :如果file为空或者无法确定,就会弹出“上传文件”

如果不是的话,就判断文件的 . 后面的扩展名是不是jpg、png或者gif不是就上传不上去

解题

现将.php更改扩展名

然后上传用brup抓包,将filename=“shell.jpg”改为filename="shell.php"

Content-Type= image/jpg 不变。

然后发包

上传成功,出现了一个上传的相对路径

然后关掉brup,我在一句话木马哪里加了个luck回显(判断木马存活与否)

之后就是用蚁剑连接了


2. .htaccess

.htaccess介绍

.htaccess是一个纯文本文件,存放着Apache服务器配置相关的指令。

.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。

.htaccess的用途范围主要针对当前目录。

注意:.htaccess文件(特别注意这里文件名不可随意更改,因为 .htaccess 是配置文件)

博主这里帮大家把坑踩了,蚁剑死活连不上的原因。

题目

解题

直接先上传 .htaccess文件 然后再上传一句话木马(但是得以禁用之外的文件类型)

.htaccess文件里面写的东西就是将shell.jpg这个文件里面的代码转换成php读取。

蚁剑连接 (直接连接就行了,url里面不要多带.htaccess,.htaccess已经上传了)

CTFHub题解-技能树-Web-文件上传(.htaccess、MIME绕过、文件头检查)【二】 - 0yst3r - 博客园 (cnblogs.com) 有另一种.htaccess的内容方法。


3.MIME绕过

介绍

这里的content-Type指定的就是上传的这个文件的MIME类型,若后台根据这个来判断文件类型,那就存在上传绕过的漏洞了

有些情况下,文件头检查可能也会包括对文件内容的检查,但这通常是在对文件进行解析或处理之后的额外步骤。例如,对于图像文件,可以检查文件的实际内容是否与文件扩展名或 MIME 类型相符,以确保上传的文件不会被误认为是其他类型的文件。

介绍:MIME(Multipurpose Internet MailExtensions)多用途互联网邮件扩展类型。
● 是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
● 多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
● MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
常见的MME类型,例如:
#text表明文件是普通文本
text/plain
text/html
#image表明是某种图像或者动态图(gif)
image/jpeg
image/png
#audio表明是某种音频文件
audio/mpeg
audio/ogg
audio/*
#video表明是某种视频文件
video/mp4
#application表明是某种二进制数据
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream

题目

解题

brup抓包修改content-type

然后会发现上传成功

然后蚁剑连接


4.文件头检查

题目

这道题查看源码没有线索,传php文件传不上去,然后修改MIME也没有传成功

只写了一句话木马的png显示文件错误。

绕过了后缀,但是还是绕不开检测,那应该就是对文件内容检测了

解题

这里需要学习制作一个图片木马

制作简单图片木马-CSDN博客

这里给不会dos的朋友参考 DOS中切换盘符基本常用三种用法,够用_dos切换盘符-CSDN博客

以 记事本打开,发现一句话木马写进去了。

开始用brup抓包修包

修改filenam=“mu.png”为filename=“mu.php”

然后回文件中更改扩展名

然后关掉brup后页面会有一个相对路径 upload/mu.png

连接蚁剑的注意点(博主尝试了很多次,踩的坑)

1.注意关掉什么火绒的等安全软件(真的忘记关了,浪费了好多时间 -_ -)

2.连接蚁剑的时候一定要修改url,不要写mu.png会连接不上

获取flag


  1. 00截断

什么是00截断?

信息安全中, 00截断 是针对 Web 应用程序的攻击技术。其英文名称 Null Byte 空字节,也称为空字节注入。攻击者在 URL 或文件名中插入一个空字节(ASCII码为00),用来截断文件扩展名或路径信息,达到绕过一些安全机制的目的。这种攻击方式通常是程序员开发过程中没有对输入数据进行过滤和验证。攻击者可以利用这种漏洞来执行恶意代码、窃取敏感信息等。

00截断攻击的原理主要基于应用程序对输入数据的处理不当。一些程序在处理文件名或其他数据时,可能会依赖于以

NULL

字节(ASCII码为0)作为结束符的终止字符串。当攻击者将

NULL

字节插入到文件名或数据块中时,应用程序可能会错误地将其之后的内容当做是截断,导致应用程序对文件名或数据块的处理出现了预期之外的行为。

截断原理:
0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测

  • 文件上传漏洞“%00截断”绕过讲解":文件上传漏洞“%00截断”绕过 - 付杰博客

0x00 , %00 , /00 之类的截断,都是一样的,只是不同表示而已。

在url中 %00 表示ascll码中的 0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。

比如:

https://xxx.com/upload/?filename=test.txt 此时输出的是test.txt

加上 %00

https://xxx.com/upload/?filename=test.php%00.txt 此时输出的是test.php

这样就绕过了后缀限制,可以上传webshell啦~

注:php版本要 小于5.3.4 ,5.3.4及以上已经修复该问题

题目源码

if (!empty($_POST['submit'])) {
    $name = basename($_FILES['file']['name']);
    $info = pathinfo($name);
    $ext = $info['extension'];                //首先取到上传文件的扩展名$ext
    $whitelist = array("jpg", "png", "gif");   //将扩展名与白名单进行匹配,为jpg、png或gif才能通过第一次过滤
    if (in_array($ext, $whitelist)) {
        $des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;   //扩展名匹配之后,为上传的文件构造了一个新的存储路径$des
        if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
            echo "<script>alert('上传成功')</script>";
        } else {
            echo "<script>alert('上传失败')</script>";
        }
    } else {
        echo "文件类型不匹配";
    }
}

$_FILES参数详解:
$_FILES["file"]["name"] – 被上传文件的名称
$_FILES["file"]["type"] – 被上传文件的类型
$_FILES["file"]["size"] – 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] – 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] – 由文件上传导致的错误代码

PHP basename() 函数 (w3school.com.cn)

PHP pathinfo() 函数 | 菜鸟教程 (runoob.com)

PHP move_uploaded_file() 函数 (w3school.com.cn)

PHP in_array() 函数 (w3school.com.cn)

得到的完整路径是 GET[‘road’]+随机数+日期加前面获得的后缀名

如果我们在这里的road参数后利用00进行截断,那后面的时间,随机数,后缀名就全部失效,我们自己设置的路径就是$des的值

move_uploaded_file($_FILES['file']['tmp_name'],$des)这个函数就是把上传文件放到$des的路径上并且改了文件名,而$des中的随机数,当前时间等无法确定,(也就没办法获得固定路径)那么,在$_GET[‘road’]后面进行00截断
payload:POST /?road=/var/www/html/upload/post.php%00 HTTP/1.1

解题

注意:连接蚁剑的时候,是shell.php的上传路径,前面的?road=删掉。

6.双写后缀

PHP str_ireplace() 函数 | 菜鸟教程 (runoob.com)

上传后发现,php被替代成空了

解题

不能在php之间随便插入php,要看过滤完的剩下字符能不能组成php,也不能连续写的话phpphp都会被替代空.

标签: web安全

本文转载自: https://blog.csdn.net/2301_79783285/article/details/135128749
版权归原作者 MESSIR22 所有, 如有侵权,请联系我们删除。

“CTFHUB-web-文件上传”的评论:

还没有评论