故障排查:Java Web程序未通过Acunetix的漏洞检查

news2025/1/16 8:10:25

博客主页:https://tomcat.blog.csdn.net
博主昵称:农民工老王
主要领域:Java、Linux、K8S
期待大家的关注💖点赞👍收藏⭐留言💬
家乡

目录

  • 故障详情
  • 问题原因
  • 注意事项
  • 两次失败的尝试
    • relaxedPathChars & relaxedQueryChars
    • error-page
  • 解决方案:ErrorReportValve

故障详情

Acunetix是一款网络漏洞扫描软件,它可以检测网络的安全漏洞。在最近的工作中,接到售后同事反馈,用户通过Acunetix扫描我经手开发的java web项目在Acunetix的漏洞扫描过程中,出现大量报错,未能通过检查。

经过了解后得知,Acunetix会自动地在每个接口对应的URL后面,加上各种奇怪的字符串,如:" 12345’“'”);|]*%00{%0d%0a<%00>%bf%27’💩 ",就得到了下面这个奇怪的URL:

https://test.laowang.cn/app/help/12345'"\'\");|]*%00{%0d%0a<%00>%bf%27'💩.htm

Acunetix的漏洞扫描,就是访问这个URL,并查看其返回值是否有问题。而上面这个URL的访问,会导致Tomcat报“java.lang.IllegalArgumentException: 在请求目标中找到无效字符。”

如下图所示:
在这里插入图片描述实际上这个报错是正常的,是没有安全隐患的,但是Acunetix依然认为这些报错所展示的堆栈信息是非常敏感的,可能被不法分子利用。这就是Acunetix扫描到的所谓的“安全漏洞”,如下图所示:

请添加图片描述

问题原因

面对这个问题,我明确的知道,这不是我开发的war包的问题,而是用户运行war包的Tomcat的配置不对。但作为乙方,我们有必要给甲方提供一个解决方案,让用户的Tomcat不再返回那些堆栈信息。
所以解决这个问题,就是修改Tomcat的配置文件。

注意事项

解决问题的第一步就是在我的开发环境中复现这个报错,我随机复制Acunetix扫描的两个URL,然后尝试访问。

https://test.laowang.cn/app/login?pass=h-5'"/'/");|]*%00{
https://test.laowang.cn/app/help/12345'"\'\");|]*%00{%0d%0a<%00>%bf%27'💩.htm

第一个URL还好,通过浏览器都能访问。但第二个URL,依次通过谷歌浏览器、火狐浏览器、Postman去访问都遇到了问题。谷歌浏览器检测到URL中有异常字符,就会直接跳转到谷歌搜索。火狐浏览器和Postman不能正常识别部分字符,并产生了乱码。

在这里插入图片描述
幸好,公司的一位大佬告诉我用Fiddler可以规避这些问题。

在这里插入图片描述访问效果如下:

在这里插入图片描述

两次失败的尝试

relaxedPathChars & relaxedQueryChars

最开始,售后同事没有给我提到Acunetix,她只是说有些接口都报同一个错误,并发过来一个示例接口。访问后,我发现这个报错是我遇到过的。在Tomcat的server.xml中的Connector节点内加上 relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%就可以
双引号内的字符可以根据你的实际需求来加,需要通过什么字符都可以加上,我在测试时发现有“\”,所以我最终改出来的Connector节点如下所示:

<Connector 
	port="443" protocol="HTTP/1.1" SSLEnabled="true"  maxThreads="150" scheme="https" 
	secure="true"    clientAuth="false" sslProtocol="TLS"  URIEncoding="UTF-8"
	keystoreFile="conf/tomcat.keystore" keystorePass="024116cb67"  
	relaxedPathChars="|{}[],%\"    relaxedQueryChars="|{}[],%\"
/>

自测示例接口的访问是没问题的,我以为解决问题了,就将这个方案交给了售后同事。一天后,售后同事反馈,并没有解决问题,并远程演示了Acunetix的漏洞扫描。这时我才明白,原来不是某几个固定URL的报错,而是Acunetix会随机生成异常字符,并组装几千个URL进行访问。所以这个解决方案是不对的,毕竟不可能把全部的异常字符写上去,而且通过全部的异常字符也是不安全的。

error-page

既然目标是不显示那些堆栈信息,我第一个想到的是在Tomcat全局设置一个自定义的400的错误页面。
我在Tomcat的webapps\ROOT新增了400.html页面,并在conf/web.xml中的web-app节点的下一层加入了如下内容:

<error-page>
    <error-code>400</error-code>
    <location>/400.html</location>
</error-page>

但访问后未生效。我又加入了如下内容:

<error-page>  
    <exception-type>java.lang.IllegalArgumentException</exception-type>  
    <location>/400.html</location>  
