在处理HTML注入时,有一个有趣的技巧可以使XSS攻击起作用。为了说明这种技术,我们将使用以下内容,作为小型挑战发推文:
#XSS迷你挑战https://t.co/rlInsfDTah,
解决方案在下周六的#blogpost中。pic.twitter.com/UtL39rxy3D
代码简短而且非常简单,使用现实场景的关键元素构建:
brutelogic.com.br/tests/newsletter.php
与明显的输入相反,在这段代码中我们有一个PHP_SELF 漏洞,这使我们能够在不提供任何参数的情况下注入URL:
当我们注入标记属性时,我们试图突破它而没有成功,因为关闭标记并开始新标记所需的大于号(>)被替换为减号( - ):
因此,我们将尝试使用事件处理程序来使用内联注入:
再次没有成功,但这次是因为javascript块(第11行到第17行)清理了每个字符串,其中“on”跟随或不是间隔字符(%09 %0A,%0C,%0D或%20)和document.location.href(第15行)中的等号(=),即处理URL的属性。
javascript函数eventFilter()在文档主体加载时调用(第3行),操作在运行时构建的页面(参见 DOM),因此尽管它在源上正确反映,但注入不起作用。
但是如果我们创建一个任意属性并且只是保持其值打开,那么注入后的所有代码都将被更改为其值:
这样,只有当浏览器的HTML解析器找到下一个单引号(')时才会关闭“1”属性,该引用位于“Don’t be evil”这个短语上。我们注入的表单标记将在下一个大于符号(>)中关闭,该标记位于</ h6>标记中。
输入字段与提交按钮一起消失,javascript函数完全禁用(全部从第8行到第18行)。因为在页面中没有更多元素可以交互,“style”属性也被“ - ”替换,我们不能在我们的目标标记之后注入任何东西,我们无法触发我们提供的事件处理程序(并且没有在不可知的事件处理程序)。
所以这是最后一招。在当前的Firefox浏览器中,我们有以下处理程序,在源代码中只需要一个脚本块来触发它们:
onafterscriptexecute
onbeforescriptexecute
但要达到挑战的最后(在页面的congrats.js脚本中)
if (brute)
alert(“Congratz, buddy!”);
else
alert(“Almost there, try again.”);
我们只能使用后者: