前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入unserialize()之POP链漏洞利用构造

深入unserialize()之POP链漏洞利用构造

作者头像
字节脉搏实验室
发布2020-10-09 10:26:26
1K0
发布2020-10-09 10:26:26
举报
文章被收录于专栏:字节脉搏实验室

上次我们讨论了如果PHP的 unserialize() 函数让攻击者控制用户的输入,它将导致严重的漏洞,重温下大致概念,简单讲就是当攻击者控制传递给unserialize() 的序列化对象时,他可以控制所创建对象的属性。然后,通过控制传递给 _wakeup() 之类的magic方法的值,让攻击者有机会劫持应用程序流。

但是这方法也非百试百灵,举个栗子:如果该类声明的magic方法在开发方面不包含任何有用的代码,那该怎么办呢?很可惜攻击者还有其他方法,即使magic方法本身无法被利用,攻击者仍可能使用称为POP链的东西造成严重破坏。

POP 代表面向属性的编程,该名称来自于攻击者可以控制反序列化对象所有属性的事件。为了更好理解,他类似于ROP攻击(面向返回的编程),POP链通过将攻击代码脚本链接在一起来工作,以实现攻击者的最终目标。

> 关于POP学习的知识,可以参阅文末链接。

到这里,我们提到了POP链使用magic方法作为初始脚本,然后再调用其他脚本。发个例子仅供参考:

在示例中,可以看到我们定义了两个类:Example和CodeSnippet

其中 Example具有一个名为obj的属性,当对Example对象进行反序列化时,将调用其_wakeup() 函数,并调用obj的validate () 方法。

CodeSnippet 类具有一个名为code的属性,该属性包含要执行的代码字符串,以及一个validate() 方法,该方法对字符串调用 eval()。接下来,该程序会从用户那里获取POST参数数据,然后对数据调用unserialize()。

这些准备工作完成后,攻击者可以使用以下代码来生成注入的序列化对象:

接着我来解释下该代码块的作用:

1.定义一个名为CodeSnippet的类,并将其代码属性设置为“ phpinfo();”

2.定义一个名为Example的类,并在实例化时将其obj属性设置为新实例,再将其设置为新的CodeSnippet实例。

3.创建一个Example实例,将其序列化。

然后,攻击者可以将生成的字符串输入到POST参数数据中,接下来程序开始执行:

1.反序列化对象,创建一个Example实例。

2.调用_wakeup()函数,将obj属性设置为CodeSnippet实例。

3.调用 obj 的evaluate() ,运行eval(“phpinfo();”)

现在,通过上面的方法,攻击者可以通过POP链接和调用应用程序代码库中的代码来实现RCE攻击。

References:

https://blog.szfszf.top/tech/php-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96pop%E9%93%BE%E7%9A%84%E6%9E%84%E9%80%A0%E4%B8%8E%E7%90%86%E8%A7%A3/

http://redteam.today/2017/10/01/POP%E9%93%BE%E5%AD%A6%E4%B9%A0/

https://medium.com/swlh/diving-into-unserialize-more-than-rce-d48d371db7da

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档