xss总结

目录

xss

xss分类

各种类型xss的数据流向

XSS危害

xss示例

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

总结及原理

示例

实战

[Ma Spaghet!](#Ma Spaghet!)

Jefff

[Ugandan Knuckles](#Ugandan Knuckles)

[Ricardo Milos](#Ricardo Milos)

[Ah That's Hawt](#Ah That's Hawt)

Ligma

Mafia

[Ok, Boomer](#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

相关推荐
一拳不是超人34 分钟前
一个没测暗色模式的 Bug,吃掉了我一半 谷歌扩展用户
前端·javascript·程序员
liangshanbo12151 小时前
React useState 函数式更新面试题整理
前端·react.js·前端框架
涛涛ing1 小时前
为什么你的页面在 Safari 上总出问题?Interop 2027 正在解决这个 20 年老毛病
前端
不一样的少年_1 小时前
WebP 压缩到底在干嘛?小白也能看懂的原理拆解
前端·后端·图片资源
问心无愧05131 小时前
ctf show web 177
前端·笔记
不一样的少年_1 小时前
PNG/JPG 如何变成 WebP?真相不是改后缀!
前端·后端·图片资源
杉氧1 小时前
RN 性能调优指南:重渲染(Re-renders)控制与长列表(FlatList)优化
android·前端·react native
一_个前端1 小时前
[JS] 一站式搞定 PDF、图片、Dom弹窗、表格的浏览器打印功能
前端
JavaGuide1 小时前
阿里 Qoder 又开源了一个专门给 Claude Code、Codex 做“体检”的项目
前端·后端
不一样的少年_1 小时前
JPEG 压缩到底在干嘛?小白也能看懂的 8 步拆解
前端·后端·图片资源