当前位置: 首页 > news >正文

Cross Site Scripting (XSS)

攻击者会给网站发送可疑的脚本,可以获取浏览器保存的网站cookie, session tokens, 或者其他敏感的信息,甚至可以重写HTML页面的内容。


背景


XSS漏洞有不同类型,最开始发现的是存储型XSS和反射型XSS,2005,Amit Klein发现了基于DOM的XSS。



反射型XSS也叫不可持续XSS,当用户输入在错误消息、搜索结果或任何其他响应中立即由Web应用程序返回时,就会发生反射式XSS,这些响应包含用户作为请求的一部分提供的一些或全部输入,而不会在浏览器中安全地呈现这些数据,也不会永久存储用户提供的数据。在某些情况下,用户提供的数据甚至可能永远不会离开浏览器。


存储型XSS也叫可持续的XSS,存储型XSS通常发生在用户输入存储在目标服务器上时,例如在数据库、论坛、访客日志、评论字段等中。然后受害者能够从Web应用程序检索存储的数据,
而无需在浏览器中安全地呈现这些数据。随着HTML5和其他浏览器技术的出现,我们可以设想攻击有效负载被永久存储在受害者的浏览器中,例如HTML5数据库,而根本不会被发送到服务器。


基于DOM的XSS(或某些文本中称为“类型0 XSS”)是一种XSS攻击,其中攻击有效负载是通过修改原始客户端脚本在受害者浏览器中使用的DOM“环境”来执行的,这样客户端代码就会以“意外”的方式运行。也就是说,页面本身(即HTTP响应)没有改变,但由于DOM环境中发生的恶意修改,页面中包含的客户端代码执行方式不同。



不同类型的XSS

上述三种XSS分类存在重叠,2012年,研究会提议开始用新的词来识别XSS。

  • 服务端XSS
  • 客户端XSS

服务器端XSS发生在服务器生成的HTTP响应中包含不受信任的用户提供的数据时。这些数据的来源可能是请求,也可能是存储位置。因此,您可以同时拥有反射式服务器端XSS和存储式服务器端XSS。在这种情况下,整个漏洞都在服务器端代码中,浏览器只是呈现响应并执行其中嵌入的有效脚本。

客户端XSS发生在不信任的用户提供的数据用于使用不安全的JavaScript调用更新DOM时。如果可以将有效的JavaScript引入DOM,则JavaScript调用被视为不安全。这些数据的来源可能是DOM,也可能是由服务器发送的(通过AJAX调用或页面加载)。数据的最终来源可能是来自请求,或者是来自客户端或服务器上的存储位置。因此,您可以同时拥有反射式客户端XSS和存储式客户端XSS。有了这些新的定义,基于DOM的XSS的定义并没有改变。基于DOM的XSS只是客户端XSS的一个子集,其中数据的来源在DOM中,而不是来自服务器。

原文:Types of XSS | OWASP Foundation

 

推荐的服务端XSS防御方式

服务端XSS是由于在HTML响应中包含了不可信任的数据,最简单和最有力的服务端XSS防御方式为上下文敏感的服务器端输出编码

输入验证和数据清理也可以防止服务端XSS,但是难以正确。

推荐的客户端XSS防御方式

客户端XSS发生在不信任的数据于以不安全的JavaScript调用更新DOM时。针对客户端XSS最简单和最有效的防御是:
使用安全的JavaScript API

但是,开发人员经常不知道哪些JavaScript API是安全的,更不用说他们最喜欢的JavaScript库中的哪些方法是安全的。Dave Wichers在2012年OWASP AppSec USA的DOM XSS演讲中介绍了哪些JavaScript和jQuery方法是安全和不安全的。 如果你知道JavaScript方法是危险的,我们的主要建议是寻找一个安全的替代方法。如果你因为某种原因不能这样做,那么在将数据传递给不安全的JavaScript方法之前,可以在浏览器中进行上下文敏感的输出编码。OWASP的指导说明如何正确执行此操作,在DOM XSS预防备忘单中有所介绍。请注意,此指南适用于所有类型的客户端XSS,无论数据实际来自何处(DOM或服务器)。DOM based XSS Prevention - OWASP Cheat Sheet Series

 XSS攻击的后果

泄露用户的session cookie,允许攻击者劫持用户会话和控制用户账号,
其他伤害包含泄露用户的文件,安装特洛伊木马程序,将用户重定向至其他网站,修改内容呈现方式。

