目录
必备知识点:
简要理解JavaWeb执行过程:
javaWeb中的重要三个组件Filter、servlet、Listening,组件都是配置在web.xml
执行流程:
1、context-param
context-param:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mybatis.xml</param-value>
</context-param>
<!--
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值,这里的例子是指定spring配置文件的位置
-->
2、listener
listener:该元素用来注册一个监听器类。可以收到事件什么时候发生以及用什么作为响应的通知。事件监听程序在建立、修改和删除会话或servlet环境时得到通知。常与context-param联合使用。
//listen-class 指定监听类,该类继承ServletContextListener 包含初始化方法contextInitialized(ServletContextEvent event) 和销毁方法contextDestoryed(ServletContextEvent event)
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3、 filter
filter:用于指定WEB容器的过滤器, filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应;在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;根据程序需要修改请求和响应;在servlet被调用之后截获servlet的执行。
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、servlet
servlet : 创建并返回一个包含基于客户请求性质的动态内容的完整的html页面; 创建可嵌入到现有的html页面中的一部分html页面(html片段); 读取客户端发来的隐藏数据; 读取客户端发来的显示数据; 与其他服务器资源(包括数据库和java的应用程序)进行通信;
//配置Spring MVC,指定处理请求的Servlet,有两种方式:
//1. 默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml
//2. 可以通过配置修改MVC配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置。
//这里使用的是第二种方式
<!-- Springmvc的核心控制器 -->
<servlet>
<servlet-name>dispatchServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatchServlet</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
- com:
- 公司项目,copyright由项目发起的公司所有
- 包名为com.公司名.项目名.模块名.......
- 持久层: dao、persist、mapper
- 实体类: entity、model、bean、javabean、pojo
- 业务逻辑: service、biz
- 控制器:controller、servlet、action、web
- 过滤器:filter
- 异常:exception
- 监听器:listener
在不同的框架下一般包的命名规则不同,但大概如上,不同功能的Java文件放在不同的包中,根据Java文件的功能统一安放及命名。
HttpServletRequest 常用方法
//方法 //说明
getParameter(String name) //获得请求中的参数,该参数是由name指定的
getParameterValues(String name) //返回请求中的参数值,该参数是由name指定的
getRealPath(String path) //获取web资源目录
getAttribute(String name) //返回name指定的属性值
getAttributeNames() //返回当前请求的所有属性的名字集合
getCookies() //返回客户端发送的cookie
getSession() //获取session会话对象,没有则创建
getInputStream() //获取请求主体的输入流
getReader() //获取请求主体的数据流
getMethod() //获取发送请求的方式,如GET、POST
getParameterNames() //获取请求中所有参数的名称
getRemoteAddr() //获取客户端IP地址
getRemoteHost() //获取客户端名称
getServletPath() //获取请求的文件的路径
HttpServletResponse 常用方法
//方法 //说明
getWriter() //获取响应打印流对象
getOutputStream() //获取响应流对象
addCookie(Cookie cookie) //将指定的cookiejia
addHeader(String name,String value) //将指定的名字和值加入到响应的头信息中
sendError(int sc,String msg) //使用指定状态码发送一个错误到客户端
sendRedirect(String location) //发送一个临时的响应到客户端
setDateHeader(String name,long date) //将给出的名字和日期设置响应的头部
setHeader(String name,String value) //将给出的名字和值设置响应的头部
setStatus(int sc) //给当前响应设置状态码
setContentType(String ContentType) //设置响应的MIME类型
(一)审计思路
1、根据业务功能审计
明确程序的架构以及业务逻辑,明确数据流向,可以从获取参数-->表现层-->业务层-->持久层,通读源码;
2、根据敏感函数审计
可以快速高效的挖出想要的漏洞,判断敏感函数上下文,追踪参数源头;
(二)审计开始前
1、确定框架
通过以下三种方式确定框架
- web.xml
- 看导入的jar包或pom.xml
- 看配置文件
- Struts2 配置文件:struts.xml
- Spring 配置文件: applicationContext.xml
- Spring MVC 配置文件:spring-mvc.xml
- Hibernate 配置文件 : Hibernate.cfg.xml
- Mybaits 配置文件 : mybatis-config.xml
2、查看是否存在拦截器
通过查看web.xml文件,确定是否配置相关的拦截器
3、函数执行过程
比如说我们查找某个已知关键函数:
ofcms为例:
先把代码下到本地 源代码
1、先打开它的pom.xml
看引用了什么框架,导入什么库
2、找web.xml
3、搜索关键字
注意查找的时候直接搜索单词,比如select、update、insert......
点进去,这个地方就可能存在注入点
在上面找到注解,有其访问地址
像这样直接操作数据库的地址,直接访问会被拒绝,我们可以通过抓包进行访问
修改为/system/generate,Forword
成功修改进入页面,紧接着就是触发对于的方法,下面提供几种方法:
- 如果有源码就可以进行调试分析
- 通过BP抓包触发相应的方法,分析数据包(多尝试,总结)
找到注入点了,就不再赘述了,下面是之前整理过的思路:
SQL注入漏洞(union + 盲注)__Cyber的博客-CSDN博客
SQL注入之宽字节注入、堆叠注入、二次注入__Cyber的博客-CSDN博客
SQL注入和sql-labs通关1-18(手工注入、高权限注入、文件读写、提交方式、查询方式、WAF绕过、sqlmap)__Cyber的博客-CSDN博客_mysql注入攻击与防御
4、分析其业务功能
这很大程度上看实战经验,常见的有SQLI、文件上传、文件包含
在模板里面我们可以找到修改文件,我们抓包看看会触发哪一个函数
用BP抓包分析行为特征
根据访问路径找到代码
没有过滤,改包直接写入webshell,写入成功
(三)自动化工具 Fortify
0x01 介绍
Fortify 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,通过与软件安全漏洞规则集进行匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并可导出报告。扫描的结果中包括详细的安全漏洞信息、相关的安全知识、修复意见。
0x02 原理
通过分析不同类型问题的静态分析引擎分析NST文件,同时匹配所有规则库中的漏洞特征,将漏洞抓取出来,然后形成包含详细漏洞信息的FPR结果文件,用AWB打开查看。
0x03安装
鄙人电脑带不动,等我研究明白了,在写一篇具体安装,操作......
参考资料
javaweb中间件:https://www.cnblogs.com/csnd/p/11807776.html
javaweb流行开发框架总结:https://blog.csdn.net/x62982/article/details/88392968
javaweb执行流程:https://blog.csdn.net/weily11/article/details/80643472
idea安装findbugs及Find-sec-bugs安全组件:https://www.cnblogs.com/kingsonfu/p/12419817.html
JavaWeb项目运行流程:https://www.cnblogs.com/1987721594zy/p/9186584.html