首页 > 编程知识 正文

xss跨站脚本攻击类型,跨站脚本漏洞

时间:2023-05-04 01:04:27 阅读:125335 作者:2558

说明:此页面有跨网站脚本攻击。 跨站点脚本漏洞(即XSS )通常用Javascript语言编写,允许攻击者向其他用户发送恶意代码。 由于浏览器无法识别脚本是否可信,因此会运行站点之间的漏洞脚本,使攻击者能够检索其他用户的cookie或session。

加强建议:

整体修复方式:验证所有输入数据,有效检测攻击; 对所有输出数据进行适当编码,以防止成功注入的脚本在浏览器端运行。 具体如下。

输入验证:在数据被显示或接受为可存储之前,使用标准输入验证机制验证所有输入数据的长度、类型、语法和业务规则。

输出编码:在输出数据之前,建议确保用户提交的数据已正确编码实体,并对所有字符(不仅仅是子集)进行编码。

注意黑名单验证方法的局限性:如果只是搜索或替换关键字(如“”和“script”),XSS变种攻击很容易绕过验证机制。

警惕规范化错误:在验证录入之前,必须进行解码和规范化,以匹配APP应用程序的当前内部表示方式。 请确保APP应用程序不会解码相同的条目两次。 过滤客户端发送的数据时,通常建议排除双引号“”、尖括号“”等特殊字符,或将双引号“”转换为实体格式等,或者对客户端发送的数据中包含的特殊字符进行实体转换。 以下是要过滤的常用字符:

[1] |(竖线符号) ) ) ) ) ) ) )。

[2] (符号)

[3]; (分号)

[4] $ (美元符号) ) ) )。

[5] % (百分号)

[6] @(at符号)

[7] ' (单引号) )。

[8] (' ((引号) ) ) ) ) ) ) )。

[9] ' (反斜杠用单引号转义() ) )。

[10] " (()反斜线转义引号() ) ) ) )。

[11] (尖括号)

[12] (() );括号) ) ) ) ) )。

[13] (((加号) ) ) ) ) ) )。

[14] CR (回车,ASCII0x0d ) ) ) )。

[15] LF (换行,ASCII0x0a ) ) )。

[16],(逗号)

[17] ()反斜线) ) )。

请求页面关键字符转义;

[1] " (双引号):quot "

[2]’(单引号):apos

[3] (符号):amp

[4]

[5] (右尖括号):gt

建议将cookie标记为httpOnly,同时禁用TRACE方法,而不影响APP应用。

以上是绿色联赛的扫描结果和建议。

我在网上找了很多,很多只是过滤了普通的请求参数,不包括json格式的。 这也是我不能过滤的原因。 原理非常简单,可以解决XSS攻击,过滤和退出后端输入的数据,禁用XSS攻击代码。 为大家提供一个,避免绕道

xssandsqlhttpservletrequestwrapper.Java

importorg.Apache.com mons.lang3. string utils;

importorg.Apache.com mons.text.stringescapeutils;

import javax.servlet.http.http servlet请求;

导入javax.servlet.http.httpservletrequestwrapper;

//*

防止XSS攻击

*/

publicclassxssandsqlhttpservletrequestwrapperextendshttpservletrequestwrapper {

私有ttpservletrequestrequest;

publicxssandsqlhttpservletrequestwrapper (httpservletrequestrequest ) {

super (请求;

this.request=request;

}

@Override

公共字符串获取参数(字符串名称) {

string value=request.getparameter (name;

if (! stringutils.isempty(value ) }{

value=stringescapeutils.escape html4(value;

}

返回值;

}

@Override

公共字符串[ ] getparameter values {

string [ ] parameter values=super.getparameter values (name;

if (参数值==null )

{

return null;

}

for (int i = 0; i < parameterValues.length; i++) {

String value = parameterValues[i];

parameterValues[i] = StringEscapeUtils.escapeHtml4(value);

}

return parameterValues;

}

}

这里重写了两个方法:getParameter和getParameterValues,getParameter方法是直接通过request获得querystring类型的入参调用的方法。如果是通过springMVC注解类型来获得参数的话,走的是getParameterValues的方法。大家可以通过打印一个输出来验证一下。

StringEscapeUtils.escapeHtml4这个方法来自Apache的工具类,maven坐标如下:

org.apache.commons

commons-text

1.4

XssFilter.java

过滤的代码写完了,下面就是在一个filter中应用该代码。

import com.fasterxml.wndbbt.databind.ObjectMapper;

import com.fasterxml.wndbbt.databind.module.SimpleModule;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Primary;

import org.springframework.http.converter.json.ssdby2ObjectMapperBuilder;

import org.springframework.stereotype.Component;

import javax.servlet.*;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;

@WebFilter

@Component

public class XssFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(req);

chain.doFilter(xssRequestWrapper, response);

}

@Override

public void destroy() {

}

/**

* 过滤json类型的

* @param builder

* @return

*/

@Bean

@Primary

public ObjectMapper xssObjectMapper(ssdby2ObjectMapperBuilder builder) {

//解析器

ObjectMapper objectMapper = builder.createXmlMapper(false).build();

//注册xss解析器

SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer");

xssModule.addSerializer(new XssStringJsonSerializer());

objectMapper.registerModule(xssModule);

//返回

return objectMapper;

}

}

过滤表单类型的代码已经完成(xssObjectMapper这个是后面过滤json类型才用到的)。下面来实现过滤json类型的代码:

XssStringJsonSerializer.java

import com.fasterxml.wndbbt.core.JsonGenerator;

import com.fasterxml.wndbbt.databind.JsonSerializer;

import com.fasterxml.wndbbt.databind.SerializerProvider;

import org.apache.commons.text.StringEscapeUtils;

import java.io.IOException;

public class XssStringJsonSerializer extends JsonSerializer {

@Override

public Class handledType() {

return String.class;

}

@Override

public void serialize(String value, JsonGenerator jsonGenerator,

SerializerProvider serializerProvider) throws IOException {

if (value != null) {

String encodedValue = StringEscapeUtils.escapeHtml4(value);

jsonGenerator.writeString(encodedValue);

}

}

}

这里是通过修改SpringMVC的json序列化来达到过滤xss的目的的。其实也可以通过第一种方法,重写getInputStream方法来实现,这里我就不做演示了(通过json类型传参会走getInputStream方法,通过重写该方法打印输出可以证明)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。