</error-page>  

依然未生效,为了排查我填写的格式和文件位置是否存在问题,我按照相同的方法,设置了404错误页面,测试是能正常访问的。
原来,高版本的Tomcat改进了错误处理(已验证了Tomcat8,Tomcat9属于这种情况) ,将某些的错误,尤其是发生在请求处理开始之前的错误,传递给标准错误处理机制,而不仅仅是返回错误代码。因此通过设置error-page无法修改400的错误页面。

解决方案:ErrorReportValve

通过查阅资料得知,在server.xml中的Host//Engine/Service/Server节点下添加ErrorReportValve如下配置可以隐藏报错堆栈信息:

<Valve className="org.apache.catalina.valves.ErrorReportValve" 	showReport="false" />

我就这样解决了问题。

测试如下:
在这里插入图片描述
如果希望能异常Tomcat服务器的详细(上图中的“Apache Tomcat/9.0.36”),还可以加上 showServerInfo="false"
如果希望自定义错误页面,还可以加上errorCode.${error-code}="${错误页面路径}l"

<Valve  className="org.apache.catalina.valves.ErrorReportValve"
		errorCode.400="webapps/ROOT/400.html" 
		showReport="false"
		showServerInfo="false" 
/>

如需转载,请注明本文的出处:农民工老王的CSDN博客https://blog.csdn.net/monarch91 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术博客|第17期:广告程序化交易(一)- 生态系统

在《Hulu/Disney Streaming流媒体广告平台中的核心技术&#xff08;上&#xff09;》广告流程章节中&#xff0c;我们提到了Disney的主要流量是通过每年定期举行的Upfront大会来进行售卖。Upfront会占据我们大部分的流量。除了Upfront售卖的方式以外&#xff0c;剩余的流量在Di…

解析数字员工,为何其已成为企业优势选择

数字化转型浪潮来袭&#xff0c;“数字员工”市场加速升温&#xff0c;各行各业都开始探索数字员工的应用场景。到底什么是数字员工&#xff0c;他们又有哪些优势而备受企业青睐&#xff1f;“抛头露面”与“幕后英雄”数字员工是一种形象化的称呼&#xff0c;所谓“数字员工”…

AOSP安卓源码下载

Android源码下载 在国内想下载Android要么科学上网&#xff0c;要么使用国内搭建的镜像&#xff0c;有清华镜像&#xff0c;中科大的镜像网站。这里使用清华镜像网站镜像Android源码的下载清华镜像网站地址&#xff0c;为啥我要写这篇笔记嘞&#xff0c;虽然网上有很多这方便的…

理发之前先用 AI 替你尝试新发型 #hairstyleai

让 Tony 老师傻眼的 AI 发型效果神器上线&#xff01;&#x1f487;hairstyleai 依靠人工智能的力量尝试新发型&#xff01; hairstyleai 是一个在线人工智能网站&#xff0c;可以根据你的照片&#xff0c;使用强大的人工智能技术生成不同的发型&#xff0c;看看到底哪种最适合…

Layer Normalization

1、原理 Layer Normalization是针对自然语言处理领域提出的&#xff0c;例如像RNN循环神经网络。在RNN这类时序网络中&#xff0c;时序的长度并不是一个定值&#xff08;网络深度不一定相同&#xff09;&#xff0c;比如每句话的长短都不一定相同&#xff0c;所有很难去使用BN…

Gradle学习笔记之build.gradle文件

文章目录简介常见属性代码仓库subprojects和allprojectsext自定义属性buildscript简介 build.gradle是gradle构建脚本文件&#xff0c;支持java、groovy等语言。 每个gradle项目或模块都会有一个build.gradle文件&#xff0c;该文件是项目构建的入口&#xff0c;可配置版本、…

【RabbitMQ二】——RabbitMQ入门教程(简单模式)

RabbitMQ入门教程&#xff08;简单模式&#xff09;前言RabbitMQ相关术语RabbitMQ简单模式示例总结如果博主的文章对您有所帮助&#xff0c;可以评论、点赞、收藏&#xff0c;支持一下博主!!!前言 本篇博客主要是实现RabbitMQ最简单的模式&#xff0c;一个生产者&#xff0c;一…

【指针笔试题上】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!

目录 前言&#xff1a; 一.strlen和sizeof的区别 二.一维数组笔试题解析 三.二维数组笔试题解析 四.总结&#xff1a; 博客主页&#xff1a;张栩睿的博客主页 欢迎关注&#xff1a;点赞收藏留言 系列专栏&#xff1a;c语言学习 家人们写博客真的很花时间的&#xff0c;你们…

【自学Docker】一文解决Docker安装

