范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Web安全头号大敌XSS漏洞解决最佳实践

  写在前面
  虽然今天是周末,但职位每日推荐不可少,万一有努力找工作的小伙伴因为我一天偷懒导致没找到满意工作那就是我的罪过了,今日职位已放置在文章末尾,请注意查看!
  引言
  XSS 是目前最普遍的 Web 应用安全漏洞,它带来的危害是巨大的,是 Web 安全的头号大敌。
  关键词: 跨站 脚本(JavaScript、Java、 VBScript、ActiveX、 Flash 或者 HTML) 注入 执行 1. 什么是 XSS 漏洞?
  XSS 攻击:跨站脚本攻击(Cross Site Scripting),为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆,故将跨站脚本攻击缩写为 XSS。
  XSS(跨站脚本攻击)是指恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。类似于 sql 注入。是目前最普遍的 Web 应用安全漏洞,也是 Web 攻击中最常见的攻击方式之一。
  XSS( 跨站脚本攻击)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。 2. XSS 漏洞攻击原理及攻击手段
  HTML 是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是 HTML 标签的开始,之间的字符是页面的标题等等。
  当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了 HTML 标签,当这些 HTML 标签引入了一段 JavaScript 脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生 XSS 漏洞。
  常用的 XSS 攻击手段和目的有:
  1、盗用 cookie,获取敏感信息。
  2、利用植入 Flash,通过 crossdomain 权限设置进一步获取更高权限;或者利用 Java 等得到类似的操作。
  3、利用 iframe、frame、XMLHttpRequest 或上述 Flash 等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
  4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
  5、在访问量极大的一些页面上的 XSS 可以攻击一些小型网站,实现 DDoS 攻击的效果。
  最简单的 XSS 示例:   3. XSS 分类如下:
  分类
  主要特点
  存储型 XSS
  经过后端服务处理,数据存储在数据库端
  反射型 XSS
  经过后端服务处理,不存储数据库
  DOM型 XSS
  不经过后端服务处理,不存储数据库
  4. XSS 漏洞分析
  4.1 存储型 XSS
  通过网页注入的代码最终会存储在数据库或其他物理文件中,在某个页面中注入的代码会被浏览器成功执行,该类型的漏洞存在持久性的特点。
  主要特点: 存储 持久性
  图解成因分析:
  4.2 反射型 XSS
  一般是通过 url 的形式注入代码,注入的代码不在服务器端存储,但会在服务器端进行处理然后进行回显,在回显时浏览器会触发漏洞执行注入代码,该类型攻击具有临时性特点。
  主要特点: 回显 临时性
  图解成因分析
  4.3 DOM 型 XSS
  也是通过 url 的形式注入代码,注入的代码服务器端程序不存储、不处理,而是由浏览器进行处理,该类型攻击也具有临时性特点。主要特点: 不存储、不处理 浏览器 临时性
  图解成因分析
  5. 三种XSS漏洞对比
  分类
  一般表现形式
  特点
  存储型 XSS
  表现为包含表单的页面,post提交后数据存储在数据库,通过其他页面访问触发
  存储、持久性
  反射型XSS
  表现为包含参数的url地址,参数经后端程序程序处理后回显,通过访问 url 触发
  url参数、后端处理参数、临时性
  DOM型XSS
  表现为包含参数的url地址,参数由页面中的JS代码处理,通过访问 url 触发
  url参数、JS处理参数、临时性
  6. 植入 JS 代码攻击及危害分析
  外在表现形式: 直接注入 JavaScript 代码 引用外部 JS 文件
  基本实现原理: 通过 img 标签的 src 发送数据 构造表单诱导用户输入账密 构造隐藏的 form 表单自动提交 页面强制跳转 植入文字链接、图片链接
  潜在危害: 获取管理员或者其他用户 Cookie,冒充用户身份登录 构造表单诱导用户输入账号、密码,获取账密 跳转到其他网站,网站流量被窃取 植入广告、外链等 通过隐藏友链提升其他网站百度权重(SEO 黑帽)
  7. 植入 HTML 代码攻击及危害分析
  外在表现形式: 构造 img 标签 构造 a 标签 构造 iframe 构造其他 HTML 标签
  基本实现原理: 通过 img 标签的 src 发送数据 通过 img 的 onerror 触发脚本代码 通过 a 标签被动触发脚本代码 href/onclick 通过 iframe 引入第三方页面 直接构造文字链接或图片链接 style 属性嵌入脚本代码 background-image:url("javascript:…");(浏览器已可防范)
  潜在危害: 获取管理员或者其他用户 Cookie,冒充用户身份登录 构造表单诱导用户输入账号、密码,获取账密 植入广告、外链等 通过隐藏友链提升其他网站百度权重(SEO 黑帽)
  8. XSS 简单预防策略
  8.1 对 html 标签进行字符替换: replaceAll("

存在问题:

大小写问题

优化升级:

正则表达式

存在问题:

反替换

8.2 对 html 字符转义或是半角转全角字符:

{ "<", ">", """}
  转义:
  { "<", ">", """})
  全角:
  { "<, ">", """}

