不安全的反序列化-攻击示例(一) admin 102210文章 87评论 2022年11月15日03:06:48评论86 views字数 2238阅读7分27秒阅读模式 在本节中,将用PHP、Ruby和Java反序列化的例子指导如何利用一些常见的情况,从而证明利用不安全的反序列化实际上比许多人认为的要容易很多。 如果能使用预先建立的小工具链,在黑盒测试中甚至可以做到这一点。 虽然许多试验和例子都是基于PHP的,但大多数利用技术对其他语言也同样有效。 如何识别不安全的反序列化? 不管是白盒还是黑盒测试,识别不安全的反序列化都相对简单。 在审计过程中,应该查看所有被传入网站的数据,并尝试识别任何看起来像序列化数据的内容。 如果知道不同语言使用的格式,就可以比较容易地识别出序列化的数据,接下来会通过PHP和Java序列化的例子来进行展示攻击的经过,一旦识别了序列化的数据,就可以测试是否可以控制它们。 PHP的序列化格式 PHP使用的是大部分人类可读的字符串格式,用字母代表数据类型,用数字代表每个条目的长度。 例如,考虑一个带有属性的用户对象: 当被序列化时,这个对象可能看起来像这样: ●O:4"User":具有4个字符类名"User"的对象 ●2:这个对象有2个属性 ●s:4:"name":第一个属性的键是4个字符的字符串"name" ●s:6"carlos":第一个属性的值是6个字符的字符串"carlos" ●s:10:"isLoggedIn":第二个属性的键时10个字符的字符串"isLoggedIn" ●b:1:第二个属性的值是布尔值"true" PHP序列化的本地方法是serialize()和unserialize(),如果能够访问源代码,应该从代码中的任何地方可以寻找unserialize()并进一步查验。 Java的序列化格式 有些语言,比如Java,使用二进制序列化格式,这就比较难以阅读。但如果知道如何识别一些迹象,仍然可以识别序列化数据。 例如,序列化的Java对象总是以相同的字节开头,这些字节以十六进制的方式编码,以Base64的方式编码为rO0。 任何实现了java.io.Serializable接口的类都可以被序列化和反序列化。如果拥有源代码的访问权限,注意任何使用了readObject()方法的代码,该方法用于从InputStream中读取和反序列化数据。 操纵序列化的对象 利用反序列化漏洞很容易,只需要更改序列化对象中的属性即可。 当对象状态被持久化时,可以研究序列化数据以识别和编辑感兴趣的属性值,然后可以通过反序列化过程将恶意对象传递到网站,这是反序列化利用的初始基本步骤。 广义上讲,在操纵序列化对象时,可以采取两种方式: 一是可以直接以字节流的形式编辑对象。 二是可以用相应的语言写一个简短的脚本,自己创建并序列化新对象。 在处理二进制序列化格式时,后一种方法往往更容易。 修改对象属性 在篡改数据时,只要攻击者保留有效的序列化对象,反序列化过程就会使用修改后的属性值创建服务器端对象。 一个简单的例子,考虑一个网站,它使用一个序列化的User对象在cookie中存储关于用户会话的数据,如果攻击者在HTTP请求中发现了这个序列化对象,他们可能会对其进行解码并找到以下字节流: "isadmin"属性显然是一个值得关注的点,攻击者可以简单地将属性的布尔值更改为1(true),重新编码对象,并用这个修改后的值覆盖他们当前的cookie。在孤立情况下,这没有任何影响。但是,假设网站使用这个cookie来检查当前用户是否具有访问某些管理功能的权限: 这段脆弱的代码将基于cookie中的数据(包括攻击者修改过的isAadmin属性)实例化一个User对象,同时并不会检查序列化对象的真实性,然后将该数据传递到条件语句中,在这种情况下,将允许攻击者轻松地进行提权。 这种简单的场景在野外并不常见,但是以这种方式编辑属性值是不安全的反序列化暴露攻击面的第一步。 场景试验-修改序列化对象: https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-objects 场景说明: 这个试验场景使用了基于序列化的会话价值,因此很容易受到提权的影响。 试验目的: 要完成这个试验,需要编辑会话cookie中的序列化对象,以利用这个漏洞并获得管理权限,然后删除carlos的账号。 试验提供了一个可登录的账号wiener:peter 攻击过程: ①用试验提供的用户wiener进行登录 ②登录后通过BurpSuite可以看到在账号页面包含了一个cookie,是用Base64进行编码的 ③把这个请求发送到Repeater,在Inspector面板中将"admin"属性的值从"b:0"修改成"b:1",点击"Apply changes"后重放这个请求,可以注意到返回的响应,包含了/admin的控制面板 ④再次修改这个请求,访问/admin,返回的响应包含/delete删除面板 ⑤再把这个请求的访问修改成/admin/delete?username=carlos,发送后成功删除用户,完成试验 服务器端请求伪造(SSRF)-概念梳理 文件上传漏洞-概念梳理 访问控制和权限提升漏洞-概念梳理 信息泄露漏洞-概念梳理 业务逻辑漏洞-概念梳理 命令注入攻击(上)目录遍历攻击(上) 身份验证漏洞-概念梳理 SQL注入攻击-检索隐藏的数据HTTP Host头漏洞攻击-概念梳理 原文始发于微信公众号(H君网安白话):不安全的反序列化-攻击示例(一) 点赞 https://cn-sec.com/archives/1409828.html 复制链接 复制链接 左青龙 微信扫一扫 右白虎 微信扫一扫
评论