在本节中,将用PHP、Ruby和Java反序列化的例子指导如何利用一些常见的情况,从而证明利用不安全的反序列化实际上比许多人认为的要容易很多。
如果能使用预先建立的小工具链,在黑盒测试中甚至可以做到这一点。
虽然许多试验和例子都是基于PHP的,但大多数利用技术对其他语言也同样有效。
修改数据类型
在上一节中介绍了如何修改序列化对象中的属性值来进行反序列化攻击,也可以通过修改意想不到的数据类型来完成此类攻击。
基于PHP的逻辑,在比较不同数据类型时,由于松散比较运算符(==)的行为,特别容易受到这种操作的影响。
例如,如果在整数和字符串之间执行松散比较,PHP将尝试把字符串转换为整数,这意味着5=="5"的计算结果为true。
当一个字符串与整数0进行比较时这就会变得更加奇怪了:
为什么结果是true?因为字符串中没有数字,也就是说,0个数字,PHP将整个字符串视为整数0。
考虑这样一种情况,该松散比较运算符与来自反序列化对象的用户可控数据一起使用,这可能会导致严重的逻辑缺陷:
假设一个攻击者修改了密码属性,使其包含整数"0"而不是预期的字符串。只要存储的密码不是以数字开头,该条件就会一直返回真,从而实现认证绕过。
不过注意,这只是因为反序列化时保留了数据类型,如果代码直接从请求中获取密码,"0"将被转换为字符串,条件评估为假。
当修改任何序列化对象格式中的数据类型时,务必更新序列化数据中的任何类型标签和长度指示符,否则序列化的对象将被破坏,并且不会被反序列化。
场景试验-修改序列化数据额类型:
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-data-types
场景说明:
这个试验场景使用了基于序列化的会话机制,因此很容易被认证绕过。
试验目的:
要完成这个试验,需要编辑会话cookie中的序列化对象,以访问管理员账户,然后删除carlos的账号。
试验提供了一个可登录的账号wiener:peter
攻击过程:
①用试验提供的用户wiener进行登录
②登录后通过BurpSuite可以看到在账号页面包含了一个cookie,是用Base64进行编码的
③把这个请求发送到Repeater,在Inspector面板中做如下更新:
●将"username"的长度属性设为13,跟后面的用户名长度对应
●将"username"的内容改为administrator
●修改"access_token"后面数据的类型,将"s"改为"i",表示后面的内容是整形
●将"access_token"后数据长度改为0
点击"Apply changes"后重放这个请求。
④可以注意到返回的响应,包含了/admin的控制面板,已经获取到administrator权限了
⑤再次修改这个请求,访问/admin,返回的响应包含/delete删除面板
⑥再把这个请求的访问修改成/admin/delete?username=carlos,发送后成功删除用户,完成试验
试验小结:
如果处理的是二进制格式,可以通过BApp商店使用Hackvetor插件。这个插件可以帮助我们把序列化的数据修改成字符串,然后自动更新二进制数据,相应地调整偏移量,可以节省大量的手动工作。
使用应用程序功能
除了简单地检查属性值,网站的功能也可能对来自反序列化对象的数据执行危险的操作。
在这种情况下,可以使用不安全的反序列化来传入意外数据,并利用相关功能进行破坏。
例如,作为网站“删除用户”功能的一部分,通过访问$user->image_location属性中的文件路径来删除用户的头像。如果这个$user是从一个序列化的对象创建的,则攻击者可以通过将image_location设置为任意文件路径的修改对象传入来利用此漏洞,删除他们自己的用户账户也可以删除这个任意文件。
场景试验-使用应用程序功能来利用不安全的反序列化:
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-application-functionality-to-exploit-insecure-deserialization
场景说明:
这个试验场景使用了基于序列化的会话机制,某项功能对序列化对象中提供的数据调用了一个危险的方法。
试验目的:
要完成这个试验,需要编辑会话cookie中的序列化对象,并使用它来删除carlos主目录中的morale.txt文件。
试验提供了一个可登录的账号wiener:peter以及备用账户gregg:rosebud
攻击过程:
①用试验提供的用户wiener进行登录,登录后可以看到有个"Delete account"的按钮
②点击后账号就被删除了,同时账号相关联的目录也会被删除掉,通过BurpSuite抓包来分析下cookie
③随后用另一个gregg备用账号登录,登录成功后将/my-account的请求包发送给Repeater,在Inspector中修改cookie,将"avatar_link"属性中的路径修改成"/home/carlos/morale.txt",注意下字段长度,修改完毕后点击"Apply changes"
④将这个请求从GET修改成POST,并访问/my-account/delete,在删除这个账号的同时会删除/home/carlos/morale.txt这个文档,完成试验
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):不安全的反序列化-攻击示例(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论