新场景:

页面中需要根据某个参数生成文字链接

存在问题:

a 标签的 href 属性 javascript:

其他问题:

针对 json 字符串的场景

如何公用的问题

  

9. XSS 漏洞预防策略最佳实践

9.1 输入环节

  • 页面限制输入长度、特殊字符限制,后端代码限制输入长度、处理特殊字符
  • Filter 过滤器统一处理(自定义处理规则、使用 Apache Text、使用 Owasp AntiSamy)

9.2 Cookie 防护

  • cookie 设置 httponly,一般 servlet 容器默认 httponly 为 true
  • resp.setHeader("SET-COOKIE", "JSESSIONID=" + request.getSession().getId()+ "; HttpOnly");

9.3 X-Frame-Options 响应头 (是否允许frame、iframe等标记)

  • DENY 不允许、SAMEORIGIN 可在相同域名页面的 frame 中展示、ALLOW-FROM uri 可在指定页的 frame 中展示
  • add_header X-Frame-Options SAMEORIGIN; //在nginx的 http 或 server 节点中配置即可
  • 也可通过 Filter 设置 resp.setHeader("x-frame-options","SAMEORIGIN");

9.4 输出环节

  • OWASP ESAPI for Java
  • 显示时对字符进行转义处理,各种模板都有相关语法,注意标签的正确使用
  • 示例如下:

thymeleaf

--->
  

JSP

---> 

9.5 DOM 型 XSS

  • 避免 .innerHTML、.outerHTML、document.write() 的使用,应使用 .textContent、.setAttribute() 等。
  • Vue/React 技术栈,避免使用 v-html/dangerouslySetInnerHTML
  • 尤其注意 onclick、onerror、onload、onmouseover 、eval()、setTimeout()、setInterval() 以及 a 标签的 href
  • 可使用 OWASP esapi4js : esapi.js

  

10. 后端服务编码实践

通过 https://start.spring.io/ 快速创建 springboot 应用:

解压并在 IDEA 导入刚刚创建的 xss-demo 项目

在 pom.xml 添加相关依赖:


  
  org.owasp.antisamy
  antisamy
  1.5.7
  
  
  
  com.alibaba
  fastjson
  1.2.62
  

修改 xss-demo 工程包结构如下:

XSSFilter 编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:45
  **/
  public class XssFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  HttpServletRequest req = (HttpServletRequest) request;
  String path = req.getServletPath();
  //注解配置的是urlPatterns="/*"(过滤所有请求),所以这里对不需要过滤的静态资源url,作忽略处理(大家可以依照具体需求配置)
  String[] exclusionsUrls = {".js", ".gif", ".jpg", ".png", ".css", ".ico"};
  for (String str : exclusionsUrls) {
  if (path.contains(str)) {
  chain.doFilter(request, response);
  return;
  }
  }
  chain.doFilter(new XssRequestWrapper(httpServletRequest), response);
  }
  }

