目录
xss
跨站脚本攻击XSS(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
xss分类
存储型:持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将存储在服务器中,用户访问该页面的时候触发代码执行。这中xss比较危险
DOM型:不经过后端,DOM-XSS漏洞是基于文档对象模型(DOM)的一中漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型xss。
反射型:非持久化,需要欺骗用户自己去点击链接才能触发xss代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型xss大多数是用来盗取用户的Cookie信息。
各种类型xss的数据流向
反射型xss的数据流向:前端-->后端-->前端
存储型xss的数据流向:前端-->后端-->数据库-->后端-->前端
DOM型xss的数据流向:前端-->浏览器
XSS危害
➢ 盗取各种用户账号
➢ 窃取用户Cookie资料,冒充用户身份进入网站
➢ 劫持用户会话,执行任意操作
➢ 刷流量,执行弹窗广告
➢ 传播蠕虫病毒
➢ 攻击者能在一定限度内记录用户的键盘输入
xss示例
<script>alert(1)</script> <script>confirm(1)</script> <script>prompt(1)</script>
<img src=1 οnerrοr=alert(1);> <img src=1 οnerrοr=alert("xss");>
<input οnblur=alert(1) autofocus><input autofocus>
XSS向量编码和浏览器解析机制
总结及原理
浏览器解码顺序:html(&#)---url(%)---unicode(js)(\u)
html解析机制:标签开始状态---标签名状态---数据状态
在解析过程中,任何时候它只要遇到一个'<'符号(后面没有跟'/'符号)就会进入“标签开始状态(Tag open state)”。然后转变到“标签名状态(Tag name state)”,最后进入“数据状态(Data state)”并释放当前标签的token。当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。
有三种情况可以容纳字符实体,“数据状态中的字符引用”,“RCDATA状态中的字符引用”和“属性值状态中的字符引用”。
例如,下面问题中,“<”和“>”字符被编码为“<”和“>”。当解析到“<”和“>”时处于数据状态,会认为是普通的字符串而不是标签开始状态,这就是数据状态的字符引用
<div><img src=x οnerrοr=alert(4)></div> //不被识别
这里要提一下RCDATA的概念。要了解什么是RCDATA,我们先要了解另一个概念。在HTML中有
五类元素如下:
-
空元素,不能容纳任何内容(因为它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)。如<area>, ,<base>等等
-
原始文本元素,可以容纳文本。有<script>和<style>
-
RCDATA元素,可以容纳文本和字符引用。有<textarea>和<title>
-
外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释,例如MathML命名空间或者SVG命名空间的元素
-
,基本元素,可以容纳文本、字符引用、其他元素和注释,即除了以上4种元素以外的元素
对RCDATA有个特殊的情况。在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”。在这个状态中,如果遇到“<”字符,它会转换到“RCDATA小于号状态”。如果“<”字符后没有紧跟着“/”和对应的标签名,解析器会转换回“RCDATA状态”。这意味着在RCDATA元素标签的内容中(例如<textarea>或<title>的内容中),唯一能够被解析器认做是标签的就是“</textarea>”或者“</title>”。
示例
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>
解析不了URL 编码 "javascript:alert(1)”
.<a href="javascript%3aalert(3)"></a>
协议为‘’JavaScript;” 不能解析
<script>alert(9);</script>
数据状态不识别标签,不执行
<a href="javascript:%61%6c%65%72%74%28%32%29">
先HTML解码再URL解码,可以解析
<div><img src=x οnerrοr=alert(4)></div>
无法解析,数据状态字符引用不识别<>
<textarea><script>alert(6)</script></textarea>
RCDATA状态字符引用
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a> //可以解析html--URL--unicode
<script>alert('13\u0027)</script>
编码符号不识别 不执行 其他编码方式也不行
实战
网址:XSS Game - Learning XSS Made Simple! | Created by PwnFunction
Ma Spaghet!
输入后没有弹窗
问题出在innerhtml,查询
优化建议使用innerTEXT
Jefff
使用了innertext
人话---innerText
是一个用于获取或设置元素中纯文本内容的属性。与innerHTML
不同,innerText
只处理文本内容,不会包含任何HTML标签或子元素的标记。
标签被限制就不适用新标签,闭合
Ugandan Knuckles
替换<>
使用上个代码,结果如下,这样不识别
<input type="text" placeholder="111";alert(1137); class="form-control">
用常用的方法onclick
wey=111"%20οnclick="alert(1337); //可以执行,但不允许用户交互,不通过
使用onfocus焦点和autofocus聚焦
?wey=111"%20οnfοcus=alert(1337);%20autofocus="
Ricardo Milos
两秒后后自动提交,action可以执行js
Ah That's Hawt
替换了如上一堆符号,最先想到编码,使用location
关于location的解释
-
location
是 JavaScript 中的一个全局对象,代表当前页面的 URL。通过操作location
对象,开发者可以获取或修改当前页面的 URL,从而实现页面跳转或刷新。 -
在这段代码中,
javascriptlocation
被用来改变当前页面的 URL。代码试图通过将location
设置为一个javascript:
URL 协议来执行 JavaScript 代码。复制代码
location="javascript:alert(1337)"
-
这个表达式的意思是,将浏览器重定向到一个
javascript:
协议的 URL,并在其中执行alert(1337)
,即弹出一个显示 "1337" 的提示框。 -
%2528
是 URL 编码的一部分。 -
%
后面的数字表示 ASCII 字符的十六进制编码。具体来说:%25
是字符%
的编码。%28
是字符(
的编码。
-
在这个 URL 中,
%2528
实际上表示(%28)
的 URL 编码形式。第一次解码后,%2528
变成%28
,进一步解码后,%28
才变成(
。 -
也就是说,
%2528
是经过两次编码的字符(
。这个双重编码的目的是为了绕过某些简单的安全过滤器,防止代码被识别和过滤。
Ligma
替换,继续编码
JSFuck - Write any JavaScript with 6 Characters: []()!+
在URL编码
Mafia
使用Function构造函数source.tolowercase转小写
或转30进制
第三种,location.hash截取井号后面,slice(1)从第一位开始截取
Ok, Boomer
DOM破坏,用a标签时href自动调用tostring方法取出当中字符串
settimeout可以把函数当做字符串放入并执行,javascript被过滤换成tel