XSS注入漏洞解决方法(高风险)

article/2025/11/4 16:13:41

漏洞描述

攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

漏洞验证

通过在页面中的留言板,提交框,录入信息框等能够提交参数的地方,尝试注入相关xss代码测试,能够成功执行对应代码功能则存在问题,可能造成流量劫持,篡改、删除页面信息,获取用户cookie信息,盗取账号等不良影响。
在这里插入图片描述

修复建议

  1. 过滤输入的数据,包括"’" “”" “<” “>” “on*” 等非法字符。
  2. 对输入到页面的数据进行相应的编码转换,包括HTML实体编码,js编码等。

修复方法

验证方法:
在可以提交数据到后台的功能中,在表单中的输入框输入< script>alert(“1”)< /script >(此处应去掉script左右的空格),当成功保存到后台后,刷新并查询该条数据,前端会把它当成是js代码,就会弹框显示“1”这个提示。

解决方法:
xss拦截器类:

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.util.ValueStack;/*** Created by Administrator on 2019/8/15 0015.* xss拦截器*/
public class XssIntecepter extends AbstractInterceptor {/*** 将容易引起xss漏洞的半角字符直接替换成全角字符** @param s* @return*/public static String xssEncode(String s) {if (s == null || s.isEmpty()) {return s;}StringBuilder sb = new StringBuilder(s.length() + 16);for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);switch (c) {case '>':sb.append('>');// 全角大于号break;case '<':sb.append('<');// 全角小于号break;case '(':sb.append('(');// 全角break;case ')':sb.append(')');// 全角break;case '&':sb.append('&');// 全角break;case '\\':sb.append('\');// 全角斜线break;case '#':sb.append('#');// 全角井号break;case '%':    // < 字符的 URL 编码形式表示的 ASCII 字符(十六进制格式) 是: %3cprocessUrlEncoder(sb, s, i);break;default:sb.append(c);break;}}return sb.toString();}private static void processUrlEncoder(StringBuilder sb, String s, int index) {if (s.length() >= index + 2) {if (s.charAt(index + 1) == '3' && (s.charAt(index + 2) == 'c' || s.charAt(index + 2) == 'C')) {    // %3c, %3Csb.append('<');return;}if (s.charAt(index + 1) == '6' && s.charAt(index + 2) == '0') {    // %3c (0x3c=60)sb.append('<');return;}if (s.charAt(index + 1) == '3' && (s.charAt(index + 2) == 'e' || s.charAt(index + 2) == 'E')) {    // %3e, %3Esb.append('>');return;}if (s.charAt(index + 1) == '6' && s.charAt(index + 2) == '2') {    // %3e (0x3e=62)sb.append('>');return;}}sb.append(s.charAt(index));}@Overridepublic String intercept(ActionInvocation invocation) throws Exception {// 通过核心调度器invocation来获得调度的Action上下文ActionContext actionContext = invocation.getInvocationContext();// 获取Action上下文的值栈ValueStack stack = actionContext.getValueStack();// 获取上下文的请求参数Map valueTreeMap = actionContext.getParameters();// 获得请求参数集合的迭代器Iterator iterator = valueTreeMap.entrySet().iterator();// 遍历组装请求参数while (iterator.hasNext()) {// 获得迭代的键值对Map.Entry entry = (Map.Entry) iterator.next();// 获得键值对中的键值String key = (String) entry.getKey();// 原请求参数,因为有可能一键对多值所以这里用的String[]String[] oldValues = null;// 对参数值转换成String类型的if (entry.getValue() instanceof String) {oldValues = new String[] { entry.getValue().toString() };} else {oldValues = (String[]) entry.getValue();}// 处理后的请求参数String[] newValueStr = new String[oldValues.length];// 对请求参数过滤处理if (oldValues.length >= 1) {for (int i = 0; i < oldValues.length; i++) {// 替换掉非法参数,这里只替换掉了',如有其他需求,可以专门写一个处理字符的类newValueStr[i] = xssEncode(oldValues[i].toString());}} else {newValueStr = null;}// 处理后的请求参数加入值栈中stack.setValue(key, newValueStr);}String result = null;try {// 调用下一个拦截器,如果拦截器不存在,则执行Actionresult = invocation.invoke();} catch (Exception e) {e.printStackTrace();}return result;}

struts.xml中拦截器的配置:

<interceptors><!--xss攻击拦截器--><interceptor name="xssIntecepter" class="com.xmgrid.view.common.XssIntecepter" /><!-- 定义拦截栈   --><interceptor-stack name="mydefault"><!-- 指定引用的拦截器 --><interceptor-ref name="xssIntecepter" /></interceptor-stack></interceptors><!-- 定义默认拦截器 --><default-interceptor-ref name="mydefault" />

以上就是xss攻击解决的办法,思路主要是获取前端传到后端的一些参数值并替换里面一些比较特殊的字符比如说“<”、“>”等等,并将替换后的数据保存到数据库中,这样前端获从后台获取这些数据的时候,就不会将它们判定为js代码。

总结

试过了CSDN的好几个方法,都没能成功的解决xss漏洞,其中占多数的有filter用过滤器拦截的方法,在我亲身尝试中,重写了filter中的方法比如说getParam等,都没能获取到表单里传到后端的数据,最后才采用了拦截器的方法。

在过程中,还遇到了拦截器类中给代码过滤特殊值的stack.setValue(key, newValueStr);方法报错的问题:
在这里插入图片描述
由于没有找到该属性,在设置值的时候抛出了异常。最开始因为系统报错会直接跳转到一个错误页面,没有直接的报错,所以也在这个问题上耽搁了挺长时间。最后的解决办法是<!-- 是否为开发模式 --> <constant name="struts.devMode" value="true" />将是否为开发模式改成<constant name="struts.devMode" value="false" />,把模式设置为非开发模式即可解决这个问题。网上还有的说可以用get、set来解决这个办法,这个方法暂时还没有去尝试过。


http://chatgpt.dhexx.cn/article/o85Wsyyf.shtml

相关文章

XSS注入——DOM型XSS

DOM型xss XSS根据恶意脚本的传递方式可以分为3种&#xff0c;分别为反射型、存储型、DOM型&#xff0c;前面两种恶意脚本都会经过服务器端然后返回给客户端&#xff0c;相对DOM型来说比较好检测与防御&#xff0c;而DOM型不用将恶意脚本传输到服务器在返回客户端&#xff0c;这…

XSS注入之xss-labs

目录 &#xff08;一&#xff09;配置环境 &#xff08;1&#xff09;phpstudy 的安装 &#xff08;2&#xff09;xss-labs 的安装 &#xff08;二&#xff09;XSS漏洞的一些基础知识 &#xff08;1&#xff09;XSS漏洞的定义 &#xff08;2&#xff09;XSS漏洞的原理 &…

sql注入和xss注入有什么不一样呢?

在OWASP Top10中注入排在第一位&#xff0c;xss排在第七位&#xff0c;那么问题问题就来了&#xff0c;sql注入和xss注入都是注入&#xff0c;为什么要单独把xss单独拿出来排个名呢&#xff1f;他俩到底有啥区别&#xff0c;各自的特点是啥&#xff1f;本文不对它俩做详细的讲解…

xss漏洞攻防

XSS基本概念和原理说明 基本概念 XSS又叫CSS (Cross Site Script) &#xff0c;跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的html代码会被执行&#xff0c;从而达到恶意的特殊目的。XSS属于被动…

XSS注入——反射性XSS

xss注入的攻击步骤&#xff1a; 1.查找可能存在的注入点&#xff08;搜索框&#xff0c;留言板&#xff0c;注册&#xff09; 2.观察输出显示位置&#xff1a; html&#xff1a; 尖括号外部&#xff0c; 尖括号内部: 引号内部》闭合&#xff0…

XSS注入的原理与实现

一、JavaScript的常用脚本 1.window.location.href 用来跳转页面 eg:<script>window.location.hrefwww.jd.com</script> 2.document.cookie 获取客户端的cookie值 3.script 可以通过“src”属性引入JavaScript文件 二、什么是同源策略 同源策略在web应用的安…

XSS注入(跨站脚本攻击)

今天学习一下xss注入 1.XSS是什么 XSS注入漏洞又称为"跨站脚本攻击(Cross Site Scripting)"&#xff0c;为了不和层叠样式表(Cascading Style Sheets,CSS)混淆&#xff0c;所以将跨站脚本攻击缩写为XSS。xss本质上是黑客通过对网页的HTML注入&#xff0c;篡改了原本…

xss注入教程与总结

xss注入个人总结 1 " < >可以用URL编码 %22 %3c %3e HTML 编码 &quot; < > 代替 2 如果过滤 可以用%2522 %26colon; 这种代替尝试 二次转码 3 如果输入框有历史记录 &#xff0c;个人简介注意使用 发现很多网站对输入框有过滤缺但没有过滤历史记录这些…

XSS注入(1)-两个简单测试理解反射型xss注入和存储型xss注入

XSS注入(1)-两个例子理解反射型xss注入和存储型xss注入 XSS全称 Cross Site Script&#xff0c;为使与css语言重名&#xff0c;所以我们将其称为xss跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码&#xff0c;而程序对于用户输入内容未过滤&#xff0c;当用户浏…

xss漏洞注入

定义&#xff1a; XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript&#xff0c;但实际上也可以包括Java、 VBScript、ActiveX、 Fla…

XSS-Lab(XSS注入笔记1-16)

前言 本篇博客主要是记录笔者完成XSS-Lab步骤以及分析 题目链接&#xff1a;https://buuoj.cn/challenges#XSS-Lab Github仓库&#xff1a;https://github.com/rebo-rn/xss-lab 出题人的题解&#xff1a;https://github.com/Re13orn/xss-lab/blob/master/XSSwrite%20up.doc…

XSS注入原理以及一些绕过姿势

介绍 XSS——跨站脚本攻击。通过这个攻击手段&#xff0c;攻击者可以将恶意的 JavaScript 代码插入存在 XSS 漏洞的 Web 页面中&#xff0c;当用户浏览带有恶意代码的页面时&#xff0c;这些恶意代码会被触发&#xff0c;从而达到攻击的目的。可以说&#xff0c;XSS 是针对用户…

XSS注入基础入门篇

XSS注入基础入门篇 1.XSS基础概念2. XSS的分类以及示例2.1 反射型XSS2.1.1 示例1&#xff1a;dvwa low 级别的反射型XSS2.1.2 攻击流程 2.2 DOM型XSS2.2.1 示例2&#xff1a;DOM型XSS注入1.环境部署2.基础版本3.进阶绕过 2.3 存储型XSS2.3.1 示例1&#xff1a;dvwa low示例2.3.…

XSS跨站脚本注入详解

一、什么是XSS跨站脚本注入(XSS注入)? XSS(Cross-site scripting)注入是一种Web安全漏洞,它允许攻击者在受害者的浏览器上执行恶意脚本,从而导致攻击者能够窃取受害者的敏感信息或者利用受害者的身份在应用程序上执行未经授权的操作。 攻击者通常会在受害者访问的Web页…

XSS注入

文章目录 前言一、XSS是什么&#xff1f;二、XSS的大致分类与利用思路1.反射型2.存储型3.DOM型 三、不同类型的XSS漏洞注入演示1.反射型xss2.存储型xss3.DOM型xss 三、XSS漏洞实战1.制作钓鱼网站获得用户的用户名和密码2.获取管理员的cookie 总结 前言 本篇文章详细讲解XSS漏洞…

XSS注入测试

XSS 全称(Cross Site Scripting) 跨站脚本攻击&#xff0c; 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时&#xff0c;脚本就会在用户的浏览器上执行&#xff0c;从而达到攻击者的目的. 比如获取用户的Cookie&#xff0c;导…

MySQL和Navicat的安装与配置

mysql和navicat的安装与配置 MySQL的安装与配置Navicat的安装与配置 安装下载&#xff1a; MySQL下载 Navicat下载 MySQL的安装与配置 将mysql文件夹转移到自己想放置的路径下 复制mysql的bin路径 打开环境变量配置 右击【此电脑】&#xff0c;打开【属性】&#xff0c;打开…

手把手教你安装MySQL+Navicat

本文为个人于 Windows10&#xff08;64位&#xff09;操作系统下 安装MySQL&#xff08;版本号&#xff1a;8.0.18&#xff09;和Navicat&#xff08;版本号&#xff1a;12&#xff09;的过程记录&#xff0c;希望也能给你带来帮助。 目录 一、MySQL的安装1. 卸载电脑上已有版…

MySQL+Navicat 下载、安装教程(Windows)

目录 前言MySQL下载安装验证 Navicat下载安装配置 前言 MySQL 在过去由于性能高、成本低、可靠性好&#xff0c;已经成为最流行的开源数据库&#xff0c;因此被广泛地应用在 Internet 上的中小型网站中。随着 MySQL 的不断成熟&#xff0c;它也逐渐用于更多大规模网站和应用。—…

Navicat15安装使用

本安装流程适合各个版本Navicat安装 从网络下载Navicat及注册机 点击这里 链接: https://pan.baidu.com/s/1Fh4BMQF3PlUMT4_RlfBt0A?pwdph2h 提取码: ph2h 1.删除系统自带的杀毒软件&#xff0c;例如360&#xff0c;电脑管家&#xff0c;Windows Defender window10的 Windo…