XssRequestWrapper 包装类编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:46
  **/
  @Slf4j
  public class XssRequestWrapper extends HttpServletRequestWrapper {
  public XssRequestWrapper(HttpServletRequest request) {
  super(request);
  }
  /**
  * 获取策略文件,直接使用jar中自带的ebay策略文件
  */
  private static InputStream inputStream = XssRequestWrapper.class.getClassLoader()
  .getResourceAsStream("antisamy-ebay.xml");
  private static Policy policy = null;
  static {
  try {
  // 使用静态代码块处理策略对象的创建
  policy = Policy.getInstance(inputStream);
  } catch (PolicyException e) {
  e.printStackTrace();
  }
  }
  /**
  * 使用AntiSamy进行过滤数据
  * @param html
  * @return
  */
  private String xssClean(String html) {
  String cleanHTML = "";
  try {
  AntiSamy antiSamy = new AntiSamy();
  CleanResults scan = antiSamy.scan(html, policy);
  cleanHTML = scan.getCleanHTML();
  } catch (ScanException e) {
  e.printStackTrace();
  } catch (PolicyException e) {
  e.printStackTrace();
  }
  return cleanHTML;
  }
  /**
  * 重写处理请求参数的方法
  * @param name
  * @return
  */
  @Override
  public String[] getParameterValues(String name) {
  String[] values = super.getParameterValues(name);
  // 判断参数有值,如果没有值,直接返回
  if (values == null) {
  return null;
  }
  // 遍历参数数组,使用AntiSamy进行过滤
  int len = values.length;
  String[] newValues = new String[len];
  for (int i = 0; i < len; i++) {
  // 过滤前的数据
  log.info("使用AntiSamy进行过滤清理,过滤清理之前的数据:{}", values[i]);
  // 进行过滤
  newValues[i] = xssClean(values[i]);
  // 过滤后的数据
  log.info("使用AntiSamy进行过滤清理,过滤清理之后的数据:{}", newValues[i]);
  }
  //返回过滤后的结果
  return newValues;
  }
  /**
  * 重写处理json数据的方法
  * @return
  * @throws IOException
  */
  @Override
  public ServletInputStream getInputStream() throws IOException {
  // 读取流
  BufferedReader reader = new BufferedReader(
  new InputStreamReader(super.getInputStream(), "UTF-8"));
  // 获取json格式的数据
  StringBuilder sb = new StringBuilder();
  String inputStr;
  while ((inputStr = reader.readLine()) != null) {
  sb.append(inputStr);
  }
  // 把json转为map
  Map map = JSON.parseObject(sb.toString(), Map.class);
  // 过滤前
  log.info("json过滤前:{}", sb.toString());
  // 对map中的value值进行AntiSamy的过滤
  map.keySet().forEach(k -> {
  map.put(k, xssClean(map.get(k).toString()));
  });
  // 过滤后
  String json = JSON.toJSONString(map);
  log.info("json过滤后:{}", json);
  // 把json数据转为流的格式进行返回
  ByteArrayInputStream bais = new ByteArrayInputStream(json.getBytes());
  return new ServletInputStream() {
  @Override
  public boolean isFinished() {
  return false;
  }
  @Override
  public boolean isReady() {
  return false;
  }
  @Override
  public void setReadListener(ReadListener listener) { }
  @Override
  public int read() throws IOException {
  return bais.read();
  }
  };
  }
  }

AntiSamyConfig 配置过滤器类编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:58
  **/
  @Configuration
  public class AntiSamyConfig {
  /**
  * 配置xss过滤器
  * @return
  */
  @Bean
  public FilterRegistrationBean create() {
  FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new XssFilter());
  filterRegistrationBean.addUrlPatterns("/*");
  filterRegistrationBean.setOrder(1);
  return filterRegistrationBean;
  }
  }

User 实体类:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:42
  **/
  @Data
  public class User {
  private int id;
  private String name;
  private int age;
  }

UserController 测试控制器类编码如下:

/**
  * @program: xss-demo
  * @author: Mr.Zhang
  * @create: 2021-02-21 15:43
  **/
  @Slf4j
  @RestController
  @RequestMapping("user")
  public class UserController {
  /**
  * 表单
  * @param user
  * @return
  */
  @PostMapping("save")
  public String save(User user) {
  log.info("name={}, age={}", user.getName(), user.getAge());
  return JSON.toJSONString(user);
  }
  /**
  * json数据格式请求体
  * @param user
  * @return
  */
  @PostMapping("json")
  public String saveJson(@RequestBody User user) {
  log.info("user={}", user.toString());
  return JSON.toJSONString(user);
  }
  }

application.properties 配置文件为空,运行启动类后默认端口号8080。

Postman 模拟表单数据请求及响应效果如下:

  

后端程序控制台日志打印如下:

Postman 模拟 json 数据请求及响应效果如下:

后端程序控制台日志打印如下:

以上两个情况,请求参数中隐藏的 xss 攻击代码被过滤器过滤后再进入 Contrlloer 层处理。

  

