XSS


免责声明

本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.


相关文章

相关案例

相关工具

xss 平台

在线测试

  • http://demo.testfire.net/

  • https://juice-shop.herokuapp.com/#/search

  • https://xsschop.chaitin.cn/demo/

靶场

  • XSS 挑战-WalkThrough

payload

Tips

  • Firefox 关闭 xss 过滤器

    about:config 把 rowser.urlbar.filter.javascript 改为 false

  • chrome 关闭 xss 过滤器

    带参数启动 --args --disable-xss-auditor


基础

什么是 XSS

跨站点脚本 (XSS) 攻击是一种注入,Web 程序代码中对用户提交的参数未做过滤或过滤不严,导致参数中的特殊字符破坏了 HTML 页面的原有逻辑,攻击者可以利用该漏洞执行恶意 HTML/JS 代码、构造蠕虫、篡改页面实施钓鱼攻击、以及诱导用户再次登录,然后获取其登录凭证等。

XSS 攻击有 3 种类型:

  • 反射型 XSS : 通过网络浏览器从另一个网站运行恶意脚本的攻击

  • 存储型 XSS : 存储型是将注入的脚本永久存储在目标服务器上的攻击

  • 基于DOM的XSS : 一种在 DOM 结构中而不是在 HTML 代码中触发的 XSS。

XSS Payload

最基础的

在标签内部的

示例1

示例2

示例3

示例4

通过注释转义的

在 script 中

示例

在 script 中,但输出在字符串分隔值内,引号被反斜杠转义

示例

一行 JS 内多个值

示例

条件控制语句内的值

示例

反引号内的值

示例

用在其他功能点

文件名

exif 数据

SVG

markdown

xml

pyscript

  • https://github.com/pyscript/pyscript


绕过技巧

  1. 使用无害的 payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被 HTML 编码,是否标签被过滤,是否过滤 <> 等等;

  2. 如果过滤闭合标签,尝试无闭合标签的 payload <b,<i,<marquee 观察响应;

长度限制

绕过长度限制

内容检测

换行

过滤空格,用 / 代替空格

过滤关键字,大小写绕过

不闭合

拼接

双写关键字

有些 waf 可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过

替换绕过

过滤 eval 用 Function 代替

过滤 ('') 用 `` 代替绕过

过滤 alert 用 prompt,confirm,top'alert' 代替绕过 过滤空格 用 %0a(换行符),%0d(回车符),/**/ 代替绕过 小写转大写情况下 字符 ſ 大写后为 S(ſ 不等于 s)

利用 atob 绕过

利用 eval

利用 top

%00截断绕过

其它字符混淆

有的 waf 可能是用正则表达式去检测是否有 xss 攻击,如果我们能 fuzz 出正则的规则,则我们就可以使用其它字符去混淆我们注入的代码了,举几个简单的例子

可利用注释、标签的优先级等

通过编码绕过

过滤双引号,单引号

过滤括号

过滤url地址

javascript 伪协议绕过

无法闭合双引号的情况下,就无法使用 onclick 等事件,只能伪协议绕过,或者调用外部 js

输入会被大写化

先把纯文本字符转换为 HTML 实体字符, 然后对其进行 URL 编码, 最后用 SVG 标记的 onload 参数输出

U+2029 XSS

段落分隔符,即 U+2029,是用于字符分隔的 Unicode 值,但它是一个在网络上不常使用的字符。