深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

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

文章源自-投稿

作者-挽梦雪舞

扫描下方二维码进入社区

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

继续我们上次的讨论,我们聊到了PHP的反序列化如何导致漏洞,以及攻击者如何利用POP链来实现RCE攻击。

 

今天我们接着讨论攻击者利用unserialize() 漏洞的其他骚操作。那么即使无法进行RCE攻击,攻击者仍可以使用该漏洞来实现身份验证绕过和SQL注入。

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

一、先来谈谈身份验证绕过:

除了RCE攻击,unserialize() 通常还被用于绕过应用程序的身份验证控制。目前我了解到的

有两种方法可以做到这一点:

 

1.通过控制用作访问控制的对象属性。

2.利用类型混淆问题来欺骗应用程序。

 

但是要注意这两种方法都取决于最终用户可以控制传递给unserialize()的对象的情况。

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

二、通过控制对象属性来绕过身份验证

其中,攻击者利用反序列化漏洞中最简单最常见的方法之一是控制对象属性来绕过身份验证,示例代码如下:

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

我们假设应用程序在注册过程中调用了一个名为User的类来传递用户数据,用户来填写一个表格,数据将通过序列化后的User对象传递给后端。

 

最终用户控制User对象,然后可以像下面这样简单地操作对象,并注册为admin。

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

三、使用类型变戏法(type juggling)绕过身份验证

这里继续介绍攻击者利用反序列化漏洞实现身份验证绕过的另一种方法:利用PHP的类型处理功能。

 

由于攻击者可以完全控制传递到应用程序中的对象,因此他还可以控制对象属性的变量类型。然后控制属性的变量类型来控制PHP输入变量,从而绕过访问控制。

 

例如这是应用程序用于登录admin的代码:

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

那么对于上面的代码,攻击者可以提交如下的POST,以admin身份登录:

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

此时,当 (0 == “Admin_Password”) 在PHP中计算为True时,开始执行。而当PHP用于比较不同类型的变量时,它将尝试将它们转换为通用变量类型。在这种情况下, “Admin_Password” 将转换为整数0,此时 (0 == “Admin_Password”)与 (0 == 0) 等价。

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

四、SQL注入

如果条件允许,unserialize() 漏洞也可能导致SQL注入。下面是一个如何利用它的示例。

> 相关详细文献参考文末链接

 

这里具体谈下使用POP链实现SQL注入,假设某个应用程序在代码中的某处执行了此操作:

 

它定义了Example3类,并且从POST参数数据中反序列化了未经处理的用户输入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

__toString() 是一个 magic 函数,对于它的用法,当将一个类视为字符串时会被调用。在这种情况下,将Example3实例视为字符串时,它会返回obj属性getValue() 的结果。

 

不仅如此,继续假设我们在应用程序中某处还定义了类SQL_Row_Value。它具有一个名为getValue() 的方法,并执行一个SQL查询。具体讲,SQL查询从SQL_Row_Value实例的 _table属性获取输入。

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

进行到这里已经到尾声了,攻击者可以通过控制实现SQL注入 obj到Example3:

下面提供的示例代码将会创建一个Example3与obj集到SQL_Row_Value,同时用_table设置为字符串“SQL Injection”

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

这样,只要将攻击者的Example3实例视为字符串,就会执行$ obj的get_Value()。攻击者现在可以限制SQL的注入,因为他可以控制传递到SQL查询 “SELECT * FROM {$this->_table} WHERE id = “ . (int)$id;

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

References:

图源自互联网

https://owasp.org/www-community/vulnerabilities/PHP_Object_Injection

https://owasp.org/www-community/attacks/SQL_Injection

https://medium.com/@vickieli/diving-into-unserialize-pop-chains-35bc1141b69a

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

通知!

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

深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

记得扫码

关注我们

本文始发于微信公众号(字节脉搏实验室):深入 unserialize() 函数之RCE漏洞身份验证绕过及注入

发表评论

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