11. 能不能根本上解决问题,即浏览器自动禁止外部注入恶意脚本?

开启 CSP (内容安全策略 Content Security Policy)方法:设置 HTTP 的 头部字段

resp.setHeader("Content-Security-Policy","default-src http: https:");

设置网页的标签

CSP 常见可选策略设置如下:

策略

含义

default-src http: https: ;

只能通过外联的方式引用 js 和 css

default-src "self" http://smart4j.cn/;

只能在指定的域下加载文件(包含 img)

form-action "self"";

form 表单的只能在指定域提交

script-src "self";

只限制 js 文件在同域加载文件

report-uri /report;

向指定uri发送违规报告(不支持 meta 方式)

本文转载自码上修行

今日职位推荐:

前端开发主管

要求:

1. 本科及以上学历,软件技术、计算机科学与技术、电子工程等相关专业,5年及以上前端开发经验

2. 精通Vue/JQuery等JS框架,HTML/HTML5/CSS3/JavaScript,熟练使用uniapp

3. 具备浏览器开发调试技能,能分析解决问题

4. 掌握Web前端构建工具,能够运用构建工具

5. 具有基于VUE 低代码开发经验

办公地址:苏州市吴中区

薪资范围:20k-25k

投递方式:Freemen App中定位苏州搜索前端开发主管

  

  
  
  展开阅读全文   
  

投稿时间:2023-02-13最后更新:2023-03-24   

  标签:攻击者 大敌 表单 头号 过滤器 脚本 漏洞 恶意 策略 参数 代码 文件 网页   

  

  1   2   3   4   5   

  