允许攻击者修改新闻稿或新闻项目的XSS漏洞可能会影响公司的股价或降低消费者的信心。
制药网站的XSS漏洞可能允许攻击者修改剂量信息,导致过量服用。
有关这些类型攻击的更多信息,请参阅Content_Spoofing。https://owasp.org/www-community/attacks/Content_Spoofing
 

如何发现XSS攻击

查找漏洞的最佳方法是执行代码的安全性审查,并查找所有可能通过HTTP请求将代码
插入HTML文档的地方。有很多HTML标签可以传递javascript文档,有一些工具如Nessus,Nikto和其他的一些工具可以帮助扫描这些缺陷,但是可能仅仅只发现表面问题。如果网站有一个地方是脆弱的,那么有很大可能其他地方也有问题。

 如何防护?

OWASP XSS预防作弊表Cross Site Scripting Prevention - OWASP Cheat Sheet Series描述了防止XSS的主要防御措施。此外,关闭所有Web服务器上的HTTP TRACE支持是至关重要的。即使在客户端禁用或不支持document.cookie的情况下,攻击者也可以通过Javascript窃取cookie数据。当用户将恶意脚本发布到论坛时,就会发起这种攻击,当另一个用户点击链接时,就会触发异步HTTP跟踪调用,从服务器收集用户cookie信息,然后将其发送到另一个恶意服务器,该服务器收集cookie信息,以便攻击者能够发起会话劫持攻击。通过在所有Web服务器上移除对HTTP TRACE的支持可以轻松减轻这种攻击。OWASP ESAPI项目用几种语言产生了一套可重复使用的安全组件,包括用于防止参数篡改和XSS攻击注入的验证和转义例程。此外,OWASP WebGoat项目培训应用程序提供了有关跨站脚本和数据编码的课程。

XSS语法

常见的是把XSS脚本嵌入<script>...</script> 标签,但是其他的标签也可以嵌入XSS脚本。

<body οnlοad=alert('test1')>


其他属性如 onmouseover, onerror.

onmouseover
<b οnmοuseοver=alert('Wufff!')>click me!</b>

onerror
<img src="http://url.to.file.which/not.exist" οnerrοr=alert(document.cookie);>


通过编码的URI格式 <IMG SRC=j&#X41vascript:alert('test2')>

将我们的脚本进行base64编码并放入META标签
<META HTTP-EQUIV="refresh"
CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">

 举例

1、获取cookie

<SCRIPT type="text/javascript">
var adr = '../evil.php?cakemonster=' + escape(document.cookie);
</SCRIPT>

相关文章:

  • MongoDB——MongoDB删除系统自带的local数据库
  • 淘宝协议最新版
  • GZ035 5G组网与运维赛题第7套
  • ssh登录界面变成vim提示,进不去系统
  • 分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制)
  • 线程池--简单版本和复杂版本
  • 【网络协议】聊聊TCP如何做到可靠传输的
  • 【UE】从UI中拖拽生成物体
  • YOLOv5独家首发改进新主干:改进版目标检测新范式骨干PPHGNetv2,百度PaddlePaddle出品,有效提升YOLOv5检测器检测精度
  • echarts的图表立体感——实现立体柱状图和立体饼图的详细教程
  • 利用移动互联、物联网、智能算法、地理信息系统、大数据分析等信息技术开发的智慧工地云平台源码
  • C/C++ 实现UDP发送或接收组播消息,并可指定接收发送网卡
  • ant Java任务的jvmargs属性和<jvmarg>内嵌元素
  • uniapp-自定义表格,右边操作栏固定
  • 探索网络攻防技术:自学之道
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 08.Android之View事件问题
  • 3.7、@ResponseBody 和 @RestController
  • Github访问慢解决办法
  • Java,console输出实时的转向GUI textbox
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java编程基础24——递归练习
  • Java程序员幽默爆笑锦集
  • JS+CSS实现数字滚动
  • JS数组方法汇总
  • Mysql数据库的条件查询语句
  • Python连接Oracle
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 复习Javascript专题(四):js中的深浅拷贝
  • 基于Android乐音识别(2)
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端性能优化——回流与重绘
  • 驱动程序原理
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用common-codec进行md5加密
  • 数据仓库的几种建模方法
  • 探索 JS 中的模块化
  • 项目实战-Api的解决方案
  • 一些关于Rust在2019年的思考
  • 栈实现走出迷宫(C++)
  • 阿里云移动端播放器高级功能介绍
  • 如何在招聘中考核.NET架构师
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma pack(1)
  • #每日一题合集#牛客JZ23-JZ33
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #在 README.md 中生成项目目录结构
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm-Java网名推荐系统