55:代码审计-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类型
必备知识点:
简要理解JavaWeb项目组成
- 代码方面、框架方面、中间件容器方面等
- 2019年Java Web最流行的开发框架总结:https://blog.csdn.net/x62982/article/details/88392968
- Java Web中间件:https://www.cnblogs.com/csnd/p/11807776.html
- 可以在这里练习中间件漏洞:https://vulhub.org/#/environments/
简要理解JavaWeb执行过程
- javaweb的执行顺序:context-param——> listener——>filter——>servlet 参考:
- Java Web项目运行流程:https://www.cnblogs.com/1987721594zy/p/9186584.html
- javaWeb的执行流程:https://blog.csdn.net/weily11/article/details/80643472
com:
公司项目,copyright由项目发起的公司所有
包名为com.公司名.项目名.模块名...
持久层:dao、persist、mapper
实体类:entity、model、bean、javebean、pojo
业务逻辑:service、biz
控制器:controller、servlet、action、web
过滤器:filter
异常:exception
监听器:listener
在不同的框架下一般包的命名规则不同,但大概如上,不同功能的Java文件放在不同的包中,根据Java文件的功能统一安放及命名。
审计思路:
- 根据业务功能审计
- 优点:明确程序的架构以及业务逻辑,明确数据流向,可以从获取参数-->表现层-->业务层-->持久层,通读源码
- 缺点:耗费时间
- 根据敏感函数审计
- 优点:可以快速高效的挖出想要的漏洞,判断敏感函数上下文,追踪参数源头
- 缺点:覆盖不了逻辑漏洞,不了解程序的基本框架。
审计开始前:
- 1.确定框架:通过以下3种方式确定框架:
- <1>看web.xml
- <2>看导入的jar包或pom.xml
- <3>看配置文件
- Struts2 配置文件:struts.xml
- Spring 配置文件:applicationContext.xml
- Spring MVC 配置文件:spring-mvc.xml
- Hibernate 配置文件:Hibernate.cfg.xml
- Mybatis 配置文件:mybatis-config.xml
2查询是否存在过滤
- 器
- 通过查看web.xml文件,确定是否配置相关过滤器
案例1:简单Demo段申sql注入及预编译
<1>首先使用IntelliJ IDEA工具打开源代码,审计。
<2>发现拼接的SQL语句。
<3>payload测试SQL注入,成功。
<4>监控数据库,发现了执行了注入的SQL语句。
<5>修复建议:使用预编译机制。
<6>重新测试,注入失败。
案例2:IDEA审计插件FindBugs安装使用(不推荐)
参考:idea安装findbugs及Find-sec-bugs安全组件:https://www.cnblogs.com/kingsonfu/p/12419817.html
案例3:Foritify_SCA代码自动审计神器使用(推荐)
Foritify:静态代码审计利器,商用,审计规则多,吃内存CPU
案例4:Ofcms后台SQL注入-全局搜索关键字
ofcms:Java 开发的 CMS 系统
<1>使用IntelliJ IDEA载入源代码,审计。
<2>全局搜索关键字update,找到create()方法,存在SQL语句。
<3>找到对应功能点,测试。
<4>注入成功。但是这个漏洞是一个后台漏洞,比较鸡肋。
案例5:Ofcms后台任意文件上传-功能点测试
<1>根据业务功能审计,发现有个文件上传功能。
<2>抓包,通过接口找到对应文件代码,发现上传文件时,未过滤。
<3>测试是否存在文件上传漏洞,成功。