web框架安全

前言

下面总结的内容都比较简略,可能是摘抄了《白帽子》,可能是网上搜集的资料,或者直接给出了别人总结的很好的文章供以后查看,因为每个点展开来将都可以写好几篇文章(嗯,为自己偷懒找借口

这部分我是真的不太懂,待补充

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个字符:

    < -> &lt > -> &gt ' -> &#39 " -> &quot & -> &amp

    • 其他场景中,需要自定义filter,使得防御功能更加完善
  • CSRF防御:自动的在所有涉及POST的代码中添加token

  • HTTP Header管理
    • CRLF攻击:编码所有的“\r\n”
    • 30X返回码的跳转,需要管理好跳转地址
      • web框架提供统一的跳转函数,在函数内部实现一个白名单
      • 控制HTTP的Location字段,限制值只能是哪些地址,也是白名单
  • 数据持久层与SQL注入

  • 其他:
    • 保存好安全检查日志
    • 及时更新

代码审计

JAVA代码审计的一些Tips(附脚本)