代码审计——JAVA项目注入上传搜索或插件挖掘

发布于:2022-12-02 ⋅ 阅读:(507) ⋅ 点赞:(0)

目录

必备知识点:

执行流程:

1、context-param

2、listener

3、 filter

4、servlet

HttpServletRequest 常用方法

HttpServletResponse 常用方法

(一)审计思路

1、根据业务功能审计

 2、根据敏感函数审计

(二)审计开始前

1、确定框架

2、查看是否存在拦截器

 3、函数执行过程

 ofcms为例:

 1、先打开它的pom.xml

 2、找web.xml

3、搜索关键字

4、分析其业务功能

(三)自动化工具  Fortify

0x01 介绍

0x02 原理

0x03安装

参考资料


必备知识点:


简要理解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
  • 看配置文件

  1. Struts2 配置文件:struts.xml
  2. Spring 配置文件: applicationContext.xml
  3. Spring MVC 配置文件:spring-mvc.xml
  4. Hibernate 配置文件 : Hibernate.cfg.xml
  5. 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安装

鄙人电脑带不动,等我研究明白了,在写一篇具体安装,操作......

Fortify 代码扫描安装使用教程_回忆式~过去.的博客-CSDN博客_fortify代码扫描

参考资料

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