Docker Centos安装 Docker版本 Docker 从 1.13 版本之后采用时间线的方式作为版本号&#xff0c;分为社区版CE和企业版EE。 Docker社区版是免费提供给个人开发者和小型团体使用的&#xff0c;企业版会提供额外的收费服务&#xff0c;比如经过官方测试认证过的基础设施、容器…

1.1 java 基础语法

目录 一、Java 基础语法 &#xff08;1&#xff09;对象&#xff1a; &#xff08;2&#xff09;类&#xff1a; &#xff08;3&#xff09;方法&#xff1a; &#xff08;4&#xff09;实例变量&#xff1a; 二、如何运行java程序&#xff08;前提是java的环境已经创建完…

19.Isaac教程--C语言接口(Isaac C API)

Isaac C API ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录Isaac C API程序流程和消息格式ROS示例独立示例启动和停止应用程序向 Isaac 应用程序发布消息从 Isaac 应用程序接收消息语言环境设置示例消息ImageProtoRangeScanProtoStateP…

C语言 八皇后(包含错误代码及分析)

基本思路&#xff1a;用递归思想解决&#xff0c;在8*8的棋盘放置8个皇后&#xff0c;则放置成功会每行有且仅有一个皇后&#xff08;因为皇后不能同行&#xff09;&#xff0c;所以可以循环行&#xff0c;尝试在某列放置&#xff0c;和 全排列 http://t.csdn.cn/kvIXC 的解决方…

vulnhub DC系列 DC-4

总结&#xff1a;爆破&#xff0c;teehee提权 目录 下载地址 漏洞分析 信息收集 密码爆破 命令执行 ​编辑 ssh爆破 提权 下载地址 DC-4.zip (Size: 617 MB)Download: http://www.five86.com/downloads/DC-4.zipDownload (Mirror): https://download.vulnhub.com/dc/D…

远程连接mysql报错:1130 - Host XXX is not allowed to connect to this MySQL server

问题描述 1130 - Host 123.120.193.96 is not allowed to connect to this MySQL server 译&#xff1a;不允许主机 123.120.193.96 连接到此 MySQL 服务器 远程连接的时候出现如下错误&#xff1a; 问题分析 根据描述提示&#xff0c;在用Navicat配置远程连接Mysql数据库时遇…

【Node.js】写一个数据自动整理成表格的脚本

前言 企业项目进行数据埋点后&#xff0c;埋点事件名需要整理成Excel表格便于统计&#xff0c;目标是将下图左侧数据转化成下图右侧的Excel表格&#xff1a; 考虑到左侧埋点数据是随项目迭代增加的&#xff0c;埋点数据每增加一次我就要把数据一条一条的CtrlC/V复制粘贴至Ex…

春节要放假了,外贸人你准备好了吗?

一转眼&#xff0c;老外们的假期即将结束&#xff0c;而我们的春节假期即将开启。有人会想&#xff1a;工作一年了&#xff0c;好不容易春节放个假&#xff0c;我是不是应该好好休息了&#xff1f;对别人是&#xff01;但是对于我们外贸人&#xff0c;并不是&#xff01;很多外…

第十三届蓝桥杯C++B组省赛 J 题——砍竹子(AC)

1.砍竹子 1.题目描述 这天&#xff0c;小明在砍竹子&#xff0c;他面前有 nnn 棵竹子排成一排&#xff0c;一开始第 iii棵竹子的高度为 hihihi。 他觉得一棵一棵砍太慢了&#xff0c;决定使用魔法来砍竹子。 魔法可以对连续的一段相同高度的竹子使用&#xff0c;假设这一段…

数学基本算法

欧几里得算法 求两个数的最大公约数&#xff1a; /**** param a 整数* param b 整数* return 两个整数的最大公约数*/public static int gcd(int a,int b){return b0?a:gcd(b,a%b);} 扩展欧几里得 /*** * param a * param b (a,b)两个整数* param x * param y (x,y)…

LeNet5模型与全连接模型的差异

1 问题深度学习训练过程中&#xff0c;有很多的训练模型&#xff0c;我们组就在思考LeNet模型与之前运用的全连接模型在训练精度损失与验证精度损失上有什么差别&#xff1f;2 方法这是LeNet模型的主要代码&#xff0c;对数据进行两成卷积与两次池化之后再建立三成全连接即可。…

Oracle数据库的监控指标

一、Oracle 监控指标 Oracle数据库常见性能指标主要有:当前登录数、非阻塞锁数、当前死锁数、阻塞锁数、当前锁数、会话数等内容,如下图所示。 注意:以下是 Oracle 监控所需要的指标,具体根据需要监控哪些、超阈值而定。 1.1 新建主机群组 1.2 新建模板 1.3 创建主机 …