一文带你用魔术方法开启RCE链

  • A+
所属分类:安全文章

文章源自-投稿

作者-挽梦雪舞

扫描下方二维码进入社区

一文带你用魔术方法开启RCE链

今天我们继续深入unserialize(),接着上文,我们已经讨论过PHP的反序列化如何导致漏洞,以及攻击者如何利用它来实现RCE攻击,现在让我们更深入地研究一些可以用来实现RCE的骚操作。

 

先对unserialize()漏洞原理整体认识一下:

 

当攻击者控制传递给 unserialize() 的序列化对象时,他便可以控制所创建对象的属性。然后,通过控制传递给__wakeup() 之类函数的魔术方法的值,从而让攻击者有机可乘,他们可能以此来劫持应用程序流。

 

然后,攻击者可以使用其指定的参数执行魔术方法中包含的恶意攻击代码,或将魔术方法用作启动POP链的一种方式。

一文带你用魔术方法开启RCE链

一文带你用魔术方法开启RCE链

魔术方法:

尝试利用unserialize() 漏洞时,具体有四种魔术方法特别有用:__wakeup()  __destruct() __toString() 和 __call()。今天,笔者来讨论一下它们具体是什么,本质原理,他们能用来做什么,以及为什么它们对构建漏洞有用。

一文带你用魔术方法开启RCE链

__wakeup()

__wakeup() 是在unserialize() 上调用的魔术方法。它通常用于重新构建序列化过程中可能丢失的任何数据库链接,并执行其他重新初始化任务。

 

在unserialize() 漏洞利用期间, 它通常对攻击者很有帮助,因为如果为类定义它,则在对象反序列化中会自动调用它。因此,它便会为POP链提供一个便利的数据库或代码中其他功能的入口点,从而让攻击者有利用的可能。

一文带你用魔术方法开启RCE链

__destruct()

但是,当不存在对反序列化对象实例的引用时,将会调用__destruct()。它在进行垃圾回收时调用,通常用于清理并执行完结与该对象关联的其他未完成的任务线程。

 

由于它用于清理资源和关闭的功能,因此我们可以发现__destruct() 在利用方面还包含有用的代码。例如,如果__destruct() 魔术方法包含用于删除和清除与对象关联的文件的代码,则这可能使攻击者有机会利用,从而破坏文件系统的完整性。

一文带你用魔术方法开启RCE链

__toString()

与上述的 __wakeup() 和__destruct() 不同,只有当将对象视为字符串时才调用 __toString()魔术方法,这一点从该函数的命名上可以看出,尽管如此,但如果为该类定义了 __toString()方法,它很可能会在某个地方被使用。

 

__toString() 魔术方法允许一个类来决定当它被作为字符串处理时,它会如何执行。例如,如果将对象传递给echo() 或print()函数,可能会打印的内容。

 

这种魔术方法的可利用性根据实现方式的不同会存在很大差异。例如,下面是一个__toString()函数,可用于开启POP链:

一文带你用魔术方法开启RCE链

一文带你用魔术方法开启RCE链

在这种情况下,将Example3实例视为字符串时,它会返回其$obj属性的getValue() 魔术方法的执行结果。并且由于$ obj属性可能完全在攻击者的控制之下,这可能使攻击者具有很大的权限和灵活性执行其他恶意操作,并且导致严重的漏洞。除此之外,__toString() 通常也可以用来访问敏感文件。

一文带你用魔术方法开启RCE链

__call()

__call() 该方法是在未定义时被调用。例如,调用$object->undefined($args)时,将变成$object->__call(‘undefined’, $args),

同样,此魔术方法的可利用性根据实现方式的不同也存在很大差异。但是,在不安全的反序列化入口点之后开启POP链时,会发现它有更大的利用空间。

一文带你用魔术方法开启RCE链

总结:

尽管这四种魔术方法是最常用的,但是还有许多其他方法可用于利用unserialize()漏洞。

一文带你用魔术方法开启RCE链

一文带你用魔术方法开启RCE链

如果上述四种方法不可用,可以尝试检查该类对其他魔术方法的实现,以及是否可以在某处开启利用链。

一文带你用魔术方法开启RCE链

References:

图源互联网,侵删

https : //www.php.net/manual/zh/language.oop5.magic.php

https://medium.com/swlh/diving-into-unserialize-magic-methods-386d41c1b16a

https://www.owasp.org/index.php/PHP_Object_Injection

一文带你用魔术方法开启RCE链

通知!

公众号招募文章投稿小伙伴啦!只要你有技术有想法要分享给更多的朋友,就可以参与到我们的投稿计划当中哦~感兴趣的朋友公众号首页菜单栏点击【商务合作-我要投稿】即可。期待大家的参与~

一文带你用魔术方法开启RCE链

记得扫码

关注我们

本文始发于微信公众号(字节脉搏实验室):一文带你用魔术方法开启RCE链

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: