PHP反序列化漏洞

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一.PHP的序列化和反序列化

(1).作用

PHP的序列化和反序列化是PHP中用于存储或传输PHP的值的一个过程。序列化是将变量转换为可存储或传输的字符串的过程,而反序列化则是将这些字符串转换回PHP变量的过程。这两个过程在PHP开辟中非常有用,特殊是在需要保存对象状态、进行深拷贝或在网络间传输复杂数据结构时。
(2).序列化实列

当序列化一个对象时,PHP会保存对象的类名、对象的所有属性(包罗私有和受保护的属性),以及这些属性的值。但是,不会保存对象的方法(即类的函数)。这是因为PHP的序列化机制紧张是用于保存对象的状态,而不是行为。
  1. class MyObject {  
  2.     public $var1 = 'Hello World!';  
  3.     protected $var2 = 'Protected var';  
  4.     private $var3 = 'Private var';  
  5.   
  6.     function showVars() {  
  7.         echo $this->var1 . "\n";  
  8.         echo $this->var2 . "\n";  
  9.         echo $this->var3 . "\n";  
  10.     }  
  11. }  
  12.   
  13. $obj = new MyObject();  
  14. $serialized = serialize($obj);  
  15. echo $serialized;
复制代码
输出
  1. O:8:"MyObject":3:{s:5:"var1";s:12:"Hello World!";s:8:"*var2";s:13:"Protected var";s:10:"MyObjectvar3";s:10:"Private var";}
复制代码
这里,O表示对象,8是类名的长度,MyObject是类名,3是对象属性的数量。每个属性都表示为s(字符串类型)后跟属性名、长度和值。对于受保护和私有属性,PHP在属性名前添加了前缀(*对于受保护属性,以及类名和var前缀对于私有属性)来确保它们在反序列化时可以大概正确地映射回原始对象。
(3).反序列化

反序列化是序列化的逆过程,即将序列化的字符串转换回PHP的原始数据结构。PHP提供了unserialize()函数来实现这一功能。
  1. $serializedData = 'O:8:"MyClass":1:{s:7:"myValue";s:5:"Hello";}';  
  2. $object = unserialize($serializedData);  
  3.   
  4. // 假设 MyClass 有一个公共属性 myValue  
  5. echo $object->myValue; // 输出: Hello
复制代码
在上面的例子中,$serializedData 是一个序列化的字符串,它表示一个名为 MyClass 的对象,该对象有一个名为 myValue 的公共属性,其值为 "Hello"。通过 unserialize() 函数,我们可以大概将这个字符串转换回原始的 MyClass 对象。
二.PHP反序列化漏洞

(1).原理

PHP 的 serialize() 函数用于将 PHP 值(包罗数组和对象)转换成可存储或传输的字符串。相反,unserialize() 函数则用于将这些字符串转换回原始的 PHP 值。然而,如果 unserialize() 被用于处理恶意构造的序列化字符串,它可能会实例化未预期的类、调用未授权的方法或执行其他危险利用。
攻击者可以通过构造一个特制的序列化字符串,该字符串在反序列化时会触发某些有害的行为,如执行任意代码、修改应用程序的状态或泄露敏感信息。
(2).pikachu靶场练习



我们可以实验反序列化一个XSS攻击
  1. O:1:"S":1:{s:4:"test";s:25:"<script>alert(1)</script>";}
复制代码
  1. O:1:"S":1:{s:4:"test";s:39:"<script>alert(document.cookie)</script>";}//弹出cookie
复制代码
(3).防御


  • 输入验证

    • 对所有输入数据进行严格的验证,确保它们符合预期的格式和类型。在反序列化之前,检查输入数据是否确实是有效的序列化字符串。
    • 利用正则表达式或其他验证方法来检查序列化字符串的格式是否正确,但请注意,这种方法可能无法完全防止所有类型的攻击,因为序列化字符串的格式相对复杂且可以构造出绕过简单验证的恶意数据。

  • 利用安全的替代方案

    • 如果可能,制止利用unserialize()函数,而是寻找更安全的替代方案来存储和传输数据。例如,可以利用JSON、XML或其他格式来编码数据,并利用相应的解析函数来处理它们。
    • 对于需要存储复杂数据结构的情况,可以思量利用数据库或其他数据存储系统来管理这些数据,而不是将它们序列化为字符串。

  • 限制反序列化的利用

    • 仅在绝对必要时才利用unserialize()函数,并只管减少其利用范围。制止在不受信任的数据上调用unserialize()。
    • 如果必须利用unserialize(),请确保在受控的环境中执行它,并限制可以反序列化的类。可以利用allowed_classes选项(在PHP 7.0.0及以上版本中可用)来指定允许反序列化的类。

  • 更新和修补

    • 定期更新PHP及其相干组件到最新版本,以获取最新的安全补丁和修复。
    • 监控与PHP反序列化漏洞相干的安全公告和漏洞报告,以便在发现新漏洞时及时接纳行动。

  • 利用自定义的反序列化函数

    • 如果需要更细粒度的控制,可以编写自定义的反序列化函数来替代unserialize()。在自定义函数中,可以添加额外的验证和清理步调来确保数据的安全性。

  • 日志和监控

    • 对所有反序列化利用进行日志记录,以便在发生非常时可以大概追踪和调查。
    • 监控应用程序的性能和非常行为,以便及时发现和响应潜伏的安全威胁。

  • 安全编码实践

    • 遵照最佳的安全编码实践,如最小权限原则、错误处理和日志记录等。
    • 对开辟人员进行安全培训,提高他们对安全漏洞的认识和防范能力。

请注意,这些防御措施并不是孤立的,而是应该相互结合利用,以形成一个全面的安全防御体系。此外,随着PHP及其相干组件的不断发展,新的安全漏洞和攻击技术可能会出现,因此连续关注和更新安全策略是非常紧张的。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表