XSS跨站脚本

XSS简介

  • XSS被称为跨站脚本攻击(Cross-site scripting),由于和CSS(CascadingStyle Sheets) 重名,所以改为XSS。
  • XSS主要基于javascript语言完成恶意的攻击行为,因为javascript可以非常灵活的操作html、css和浏览器。
  • XSS就是指通过利用网页开发时留下的漏洞(由于Web应用程序对用户的输入过滤不足),巧妙的将恶意代码注入到网页中,使用户浏览器加载并执行攻击者制造的恶意代码,以达到攻击的效果。这些恶意代码通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、Flash或者普通的HTML。
  • 当用户访问被XSS注入的网页,XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。
  • 用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript 解释器,可以解析javascript,然而由于浏览器并不具有人格,不会判断代码是否恶意,只要代码符合语法规则,浏览器就会解析这段XSS代码。
  • 微博、留言板、聊天室等等收集用户输入的地方,都有遭受XSS 的风险。只要对用户的输入没有进行严格的过滤,就有可能遭受XSS攻击。

简单来说,XSS就是通过攻击者精心构造的JS代码注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击浏览器的效果。XSS攻击的对象是用户浏览器,属于被动攻击。因此XSS攻击涉及到三个角色:

  • 攻击者
  • 用户浏览器
  • 服务器

 XSS跨站脚本_第1张图片

 实施XSS攻击需要具备的两个条件

  • 需要向Web页面注入精心构造恶意代码
  • 对用户的输入没有做过滤,恶意代码能够被浏览器成功的执行

XSS危害 

  • 盗取各种用户账号
  • 窃取用户Cookie资料,冒充用户身份进入网站
  • 劫持用户会话,执行任意操作
  • 刷流量,
  • 执行弹窗广告
  • 传播蠕虫病毒
  • 攻击者能在一定限度内记录用户的键盘输入

 XSS分类

XSS根据其特性和利用手法的不同,主要分为三大类型

  • 反射型XSS
  • 存储型XSS
  • DOM型XSS

反射性XSS 

  • 反射型XSS又称为非持久型XSS,是现在最容易出现的一种XSS漏洞。用户在请求某条URL地址的时候,会携带一部分数据。当客户端进行访问某条链接时,攻击者可以将恶意代码植入到URL,如果服务端未对URL携带的参数做判断或者过滤处理,直接返回响应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而触发反射型XSS。
  • 比如,当用户进行搜索时,返回结果通常会包括用户原始的搜索内容,如果攻击者精心构造包含XSS恶意代码的链接,诱导用户点击并成功执行后,用户的信息就可以被窃取,甚至可以模拟用户进行一些操作。

 反射性XSS特点

  • 非持久性
  • 参数型脚本
  • 反射型XSS的JS代码在Web应用的参数(变量)中,如搜索框等地方

数据流量走向:浏览器->后端->浏览器

 XSS跨站脚本_第2张图片

存储型XSS

存储型XSS又叫持久型XSS。一般而言,它是三种XSS里危害最大的一种。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。

 XSS跨站脚本_第3张图片

 存储型XSS特点

  • 持久性跨站脚本
  • 持久性体现在JS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中,如留言板等地方

数据流量走向:浏览器-> 后端 ->数据库->后端->浏览器

DOM型XSS 

DOM型XSS漏洞是基于文档对象模型(Document Object Model)的一种漏洞。这种XSS与反射型XSS、持久型XSS在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发XSS靠的是浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞,如document.getElementByld("x").innerHTML、document.write等。

文档是由节点构成的集合,在DOM里存在许多不同类型的节点,主要分为以下三种

  • 元素节点
  • 文本节点
  • 属性节点

XSS跨站脚本_第4张图片

XSS跨站脚本_第5张图片

 DOM型XSS特点

非持久性

流量走向:URL->浏览器

XSS payload构造

利用<>构造HTML标签和标签

利用HTML标签的属性值(伪协议)

touch me!

利用事件


事件种类
事件 介绍
windows事件 对windows对象触发的事件
Form事件 HTML表单内的动作触发事件
Keyboard事件 键盘按键
Mouse事件 由鼠标或类似用户动作触发的事件
Media事件 由多媒体触发的事件

Window 事件属性

属性 描述
onafterprint script 文档打印之后运行的脚本。
onbeforeprint script 文档打印之前运行的脚本。
onbeforeunload script 文档卸载之前运行的脚本。
onerror script 在错误发生时运行的脚本。
onhaschange script 当文档已改变时运行的脚本。
onload script 页面结束加载之后触发。
onmessage script 在消息被触发时运行的脚本。
onoffline script 当文档离线时运行的脚本。
ononline script 当文档上线时运行的脚本。
onpagehide script 当窗口隐藏时运行的脚本。
onpageshow script 当窗口成为可见时运行的脚本。
onpopstate script 当窗口历史记录改变时运行的脚本。
onredo script 当文档执行撤销(redo)时运行的脚本。
onresize script 当浏览器窗口被调整大小时触发。
onstorage script 在 Web Storage 区域更新后运行的脚本。
onundo script 在文档执行 undo 时运行的脚本。
onunload script 一旦页面已下载时触发(或者浏览器窗口已被关闭)。

 Form 事件

