前言
下面总结的内容都比较简略,可能是摘抄了《白帽子》,可能是网上搜集的资料,或者直接给出了别人总结的很好的文章供以后查看,因为每个点展开来将都可以写好几篇文章(嗯,为自己偷懒找借口
这部分我是真的不太懂,待补充
Java反序列化漏洞
深入理解JAVA反序列化漏洞 Java安全之反序列化漏洞分析
- Java序列化与反序列化
- 序列化:把Java对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的writeObject()方法可以实现序列化。
- 反序列化:是指把字节序列恢复为Java对象的过程,ObjectInputStream类的readObject()方法用于反序列化。
ac ed 00 05
是java序列化内容的特征,如果经过base64编码,那么相对应的是rO0AB
- 成因
- 暴露或间接暴露反序列化API,导致用户可以操作传入数据,攻击者可以精心构造反序列化对象并执行恶意代码
- 反序列化时没有进行校验,或者有些校验使用黑名单方式又被绕过,最终使得包含恶意代码的序列化对象在服务器端被反序列化执行。
- 风险
- 信息泄露
- 数据篡改
- 数据伪造
- 拒绝服务:当篡改的数据不符合序列化对象的格式要求时候,可能会导致在反序列化对象的过程中抛出异常,从而拒绝服务
- 命令执行:反序列化对象时的运行环境中存在有漏洞的jar包
- 如何发现反序列化漏洞:ysoserial
- 从流量中发现序列化的痕迹,关键字:ac ed 00 05,rO0AB
- Java RMI的传输100%基于反序列化,Java RMI的默认端口是1099端口
- 从源码入手,可以被序列化的类一定实现了Serializable接口
- 观察反序列化时的readObject()方法是否重写,重写中是否有设计不合理,可以被利用之处
- 防范
- 对序列化的数据进行加密,传输过程使用TLS,进行完整性校验
- 类白名单校验
- 禁止JVM执行外部命令Runtime.exec
Struct2
Struts2 历史 RCE 漏洞回顾不完全系列 Struts2 命令执行系列回顾
- OGNL表达式:通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
- 表达式(Expression):规定OGNL的操作
- 根对象(Root Object):OGNL的操作对象
- 上下文环境(Context):操作在哪里干
- 成因:用户插入任意OGNL表达式并执行
Spring MVC
- Spring框架允许使用客户端所提供的数据来更新对象属性,这一机制允许攻击者修改class.classloader加载对象的类加载器的属性,可能导致命令执行
框架中实现的安全方案
-
MVC:Model-View-Controller,用户提交的数据先后流经了View、Controller、Model层。
- XSS
- 在View层可以解决XSS问题,使用”输出编码”更加合理
- View层常用的技术是使用模板引擎对页面进行渲染,例如在Django Tamplates中,使用filters中的escape作为HtmlEncode的方法,同时支持auto-escape,默认编码了5个字符:
< -> <
> -> >
' -> '
" -> "
& -> &
- 其他场景中,需要自定义filter,使得防御功能更加完善
-
CSRF防御:自动的在所有涉及POST的代码中添加token
- HTTP Header管理
- CRLF攻击:编码所有的“\r\n”
- 30X返回码的跳转,需要管理好跳转地址
- web框架提供统一的跳转函数,在函数内部实现一个白名单
- 控制HTTP的Location字段,限制值只能是哪些地址,也是白名单
-
数据持久层与SQL注入
- 其他:
- 保存好安全检查日志
- 及时更新