首页 > 编程语言 >java代码审计的点

java代码审计的点

时间:2022-09-01 13:22:17浏览次数:56  
标签:审计 xml java 代码 用户 漏洞 序列化 javax

java代码审计的点

组件的审计

首先看pom.xml查看第三方组件和第三方组件的版本

常用的第三方组件:

第三方组件 漏洞类型 组件漏洞版本
log4j2 远程代码执行 Apache log4j2 >= 2.0, <= 2.14.1
Fastjson 反序列化远程代码执行 Fastjson <= 1.2.80
iBatis(MyBatis) SQL注入
Struts2 命令执行
Shiro 反序列化
中间件 Tomcat,WebLogic,WebShere
Jboss,Jetty,Glassfish
..... ...

SQL注入的点

​ 对于sql注入来讲,只要是与数据库存在交互的地方,应用程序对用户的输入没有进行有效的过滤,都有可能存在SQL注入漏洞。

DAO: 存在拼接的SQL语句

String sql="select * from user where id="+id

Hibernate框架

session.createQuery("from Book where title like '%" + userInput + "%' and pu
blished = true")

Mybatis框架

Select * from news where title like ‘%${title}%’
Select * from news where id in (${id}),
Select * from news where title =‘java’ order by ${time} asc

XSS漏洞的点

​ 网站与后端交互的输入输出没有做好过滤,导致攻击者可以插入恶意js语句进行攻击。根据后端代码不同 ,大致可以分为反射型、存储型、DOM型。

​ 全局搜索用户的输入与输出,查找是否存在过滤。

XXE漏洞

​ XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

​ XML解析一般在导入配置、数据传输接口等场景会用到,xml解析器是否禁用外部实体。

全局搜索如下函数:

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.XPathEx

SSRF漏洞

​代码中提供了从其他服务器应用获取数据的功能但没有对目标地址做过滤与限制。

只要是能够对外发起网络请求的地方,就有可能会出现SSRF漏洞。重点查找以下函数。

HttpClient.execute
HttpClient.executeMethod
HttpURLConnection.connect
HttpURLConnection.getInputStream
URL.openStream
  • new URL():构造一个url对象
  • openConnection():创建一个实例URLConncetion.
  • getInputStream():获取URL的字节流

CSRF篇

​ 跨站请求伪造是一种使已登录用户在不知情的情况下执行某种动作的攻击。因为攻击者看不到伪造请求的响应结果,所以CSRF攻击主要用来执行动作,而非窃取用户数据。当受害者是一个普通用户时,CSRF可以实现在其不知情的情况下转移用户资金、发送邮件等操作;但是如果受害者是一个具有管理员权限的用户时CSRF则可能威胁到整个Web系统的安全。

​ 一些增删改查方法,是否进行Referer头检验token检验 无法构造的随机数参数验证码密码

搜索session["token"]

XML漏洞

​ 一个用户,如果他被允许输入结构化的XML片段,则他可以在 XML 的数据域中注入 XML 标签来改写目标 XML 文档的结构与内容。

全局搜索如下字符串

  • xml
  • StreamSource
  • XMLConstants
  • StringReader
  • xmlString

在项目中搜索. Xsd 文件

任意文件操作类漏洞

​ 常见的一些java文件操作类的漏洞:任意文件的读取、下载、删除、修改,这类漏洞的成因基本相同,都是因为程序没有对文件和目录的权限进行严格控制,或者说程序没有验证请求的资源文件是否合法导致的。

全局搜索关键字或者方法

  • FileInputStream
  • getPath
  • getAbsolutePath

命令执行漏洞

服务端没有针对执行命令的函数进行过滤,导致攻击者可以提交恶意构造语句。java中常见如:Runtime.exec() Process ProcessBuilder.start

Java中的命令执行离不开调用反射的机制,在实际的场景往往离不开反序列化的利用。

服务端直接存在可执行函数(exec()等),且对传入的参数过滤不严格导致 RCE 漏洞
服务端不直接存在可执行函数(exec()等),且对传入的参数过滤不严格导致 RCE 漏洞
由表达式注入导致的RCE漏洞,常见的如:OGNL、SpEL、MVEL、EL、Fel、JST+EL等
由java后端模板引擎注入导致的 RCE 漏洞,常见的如:Freemarker、Velocity、Thymeleaf等
由java一些脚本语言引起的 RCE 漏洞,常见的如:Groovy、JavascriptEngine等
由第三方开源组件引起的 RCE 漏洞,常见的如:Fastjson、Shiro、Xstream、Struts2、weblogic等

审计的时候可以重点寻找:

  • Runtime.exec()
  • Process
  • ProcessBuilder.start()

反序列化漏洞

​ 当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。

​ 反序列化操作常常出现在导入模版文件、网络通信、数据传输、日志格式化存储或者数据库存储等业务功能处,在代码审计时可重点关注一些反序列化操作函数并判断输入是否可控。

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

中间件漏洞

**中间件**是提供系统软件和应用软件之间连接的软件,它将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力 。容器就是中间件的一种。

​ 常见的JAVA Web中间件有:

​ Tomcat WebLogic WebShere Jboss Jetty Glasshfish

​ 直接打开pom.xml文件查看其 使用的中间件及其版本,然后到漏洞库里找漏洞即可。

业务逻辑漏洞

​ 常见的业务逻辑漏洞主要是越权,分为平行越权和垂直越权。在javaweb的各个功能点中都可能存在越权漏洞。

​ 主要原因还是因为程序没有对当前用户的权限进行严格控制,或者是后台没有判断当前用户id。

​ 在每个request.getParameter("userid");之后查看是否有检验当前用户与要进行增删改查的用户。

URL重定向漏洞

​ 接口从host头或者参数中取值,直接跳转到用户自定义的url,导致url重定向。

​ 查找sendRedirect,跳转的url是否用户可控,如果可控是否有进行过滤判断。

​ 特别是在删掉某个资源的斜杠,有可能就进行了302跳转,该处时常出现url重定向漏洞。

其他漏洞

​ java中存在的安全问题还有很多,比如ldap注入、jndi注入、rmi反序列化等

标签:审计,xml,java,代码,用户,漏洞,序列化,javax
From: https://www.cnblogs.com/mantou0/p/16645348.html

相关文章

  • java 同源Cors 解决跨域及填坑总结
    1.为什么会跨域出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影......
  • 微信开发者工具拉取gitlab远程代码报Pull failed原因分析:
    可能出现的原因:本地主机上没有安装nodenode下载地址:1https://nodejs.org/zh-cn/download/ 没有保存gitlab的用户名和密码  ......
  • JavaMath类
    方法描述abs()返回参数的绝对值ceil()对number类型变量向上取整,返回值类型为double类型floor()对number类型变量向下取整,返回值类型为double类型rint......
  • Java命名方式
    Java所有的组成部分都需要有名字。类名、变量名以及方法名都被称为标识符。标识符注意点:所有的标识符都应该以字母(A-Z或者a-z)、美元符($)、或者下划线(_)开始。首字符之后......
  • pyinstaller 打包后无法找到导入代码中依赖的文件项
    问题出现的情况:写了一个flask的服务,里面使用了4个接口{1.localhost:/aaa2.localhost:/bbb3.localhost:/ccc4.localhost:/ddd}其中一个接口(ddd)调用了一个封装函数(......
  • 如何在 Javascript 中清空数组?
    如何在Javascript中清空数组?在使用JavaScript编程时,程序员可能需要在许多情况下将数组设为空,一个非常常见的问题是如何清空数组并删除其所有元素!顺便说一句,这是最受......
  • JavaScript 中的构造函数和新的运算符
    JavaScript中的构造函数和新的运算符ConstructorFunctionsandthenewOperator你好,我是Gibson,在这篇博客中,我们将学习构造函数和新的运算符。我们可以使用构造函......
  • 力扣388(java)-文件的最长绝对路径(中等)
    题目:假设有一个同时存储文件和目录的文件系统。下图展示了文件系统的一个示例: 这里将dir作为根目录中的唯一目录。dir包含两个子目录subdir1和subdir2。subdir1......
  • Java 运算符
    运算符大致分为以下几种:算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 算术运算符表格中的实例假设整数变量A的值为10,变量B的值为20:操作符......
  • 我的代码仍然很慢的令人惊讶的原因
    我的代码仍然很慢的令人惊讶的原因几周前我有发表了一篇关于React误用导致的性能问题的文章.一些读者引起了我的注意,即使在我添加到声称修复它们的文章中的演示中,问......