属性 描述
onblur script 元素失去焦点时运行的脚本。
onchange script 在元素值被改变时运行的脚本。
oncontextmenu script 当上下文菜单被触发时运行的脚本。
onfocus script 当元素获得焦点时运行的脚本。
onformchange script 在表单改变时运行的脚本。
onforminput script 当表单获得用户输入时运行的脚本。
oninput script 当元素获得用户输入时运行的脚本。
oninvalid script 当元素无效时运行的脚本。
onreset script 当表单中的重置按钮被点击时触发。HTML5 中不支持。
onselect script 在元素中文本被选中后触发。
onsubmit script 在提交表单时触发。

 Keyboard 事件

属性 描述
onkeydown script 在用户按下按键时触发。
onkeypress script 在用户敲击按钮时触发。
onkeyup script 当用户释放按键时触发。

 Mouse 事件

属性 描述
onclick script 元素上发生鼠标点击时触发。
ondblclick script 元素上发生鼠标双击时触发。
ondrag script 元素被拖动时运行的脚本。
ondragend script 在拖动操作末端运行的脚本。
ondragenter script 当元素元素已被拖动到有效拖放区域时运行的脚本。
ondragleave script 当元素离开有效拖放目标时运行的脚本。
ondragover script 当元素在有效拖放目标上正在被拖动时运行的脚本。
ondragstart script 在拖动操作开端运行的脚本。
ondrop script 当被拖元素正在被拖放时运行的脚本。
onmousedown script 当元素上按下鼠标按钮时触发。
onmousemove script 当鼠标指针移动到元素上时触发。
onmouseout script 当鼠标指针移出元素时触发。
onmouseover script 当鼠标指针移动到元素上时触发。
onmouseup script 当在元素上释放鼠标按钮时触发。
onmousewheel script 当鼠标滚轮正在被滚动时运行的脚本。
onscroll script 当元素滚动条被滚动时运行的脚本。

 Media 事件

属性 描述
onabort script 在退出时运行的脚本。
oncanplay script 当文件就绪可以开始播放时运行的脚本(缓冲已足够开始时)。
oncanplaythrough script 当媒介能够无需因缓冲而停止即可播放至结尾时运行的脚本。
ondurationchange script 当媒介长度改变时运行的脚本。
onemptied script 当发生故障并且文件突然不可用时运行的脚本(比如连接意外断开时)。
onended script 当媒介已到达结尾时运行的脚本(可发送类似“感谢观看”之类的消息)。
onerror script 当在文件加载期间发生错误时运行的脚本。
onloadeddata script 当媒介数据已加载时运行的脚本。
onloadedmetadata script 当元数据(比如分辨率和时长)被加载时运行的脚本。
onloadstart script 在文件开始加载且未实际加载任何数据前运行的脚本。
onpause script 当媒介被用户或程序暂停时运行的脚本。
onplay script 当媒介已就绪可以开始播放时运行的脚本。
onplaying script 当媒介已开始播放时运行的脚本。
onprogress script 当浏览器正在获取媒介数据时运行的脚本。
onratechange script 每当回放速率改变时运行的脚本(比如当用户切换到慢动作或快进模式)。
onreadystatechange script 每当就绪状态改变时运行的脚本(就绪状态监测媒介数据的状态)。
onseeked script 当 seeking 属性设置为 false(指示定位已结束)时运行的脚本。
onseeking script 当 seeking 属性设置为 true(指示定位是活动的)时运行的脚本。
onstalled script 在浏览器不论何种原因未能取回媒介数据时运行的脚本。
onsuspend script 在媒介数据完全加载之前不论何种原因终止取回媒介数据时运行的脚本。
ontimeupdate script 当播放位置改变时(比如当用户快进到媒介中一个不同的位置时)运行的脚本。
onvolumechange script 每当音量改变时(包括将音量设置为静音)时运行的脚本。
onwaiting script 当媒介已停止播放但打算继续播放时(比如当媒介暂停已缓冲更多数据)运行脚本

 XSS payload变形

大小写


click me 

双写关键字

alert(/xss/)

引号

如果在HTML标签中,可以不用引号;如果在js中,可以用反引号代替单双引号






/ 代替空格

Tab与回车

在一些位置添加Tab(水平制表符)和回车符来绕过关键资检测


click me!
click me!

编码

HTML实体编码

click me!

URL编码

%3Cscript%3Ealert(/xss/)%3C/script%3E

防御方法

  • 对输入内容的特定字符进行编码
  • 使用http only对cookie进行限制
  • 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测
  • 后端接口也应该要做到关键字符过滤的问题

你可能感兴趣的