[SUCTF 2019]CheckIn1-BUUCTF-xing

本文讲述了如何通过PHP函数exif_imagetype绕过文件类型检查,利用user.ini进行自定义配置,成功上传恶意脚本。作者描述了如何构造payload,使用GIF文件头和auto_prepend_file设置,以及后续的URL构造和旗标获取过程。
摘要由CSDN通过智能技术生成

----各位大神求给小弟点个关注,评论一下,我会持续分享资源给大家的------

题目知识点:

        1. exif_imagetype 是一个用于判断图像类型的 PHP 函数。该函数读取图像的第一个字节并检查其签名,以确定图像的类型。它返回一个对应的常量,如果发现了恰当的签名,否则返回 FALSE

        2.

user.ini 文件是一个文本文件,通常用于配置 PHP 应用程序的参数和设置。它通常位于 PHP 安装目录的根目录下,或者在特定的网站目录下。user.ini 文件包含了 PHP 的配置选项和值,每个选项和值都以等号(=)分隔。

user.ini 文件可以被视为一个用户自定义的 php.ini 文件。PHP 的默认配置文件是 php.ini,其中包含了大量的配置选项和值,用于控制 PHP 的行为和功能。但是,有时候我们可能需要根据自己的需求来修改或添加一些配置选项,这时就可以使用 user.ini 文件来覆盖或添加一些配置项。

使用 user.ini 文件的好处是它可以在不修改 php.ini 文件的情况下,为特定的 PHP 应用程序提供自定义的配置。这样可以避免对全局的 php.ini 文件进行修改,从而避免了潜在的冲突和问题

解题:

打开题目是一个文件上传,那么就想到了一句话木马于是上传php木马后缀为jpg

提示说不可以有<?那么可以使用幻头术该文件头然后用这个木马上传jpg然后在bp上修改后缀为ptml的文件再传也不行所以看大佬的wp知道了php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:
PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER

而user.php是用户自定义的php.ini并且在php配置项有两个选项

auto_prepend_file和auto_append_file一个是文件前插入一个是文件后插入这里我们使用文件前插入构造playload-----gif的文件头为GIF89a

然后上传成功!

至此在构造一个script格式为jpg

这里可以看到  uploads/33c6f8457bd77fce0b109b4554e1a95c 对应的文件夹下面有两个文件,一个是 .user.ini, 还一个是shell.jpg ,当然,还有一个 index.php 。那就可以构造URL了并用蚁剑连接一下:
 原地址/uploads/adeee0c170ad4ffb110df0cde294aecd/index.php

得出flag=

flag{877b66a3-cd3b-4a5b-b3c4-14c8e84c50c9}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
959 -n=AT4257 3:report 其中,checkin命令表示车辆进入停车场,需要记录时间和车牌号;checkout命令表示车辆离开停车场,需要记录时间和车牌号,并计算停车时间和费用;report命令表示生成停车场使用报告,包括停车总量、停车总时长、总收入等信息。 以下是实现代码: ```javascript const readline = require('readline'); // 定义停车场类 class ParkingLot { constructor() { this.records = {}; // 停车记录 this.totalCount = 0; // 停车总量 this.totalTime = 0; // 停车总时长 this.totalIncome = 0; // 总收入 } checkin(time, plateNumber) { if (this.records[plateNumber]) { console.log(`${plateNumber}已经在停车场内`); return; } this.records[plateNumber] = { checkinTime: time }; this.totalCount++; console.log(`${plateNumber}进入停车场,时间为${time}`); } checkout(time, plateNumber) { if (!this.records[plateNumber]) { console.log(`${plateNumber}不在停车场内`); return; } const record = this.records[plateNumber]; const checkinTime = record.checkinTime; const duration = time - checkinTime; // 停车时长 const cost = Math.ceil(duration / 1000 / 60) * 2; // 停车费用 delete this.records[plateNumber]; this.totalTime += duration; this.totalIncome += cost; console.log(`${plateNumber}离开停车场,停车时长为${duration}ms,停车费用为${cost}元`); } report() { console.log(`停车总量:${this.totalCount}`); console.log(`停车总时长:${this.totalTime}ms`); console.log(`总收入:${this.totalIncome}元`); } } // 初始化停车场 const parkingLot = new ParkingLot(); // 监听命令行输入 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', (input) => { const [command, options] = input.split(' '); const args = {}; options.split('-').slice(1).forEach((option) => { const [key, value] = option.split('='); args[key] = value; }); switch (command) { case 'checkin': parkingLot.checkin(args.t, args.n); break; case 'checkout': parkingLot.checkout(args.t, args.n); break; case 'report': parkingLot.report(); break; default: console.log('无效命令'); } }); ``` 使用方法: 在命令行中运行以上代码,然后输入命令即可,例如: ``` checkin -t=225959 -n=AT4257 checkout -t=233959 -n=AT4257 report ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值