日本成功发射一颗雷达卫星新华社东京1月26日电(记者钱铮)日本一颗雷达卫星雷达7号26日搭载H2A火箭从该国南部鹿儿岛县的种子岛宇宙中心发射升空。负责这次发射任务的三菱重工业公司说,卫星已进入预定轨道。搭肉眼可见的彗星绿色彗星出现第三条尾巴,违背物理学常识C2022E3(ZTF)是一颗彗星,最近因为飞近地球而成为头条新闻,由于一种奇怪的光学错觉,它短暂地长出了一条飘渺的第三条尾巴。1月21日,彗星C2022E3(ZTF)有一个短的第那些不正规的网站,是资源福利还是坑?大家好!相信很多LSP在网上冲的时候,经常能看到一串神秘代码,清理不掉,观感极其难受!要是不小心点进去,还会被浏览器警告危险。尽管如此,还是有很多人不畏艰难,非要去这种不正规网址里98英寸电视推荐,这五款受欢迎度高,闭眼入手即可对于年轻群体来说,一般的65英寸75英寸电视并不能满足需求,一些用户反而会一步到位,直接选择98英寸的巨幕电视,毕竟大屏幕电视拥有更好的沉浸感,打造家庭影院,那么98英寸电视怎么选接近200颗Corei913900K且个体间落差小Corei913900KS这CPU嘛,估计大家对他的感觉就是一颗特挑的Corei913900K,实际上这两颗处理器的差距不大,都是8个PCore和16个ECore,PCore的基础低价笔记本可以买吗?从这款惠普2799元产品看,优缺点都有啥最近笔记本市场上更新换代很快,那边酷睿1345W版已经大量上市,这边还有一些搭配老款CPU的机型降价。这不,我们看到惠普一款笔记本锐15锐龙版降至了2799元,销售比较火爆。这样的75英寸85英寸电视怎么选?什么电视品牌比较好?在电视市场中,越来越多的人开始选择大屏幕电视,比如75英寸,甚至是98英寸等等,以往43英寸就非常大了,对于普通群体而言,其实选择75英寸和85英寸的人数最多,价格也比较合适。那么印度GooglePlayStore将为应用和游戏提供第三方计费服务IT之家1月26日消息,去年,印度竞争委员会(CCI)因限制第三方支付服务而对谷歌处以罚款,并正在调查该公司的其他反竞争行为。谷歌最近向最高法院请求阻止CCI的命令被驳回后,该公司RedmiNote12Pro极速版体验均衡体验芯,中端体验新选择畅聊数码新品RedmiNote系列高性价比的特点吸引了非常多朋友的关注,这次的Note12系列也带来不错的使用体验,Note12TPro系列更是带来优秀的游戏表现。但这还没有结束,换AppleWatchUltra2个月了,说说感受12月4日收到的AppleWatchUltra,差不多2个月了,说说感受,希望对想入手的朋友有帮助。先谈谈我换Ultra之前的想法。最大问题是续航焦虑。之前用的是S5GPS版44M佩总说还可能继续补强?LBJ我的工作是比赛并确认队友准备好直播吧1月25日讯今日NBA常规赛,湖人在主场以115133不敌快船。湖人总经理佩林卡在赛前表示,若能助球队夺冠还会继续交易。对此,詹姆斯在赛后采访时说道他是对你们说的。他是在和你
貌美如花,眼光却差的6位女星,有人衣品灾难,有人择偶难看娱乐圈从来不缺漂亮的女明星,貌美如花的人比比皆是,大多数人长得又漂亮,眼光又好。可也有一些女明星的眼光,耐人寻味,主要表现为两点,一是衣品灾难,二是择偶难看。一。衣品灾难1。斓曦说费城酝酿三方交易,三大投手有望同时加盟,哈登苦等之人来了据费城当地媒体透露,76人火箭和独行侠正在商讨一份三方交易。具体的交易方案为76人送出哈里斯赛布尔,得到戈登布洛克贝尔坦斯。火箭送出戈登得到鲍威尔以及一个来自独行侠的2025年首轮增长动能进入调整期后,湖北如何更好地应对挑战?今年以来,随着中央稳定经济增长系列指示精神与相关措施的出炉,全国绝大部分城市都或明或暗出台了通过支持房地产以重启增长动力源的相关政策。但从实际反馈看,与之前历次经济动能不够强劲便支44岁刘涛与小鲜肉演姐弟恋吻上热搜,这7位女星,却30岁就演妈了7月14日,44岁的刘涛与小她12岁的刘宇宁合作的做自己的光被拍到了一组吻戏路透,当即冲上了热搜前三。虽然拍摄的画面看不到个什么,但网友们的评论画风出奇一致,纷纷认为这对混搭CP没素媛案强奸女童致下半身瘫痪,变态程度令人发指却只被判12年素媛案罪犯1小时可做1千个俯卧撑警方的手段对他有用吗?素媛案原型罪犯赵斗顺再次引起韩国民众的恐慌。2008年12月11日,56岁的韩国人赵斗顺用极其残忍的手段强奸了8岁的小女孩那英在希望的田野上足不出户玩贵州?看乡村推荐官杜富佳如何带货家乡炎炎夏日,你想足不出户领略西部美丽风光吗?你想在家就能品尝到西部乡村特色美食吗?7月15日,由重庆四川贵州陕西四省市共同打造的在希望的田野上乡村振兴看西部我是乡村推荐官联动直播活动言情小说(年轻漂亮的小美妇)第三十一章陈莲花害羞地看着王涛,然后微笑着说因为!我比较喜欢农村生活!所以就过来看看了。王涛被陈莲花的话给逗笑了。突然哈哈大笑了起来。你笑什么啊?我说错什么话了吗?陈莲花疑惑地问道。没没有,古代皇帝龙袍不能水洗,穿臭了怎么办?原来是贫穷限制了想象力受命于天,既寿永昌。这句话是出自于皇帝祭天时祭文的最后两句话,而这两句话也被秦始皇印在了传国玉玺上。也因此拥有这个玉玺的皇帝被视作为正统皇帝。而这八个字,也代表了皇帝生来尊贵,是天现代故事不能拜的丈八筒丈八筒何许人也?没人见过。在抗日战争时期,江南水乡娄江岸边有几股盗匪,其中最厉害最有名气的是一个女土匪头子,名唤丈八筒。据说,丈八筒年轻漂亮,身手敏捷,枪法如神,指哪打哪,就像红岩攻略直男计划一hr我在A大火了,就是火得不太光彩,一切还得从对面宿舍楼穿红裤衩的裸男说起。事情发生在前几天晚上,我在阳台上晾衣服,眼睛一抬,突然有个光裸着的东西闯进了视线。是男人的肉体那肉体移十堰靳氏从何而来之汉水靳杨支派明洪武三年至永乐十五年,大槐树下发生了大规模官方移民是中国历史上规模最大范围最广有组织有计划的一次大迁徙。为了巩固明朝统治的经济基础,朱元璋实行移民屯田,奖励垦荒的民屯军屯商屯之制