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

相关推荐
jessezappy18 分钟前
jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js
前端·word·jquery·filesaver·word-export
旧林8431 小时前
第八章 利用CSS制作导航菜单
前端·css
yngsqq1 小时前
c#使用高版本8.0步骤
java·前端·c#
Myli_ing2 小时前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风2 小时前
前端 vue 如何区分开发环境
前端·javascript·vue.js
软件小伟2 小时前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾2 小时前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧2 小时前
TypeScript 的发展与基本语法
前端·javascript·typescript
hummhumm2 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
asleep7013 小时前
第8章利用CSS制作导航菜单
前端·css