开始看《java代码审计》
第一先安装jdk
安装docker
docker官网下载desktop
安装后,docker启动不起来,小鲸鱼图标也是红的
搜索,说打开hyper啥的
控制面板----程序----启用或关闭windows功能
没找到这玩意
查看了一下,适用于linux的windows子系统已经打开了。也不见好
↓这个博主说是wsl版本老了,下载了安装包果然可行
https://blog.csdn.net/qq_39611230/article/details/108625840
更新安装源
几天后↓
打开命令行终端 运行docker run ubuntu echo "hello world"
失败 猜测是前几天安装nmap,关闭了适用于linux的windows子系统这个组件功能所致
提示是wsl2的问题,又重新运行了一下wsl的安装包,重启
启动docker成功
生成容器(奇怪,直接pull不行,需要直接run,然后下载)
启动tomcat容器 docker run -p 8080:8080 -d dordoka/tomcat
第一个8080是本机端口,第二个8080是容器运行tomcat服务的端口。
run指令常用参数
-p容器内部端口绑定到指定的主机端口
-P容器内部端口随机映射到主机端口
-t 提供终端输入
-i 提供交互
-d 容器在后台运行
例子docker run -it ubuntu
可以生成一个简易的ubuntu系统容器,获得一个交互式终端,执行linux命令。
安装idea,sublime
下载ysoserial,vulhub
idea配置tomcat,参考 文章
给tomcat设置密码,参考 文章
登录
第四章 java ee基础知识
jdbc,jndi,ejb,rmi,servlet,jsp,xml,jms,java idl,jts,jta,java mail,jaf
domain object dao service controller view
mvc模式&mvc框架
模式:model,controller,view
框架:struts1,struts2,spring mvc,jsf,tapestry
java web的核心技术
servlet:处理较为复杂的服务器端的业务逻辑
web.xml配置servlet
servlet3.0之后版本,可使用注解方式进行配置
@WebServlet
servlet的访问流程
servlet的接口方式(init,service,doget,dopost,destroy等
servlet的生命周期
java web过滤器filter
filter配置
filter使用流程及实现方式
filter接口方法
filter生命周期
java 反射机制
使运行中的java程序能获取自身的信息
forName()
getClass()
类加载机制
classloader抽象类:通过指定类的名称,找到或生成对应的字节码,返回java.lang.class类的实例。
loadclass()方法的流程
自定义类加载器
java动态代理
javassist 动态编程
Maven
Maven采用pom概念(project object model)来管理项目。
Pom.xml,用于管理源代码,配置文件开发者信息和角色,项目授权,项目的url,项目的依赖关系等。Dependencies和dependency用于定义依赖关系,dependency通过groupid,artifactid及version来定义所依赖的项目。
Swagger
再前后端开发和分析中,为减少和其他团队的沟通成本,会构建restful api文档来描述所有接口信息。
开源软件框架,帮助开发人员设计,构建,记录和使用restful web应用,将代码和文档融为一体,使开发人员集中精力于业务处理而不是文档。
http://path/swagger-ui.html可以为前端展示相关的api文档,通过web界面进行接口测试。
Java EE的核心技术
JDBC,JNDI,EJB,RMI,SERVLET,JSP,XML,JMS,JAVA IDL,JTS,JTA,JAVAMAIL和jaf。
Jdbc:java数据库连接
Jndi:java命名和目录接口,是Java的目录服务应用程序界面(api),提供目录系统,将服务名称与对象关联,使开发人员可以用名称来访问对象。
Ejb:企业级javabean
Rmi:远程方法调用,用户开发分布式应用程序的api
Servlet:狭义的servlet指Java语言实现的一个接口,广义指任何实现该接口的类。主要功能是交互式的浏览和修改数据,生成动态web内容。
Jsp:部署在网络服务器,响应客户端请求,根据请求内容动态生成html,xml,或其他格式文档的web网页,返回给请求者。
Xml:
Jms:Java消息服务,面向消息的中间件(mom)的api,用于两个程序之间或分布式系统中发送消息,进行异步通信。
Java EE分层模型:5层
Domain object领域对象层:pojo
Dao数据访问对象层:数据库创建,查询,更新和删除等操作
Service业务逻辑层:系统所需的业务逻辑方法
Controller控制器层:拦截用户请求,调用业务逻辑去处理用户请求,根据处理结果向不同的view转发。
View表现层:页面和视图,收集用户请求,显示处理后的结果。
Mvc
3个核心:
模型:携带数据的对象或java pojo。即使模型内的数据改变,它也具有逻辑来更新控制器。
视图:模型包含数据的可视化层
控制器:控制数据流进入模型对象,在数据更改时更新视图
目的:将数据模型和用户界面分开,控制器用于确保m和v同步,一旦m改变v就同步更新。强制性地将程序的输入,处理,输出分开。
Java mvc框架
Struts 1:基于mvc模式定义通用的controller,通过配置文件分离m和v,通过action对用户请求进行封装。
Struts 2:apache根据名为webwork的项目发展而来。本质上相当于servlet,在mvc模式中,struts 2作为控制器俩建立m与v的数据交互。
Spring mvc:spring的子框架,角色划分清晰,分工明细
Jsf:提供了以组件为中心的用户界面构建方法
Tapestry:mvc和模板技术的结合,包含前端的mvc,包含一种v的模板技术,使用tapestry完全与servlet/jsp api分离
Servlet
在java web容器中运行的小程序,处理一些较为复杂的服务器端的业务逻辑
Servlet的配置
3.0以前在web.xml中配置,3.0之后版本使用注解方式配置
不同版本的servlet需要不同的jdk
Servlet的访问流程
Servlet的接口方法
对应http的8种请求方法
Service()检查对应的http请求类型,从而调用对应的doget,dopost,doput,dodelete等
Init()接口:servlet实例化后,servlet容器调用init方法来初始化该对象,做处理客户请求前的一些工作,如:建立数据库连接,获取配置信息等
Servlet生命周期
Filter
Servlet2.3新增的特性,实现对web资源的管理,如权限访问控制,过滤敏感词汇,压缩响应信息等
基于注解:@WebFilter
不推荐使用注解方式,因为web.xml可以控制过滤器的执行顺序
拦截方式:1. 在httpservletrequest到达servlet前,filter拦截,根据需要检查httpservletrequest,也可以修改头和数据。2. 在httpservletresponse到达客户端前
Filter的接口方法
Init()接口:初始化过滤器
Filter生命周期
Java反射机制
Java反射机制可以无视类方法,变量去访问权限修饰符(protected,private等),可调用任何类的任意方法,访问并修改成员变量值。
反射是java特征之一,使运行中的java程序能获取自身的信息,可操作类或对象的内部属性。
反射的用途:eclipse开发工具,当我们输入一个对象或欸像调用他的属性或方法时,编译器会自动列出它的属性和方法。Javabean和jsp之间的调用也是反射实现。反射最重要用途是开发各种通用框架,如spring及orm。
反射的基本运用:
1.Forname()获取类对象,只需类名称
2…class直接获取对应的class对象
3.Object类的Getclass()方法获取字节码对象
4.getSystemClassLoader().loadClass()与forname()类似,但forname()的静态方法jvm会装载类,并执行static()中的代码
获取类方法
1.getDeclareMethods方法法案和类或接口声明的所有方法,但不包括继承的方法
2.GetMethods返回类的所有public方法,包括继承类的public方法
3.Getmethod返回一个特定的方法
4.Getdeclaremethod返回特定方法
获取类成员变量
1.Getdeclarefields获得类的成员变量数组,但不包括父类声明字段
2.Getfields
3.Getdeclarefield
4.Getfield
不安全的反射
Classloader类加载机制
程序运行时不会一次性加载所有class文件进内存,而是类加载机制进行动态加载,从而转换成java.lang.Class类的一个实例。
ClassLoader是抽象类,通过指定类名称,找到或生成对应的字节码,返回java.lang.Class类的示例。
Java动态代理
代理是java的一种设计模式,提供对目标对象另外的访问方式,即通过代理对象访问目标对象。代理对象是对目标对象的扩展。
Java代理的3种方式:静态代理,动态代理和CGLib代理。
静态代理:
当确定代理对象和被代理对象后,无法代理另外的对象。代理类和对代理类实现同样的接口。
优势:允许开发人员在不修改已有代码的前提下完成一些增强功能的需求。
劣势:因为要实现一致的接口,造成过多代理类,冗余。大量使用静态代理,项目不易维护,一旦接口增加方法,目标对象和代理对象都要进行修改。
动态代理:
基于反射机制,通过实现接口方式实现代理,通过proxy类创建代理对象,然后将接口方法“代理”给invocattionHandler接口完成的。
优势:对代理类的函数进行统一处理,而不用修改每个代理类中的方法。
CGLib代理:
第三方代码生成类库,运行时在内存中动态生成子类对象,从而实现 对目标对象的功能扩展。基于ASM机制实现,通过生成业务量的子类作为代理类。
Javassist动态编程
静态编程:类型检查在编译时完成
动态编程:运行时完成
Javassist处理java字节码的类库,最重要的四个类ClassPool,CtClass,CtMethod及CtDField。
Spring security:为基于spring的企业应用系统提供声明式的安全访问控制解决方案。
用户认证:spring security支持主流的认证方式,包括http基本认证,http表单验证,http摘要认证,openid和ladp等。
用户授权:基于角色的访问控制和访问控制列表acl。
Spring security提供了一组可以在spring应用上下文中配置的bean,充分利用了spring ioc(控制反转),di(依赖注入),和aop(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能。
Apache shiro
身份验证,授权,加密和会话管理。
OAuth 2.0 开放授权
JWT
Json web token,是一种具体的token实现框架,适用于分布式站点的单点登录(sso)场景。
客户端身份经过服务器验证通过后,会生成待遇签名的json对象并返回给客户端,客户端收到json对象后,存储起来。在以后的请求种,客户端将json对象连同请求内容一起发送给服务器。
私钥
注入
1.Jdbc拼接不当导致sql注入
Jdbc有两种方式执行SQL语句
A.Preparestatement:会对SQL语句进行预编译,
支持?对变量位进行占位,在预编译阶段填入相应的值构造出完整的SQL语句,这样可避免SQL注入。
但开发者有时为了便利,会直接拼接SQL语句,这样则无法阻止SQL注入。
B.Statement:每次执行时都需要编译,增大系统开销
2.框架使用不当造成sql注入
对jdbc进行更加抽象封装的持久化框架,如MyBatis和Hibernate
MyBatis框架将SQL语句编入配置文件中,避免SQL语句在java程序中大量出现,方便对SQL语句的修改和配置。
#和KaTeX parse error: Expected 'EOF', got '#' at position 49: …传参,在sql引用传参可以使用#̲{Parameter}和{Parameter}两种方式。
#{Parameter}方式会使用?占位进行预编译,因此不存在sql注入问题
${Parameter}采用拼接的方式构造sql
Hibernate是java持久化api(jpa)规范的一种实现方式,将java类映射到数据库表中,从java数据类型映射到sql数据类型。
采用hibernate查询语句(HQL)注入
Hibernate的对持久化类的对象进行操作而不是直接对数据库操作,所有hql查询语句由hibernate引擎进行解析,这意味着产生的错误可能来自数据库,也可能来自hibernate引擎。
Runtime类可提供调用系统命令的功能
Runtime.getRuntime().exec(xxx)
1.命令注入的局限
连接符
| 前面命令输出结果作为后面命令的输入内容
|| 前面命令失败猜执行后面命令
& 前面命令执行后执行后面命令
&& 前面命令执行成功后才执行后面命令
代码使用ping诊断网络,Url参数可控,用户输入www.baidu.com&ipconfig,拼接出系统命令ping www.baidu.com&ipconfig,该命令在命令行终端可成功执行,然而在java运行环境下,执行失败,因为www.baidu.com&ipconfig被当成完整的字符串而非两条命令。
Runtime.getRuntime().exec(“ping”+url)
2.无法进行命令注入的原因
要执行的命令通过字符串和数组的方式传入exec方法。
当传入的是字符串,会先经过StringTokenizer处理,针对空格及换行符等空白符进行处理,后续会分割出一个cmdarray数组保存分割后的命令参数,cmdarray的第一个元素为要执行的命令,经过处理的www.baidu.com&ipconfig成为ping命令的参数,因此连接符&并不生效,所以没法注入系统命令。
1.EL表达式的基础
表达式语言,又称EL表达式,是一种jsp中内置的语言,作用于用户访问页面的上下文以及不同作用域的对象,取得对象属性值或执行简单的运算和判断操作。
2.EL基础语法
在jsp中, 表 示 此 处 为 e l 表 达 式 , 未 指 定 作 用 域 范 围 时 , 默 认 p a g e 作 用 域 范 围 查 找 , 而 后 一 次 r e q u e s t , s e s s i o n , a p p l i c a t i o n 范 围 查 找 。 指 定 范 围 , 例 如 : {}表示此处为el表达式,未指定作用域范围时,默认page作用域范围查找,而后一次request,session,application范围查找。指定范围,例如: 表示此处为el表达式,未指定作用域范围时,默认page作用域范围查找,而后一次request,session,application范围查找。指定范围,例如:{requestScope.name}
3.获取对象属性
对 象 . 属 性 当 属 性 名 中 存 在 特 殊 字 符 或 属 性 名 是 变 量 时 , 需 要 使 用 [ ] 符 号 获 取 属 性 , 例 如 {对象.属性} 当属性名中存在特殊字符或属性名是变量时,需要使用[]符号获取属性,例如 对象.属性当属性名中存在特殊字符或属性名是变量时,需要使用[]符号获取属性,例如{User[“Login-Flag”]}
CVE-2011-2730 spring标签el表达式漏洞
FreeMarker模板注入
错误的使用应用程序的身份认证和会话管理功能,使攻击者能破译密码,密钥或者会话令牌,或者利用其他开发漏洞暂时或长久的冒充其他用户身份,导致攻击者可以执行受害者用户的任何操作。
Webgoat8 jwt token猜解实验
根据功能点定向审计
1.系统敏感信息:业务系统本身的基础环境信息,例如系统信息,中间件版本,代码信息
2.应用敏感信息:个人敏感信息和非个人敏感信息
Turbomail 5.2.0敏感信息泄露
开发组件敏感信息泄露:自定义错误页面
开放人员配置其xml解析功能允许外部实体引用,攻击者可利用这一引发安全问题的配置方式,实施任意文件读取,内网端口探测,命令执行,拒绝服务攻击等
读取系统文件
OpenRASP测试用例
Dos攻击
Blind XXE:数据外带
Parsexml方法
横向越权
纵向越权
不安全的默认配置,不完整的临时配置,开源云存储,错误的http标头配置以及包含敏感信息的详细错误信息所造成的。
可以发生在一个应用程序堆栈的任何层面,包括网络服务,平台,web服务器,应用服务器,数据库,框架,自定义的代码,预安装的虚拟机,容器,存储等。
Tomcat任意文件写入CVE-2017-12615
tomcat处理请求时,默认有两个servlet,一个是DefaultServlet,另一个是JspServlet,配置在tomcat的web.xml中。Jspservlet只处理.jsp和.jspx的请求,其他都是defaultservlet处理。
Tomcat ajp文件包含漏洞CVE-2020-1938
Ajp定向包协议,ajp自身存在一定缺陷,导致存在可控参数,通过可控参数可以导致文件包含漏洞。
Tomcat两个功能:1. 充当web服务器,对一切静态资源的请求做回应。2. 充当servlet容器。
常见web服务器:apache,nginx,iis
常见servlet容器:tomcat,weblogic,jboss
Spring boot远程命令执行
在java原生的api中,序列号是ObjectOutputStream类的writeObject()方法实现,反序列化是ObjectInputStream类的readObject()方法实现。
能够被序列化的类必须实现Serializable接口或Externalizable接口。
Serializable接口是个标记接口,不包含任何方法,Externalizable接口是Serializable的子类,包含writeExternal()和readExternal()方法。
反序列化拓展:
1.Rmi
网络传输过程中,rmi中的对象是通过序列化方式进行编码传输的。
可以通过rmi服务做反序列化利用链的触发点
2.Jndi
Java命令和目录接口,是一组应用程序接口,目的是方便查找远程或本地对象。
Apache commons collections反序列化漏洞
Fastjson反序列化漏洞
使用含有已知漏洞的组件
Weblogic中组件的漏洞
富文本编辑器漏洞
Crlf注入漏洞
未记录可审计性事件
抓取请求数据包,删除referer字段再重新提交
一般不需要代码审计来挖掘,专门的csrf漏洞的检测工具
如果要通过代码审计去挖掘csrf,首先了解该开源程序的框架,csrf漏洞一般会在框架中存在防护方案
CVE-2019-9827
CVE-2014-4210
Url重定向漏洞,服务端未对传入的跳转地址进行检查和控制,导致攻击者可构造任意恶意地址,诱导用户跳转到恶意网站。
通常发生在登录,统一身份认证处。大多数访问通过认证后会跳转到指定地址,在用户分享,收藏内容后会跳转到原来的页面或其他页面。站内单击其他网址链接。
1.文件包含漏洞
2.文件上传漏洞
3.文件下载/读取漏洞
FileInputStream
4.文件写入漏洞
将原本要上传的文件中的代码通过web站点的某些功能直接写入服务器,例如“设置/错误页面编辑”功能或http put请求等。
Zrlog 2.1.0后台文件写入漏洞
5.文件解压漏洞
Jspxcms9.5.1后台zip文件解压功能存在目录穿越漏洞
以网页形式存在的一种代码执行环境,攻击者可以利用浏览器来执行相关命令以达到控制网站服务器的目的。
1.函数调用
与PHP的命令执行函数system()和eval()类似,java的命令执行函数java.lang.Runtime.exec()和java.lang.ProcessBuilder.start()
A.直接调用
B.反射调用
在人工审计时通常关注其加密的函数,如BASE64Decoder()及Secret KeySpec()
2.Jdk特性
逻辑漏洞
贴合业务去挖掘漏洞
登录验证逻辑、验证码校验逻辑、密码找回逻辑、权限校验逻辑及支付逻辑
密码找回和密码修改处可能出现的逻辑漏洞:
1.Cors策略
跨域资源共享,通过设置http头部字段,使客户端有资格跨域访问资源。
2.Csp策略
内容安全策略,检测并缓解某些类型的攻击包括xss和数据注入攻击。以白名单机制对网站加载或执行的资源进行限制,通过控制可信来源的方式保护站点安全。一般通过http头信息或meta元素进行定义。
1.ReDos正则表达式拒绝服务
正则表达式引擎1. dfa(确定型有穷自动机)文本主导的匹配2. nfa(不确定型有穷自动机)正则表达式主导的匹配
2.解压功能导致的拒绝服务漏洞:jspxcms
点击劫持漏洞
视觉上的欺骗手段,利用iframe元素制作透明,不可见的页面,诱使用户操作
为一个参数赋予两个或两个以上的值
框架的本质是对底层信息进一步封装,目的是使开发人员将更多精力集中在业务逻辑中。
框架的执行流程
框架简介:
Spring mvc + spring + mybatis
之前生产环境多用ssh(struts 2 + spring + hibernate),但是struts 2高危漏洞太多了
1.Spring mvc
将web层进行职责解耦,使用请求-响应模型
2.Spring
以ioc和aop微内核,使用基本的javabean完成以前只能由ejb完成的工作
3.Mybatis
支持定制化sql,存储过程及高级映射
使用简单的xml或注解,将接口和java的pojo映射成数据库中的记录。
4.Servlet
Ssm框架代码的执行流程和审计思路
Spring核心配置文件applicationContext.xml
Ssm之spring mvc执行流程
Controller层接收前台传入的数据
Ssm之spring执行流程
Ssm之mybatis执行流程
Filter
审计思路总结