9.2、对跨站脚本攻击(xss)进行混淆代码测试
在前面的小节中,我们遇到了一种过滤机制,他会自动删除一些常见的JavaScript标签。
<script> 不是XSS攻击的唯一标签,另外JavaScript代码在大小写和结构方面和HTML具有相似性,一些过滤器会去试图限制一些JavaScript代码,如:alert,cookie和document等。
在这小节中,我们将学习一种比较有趣的方法,即使用JSFuck来混淆代码(http://JSFuck.com)。
实战演练
在这小节中,我们将使用到已包含在OWASP BWA中的一个应用程序作为虚拟机:
1. 首先,我们在应用程序处的XSSmh菜单处选择XSS沙盒。在这里,我们可以使用自定义类型设置一个易受XSS攻击的字段。
2. 在我们这个例子中,我们将使用最后一个级别:区分大小写,匹配关键字,删除重复字段。
3. 在参数设置中,我们需要加入一个关键字或字符匹配的黑名单,如:alert,doucument,cookie,href,location,src。这将极大的限制攻击者利用应用程序的行为。
4. 具体输入部分,如下图所示:
5. 现在测试一个普遍使用的弹框出COOKIE信息的命令,如下:
正如你所见,它并不会执行弹框。这是因为你刚才设置的过滤机制的原因。
6. 为了绕过这种保护,我们需要找到一种方法来混淆代码,使其得到验证机制的批准,并且仍然被浏览器识别和执行。这就是JSFuck发挥作用的地方了。在你的浏览器中,打开http://jsfuck.com这个网站。该站点描述了这种语言以及它是如何生成的只有六个不同字符的JavaScript代码,也就是:
7. 你还会发现这个站点有一个表单可以将普通JavaScript转换为JSFuck表示。尝试转换alert(document.cookie),这将是我们需要使用的攻击载荷。如下面的屏幕截图所示,这个简单的字符串生成了将近13000个字符的代码,这对于GET请求来说太多了,我们需要找到一种方法来减少这个数量:
8. 我们所能做的是不混淆整个有效载荷,而只是绕过限制的必要部分。确保Eval Source选项没有设置,并混淆以下字符串:
9. 现在,我们将把混淆的代码集成到一个完整的有效载荷中。由于JSFuck输出被JavaScript引擎解释为文本,因此我们需要使用eval函数来执行它。最终有效载荷如下:
<script>eval("al"+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+"('XSS
10. 在注入字符串中插入有效负载并单击Inject。代码的执行方式如下:
原理剖析
通过混淆有效载荷,我们能够绕过基于单词和字符识别的安全机制。我们选择使用JSFuck语言来混淆代码,因为它实际上就是JavaScript。
JSFuck通过操作布尔值和预定义常量来形成可打印字符来混淆代码,例如,获得字符a: