web应用安全自学指南
b站搜sec875
参考资料:https://www.youtube.com/watch?v=ZBi8Qa9m5c0
参考资料:https://github.com/redhuntlabs/Awesome-Asset-Discovery github安全类主题
参考资料:https://portswigger.net/web-security/all-materials burpsuite工具开发公司出品的教学参考资料:微信公众号:山丘安全攻防实验室,DeadEye安全团队,安全江湖,农夫安全团队,更多公众号在github搜安全公众号
红盟抖音学习交流群:931496577
本笔记为kali linux高级渗透测试第三课的补充部分。本次课程讲解web应用安全的知识点,视为如下图中b站系列视频的知识补充与跟进。只计划在这周四直播课程中花半个小时普及一下,主要引导大家去哪里获取教学与知识。
不安全的反序列化(抛砖引玉)带大家读burp官网教学的一节,其余部分感兴趣的可以全学。
- 序列化 What is serialization?
我们想象一个文件,在网络上是直接整个的发,还是切分为几组的发好一点呢?
当然是将它们分割好,按照一定的顺序和序列和队列这些类似的词语来发送比较好啦。
序列化是将复杂的数据结构(例如对象及其字段)转换为“更扁平”格式的过程,该格式可以作为字节顺序流发送和接收。
- 将复杂数据写入进程间内存,文件或数据库;通过网络,在应用程序的不同组件之间或在API调用中发送复杂的数据
可能会提的问题,什么是数据结构?
想象一下,计算机中只认识二进制0和1,对于字母,数字和字符有ASCII码,utf国际标准码把现实中的字母,数字和字符转换成0和1。除此之外,还有数组,堆栈,链表,图片,散列表,队列,对象,属性等,它们在转变成二进制时,中间会进行各种的运算与处理,然后存到硬件里,当取出来或者查询时计算机还能认识它们并复原它们吗?变成二进制以后,如何存储它们,如何组织它们,最后取出来还认识它们,逻辑上不失真,就是数据结构讲述的事情。
反序列化当然就是把字节流还原好,变成“从前的那个东西啦”
对于网站而言。用户在使用网站过程中所产生的一切数据,变成序列化发过去了。网站后台程序反序列化把它们读出来。
- 什么是不安全的反序列化?
攻击者能够操纵序列化的对象,将有害数据传递到web应用程序代码中。
更加粗暴,网红式的理解方式:总之,用户这边填的数据变成二进制字节流发给网站后台程序了,后台再把它还原出来进一步识别与处理。
- 不安全的反序列化漏洞如何产生?
理想情况下,用户输入绝对不应反序列化。
- 不安全的反序列化有何影响?
不安全的反序列化的影响可能非常严重,因为它为大规模增加攻击面提供了切入点。通常是远程执行代码。
- 如何利用不安全的反序列化漏洞
注意:尽管许多实验和示例都是基于PHP的,但是大多数利用技术对其他语言也同样有效。
注意:尽管在这里使用的词语是序列化,同样类似的描述在其他语言中,比如ruby,python,可能就叫作封送,酸洗,腌制。。反正都是加一道工,变成字节流的不同叫法。
- 如何识别不安全的反序列化
在审核期间,您应该查看传递到网站的所有数据,并尝试识别任何看起来像序列化数据的内容。这需要我们提前知道并学习好,各种语言的序列化长得啥样才能在所有数据中找到它们。
- 操作序列化对象
利用一些反序列化漏洞可以像更改序列化对象中的属性一样容易。随着对象状态的持久化,您可以研究序列化的数据以识别和编辑有趣的属性值。然后,您可以通过反序列化过程将恶意对象传递到网站中。这是基本反序列化利用的第一步。(这里说的是在有数值的情况下,进行篡改)
广义上讲,在处理序列化对象时可以采用两种方法。您可以直接以对象的字节流形式对其进行编辑,也可以使用相应的语言编写简短的脚本来自己创建和序列化新对象。使用二进制序列化格式时,后一种方法通常更容易。
这里需要一种我们熟悉的场景来理解新的知识:想象一下去财务部拿钱的方式为报自己的姓名,你对此安全有点疑惑,财务部怎么可能根据每个人的姓名认识到每个人呢?(这里假设财务部没有根据姓名去电脑中调取相关个人信息),然后你突发奇想的,无中生有出来一个人名(自己创建了一个新的序列化对象),对着财务部说,我叫秦始皇,拿十万报销费。然后,就恭喜你发现了财务部的漏洞,直接提款给你了。
- 修改对象属性
当篡改数据时,只要攻击者保留有效的序列化对象,反序列化过程将创建具有修改后的属性值的服务器端对象。
举一个简单的例子,考虑一个使用序列化User
对象的网站,该网站将有关用户会话的数据存储在cookie中。如果攻击者在HTTP请求中发现了此序列化对象,则他们可能会对其进行解码以找到以下字节流:
O:4:"User":2:{s:8:"username":s:6:"carlos"; s:7:"isAdmin":b:0;}
该isAdmin
属性是显而易见的兴趣点。攻击者可以简单地将属性的布尔值更改为1
(true),重新编码对象,然后使用此修改后的值覆盖其当前cookie。孤立地,这没有效果。但是,假设网站使用此cookie来检查当前用户是否有权访问某些管理功能:
$user = unserialize($_COOKIE);if ($user->isAdmin === true) {// allow access to admin interface}
此易受攻击的代码将User
基于cookie中的数据(包括攻击者修改的isAdmin
属性)实例化对象。绝对不会检查序列化对象的真实性。然后将这些数据传递到条件语句中,在这种情况下,将允许轻松地进行特权升级。
这种简单的情况在野外并不常见。但是,以这种方式编辑属性值说明了访问不安全反序列化所暴露的大量攻击面的第一步。
- 其余部分自己阅读与实验
每一个都有实验来提供大家练习
https://portswigger.net/web-security/deserialization/exploiting
在2018年的十大网络黑客技术中都采用了这项发明技术。阅读此文,将我们的认知跟进到最新。
https://portswigger.net/research/top-10-web-hacking-techniques-of-2018#6
- 如何防止不安全的反序列化漏洞
一般而言,除非绝对必要,否则应避免对用户输入进行反序列化。在许多情况下,它可能带来的利用的高度严重性以及防范这些利用的难度超过了收益。说白了需要很贵的人力物力来做防御。