xss总结

目录

xss

xss分类

各种类型xss的数据流向

XSS危害

xss示例

XSS向量编码和浏览器解析机制

总结及原理

示例

实战

Ma Spaghet!

Jefff

Ugandan Knuckles

Ricardo Milos

Ah That's Hawt

Ligma

Mafia

Ok, Boomer


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状态中的字符引用”和“属性值状态中的字符引用”。

例如,下面问题中,“<”和“>”字符被编码为“&#60”和“&#62”。当解析到“&#60”和“&#62”时处于数据状态,会认为是普通的字符串而不是标签开始状态,这就是数据状态的字符引用

<div>&#60;img src=x οnerrοr=alert(4)&#62;</div>   //不被识别

这里要提一下RCDATA的概念。要了解什么是RCDATA,我们先要了解另一个概念。在HTML中有

五类元素如下:

  1. 空元素,不能容纳任何内容(因为它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)。如<area>, ,<base>等等

  2. 原始文本元素,可以容纳文本。有<script>和<style>

  3. RCDATA元素,可以容纳文本和字符引用。有<textarea>和<title>

  4. 外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释,例如MathML命名空间或者SVG命名空间的元素

  5. ,基本元素,可以容纳文本、字符引用、其他元素和注释,即除了以上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>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>
数据状态不识别标签,不执行

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">

先HTML解码再URL解码,可以解析

<div>&#60;img src=x οnerrοr=alert(4)&#62;</div>
无法解析,数据状态字符引用不识别<>

<textarea><script>alert(6)</script></textarea>

RCDATA状态字符引用

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></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,从而实现页面跳转或刷新。

  • 在这段代码中,location 被用来改变当前页面的 URL。代码试图通过将 location 设置为一个 javascript: URL 协议来执行 JavaScript 代码。

    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

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值