利用href触发XSS遇编码与截断问题求解决方案
XSS注入遇到字符编码与内容截断的解决方案
问题描述
尝试向href属性注入javascript:alert(1)触发XSS时遇到两种拦截情况:
- 直接注入原始代码,站点会对
<、:、>等特殊字符做URL编码(比如:被转成%3a),导致伪协议失效; - 对特殊字符做HTML编码(比如
:换成:),站点会直接删除编码内容及后续所有字符,截断后的参数只剩javascript。
两次尝试的元素代码
第一次注入原始代码后的元素
<a class="primary-navigation-action more js-analytics-event at-element-click-tracking" href="https://www.target.com/?trk=javascript%3aalert(1)&src=direct%2Fnone&veh=direct%2Fnone%7Cdirect%2Fnone" target="_blank" data-analytics-config="{"category":"External target","action":"click - Create campaign","label":"https://www.target.com/?trk=lms-7-5 - header","componentId":"actionable-content_1395275809"}"> Click here </a>
第二次HTML编码后被截断的元素
<a class="primary-navigation-action more js-analytics-event" href="https://www.target.com/accounts?src=direct%2Fnone&veh=direct%2Fnone%7Cdirect%2Fnone&trk=javascript" title="Create ad" target="_blank" data-analytics-config="{"category":"External target","action":"click - Create ad","label":"https://www.target.com/accounts - header","componentId":"actionable-content_1011291329"}"> Click here </a>
可行的绕过思路
- 大小写混淆绕过:尝试混合大小写的伪协议,比如
JaVaScRiPt:alert(1),部分过滤规则仅匹配全小写/全大写的协议字符串,可能失效。 - 双重URL编码:把
:做双重编码(:→%3a→%253a),构造javascript%253aalert(1)。如果后端仅做一次编码处理,前端JS解析URL时会自动解码两次,还原出有效伪协议。 - 伪协议替换:尝试其他可执行伪协议,比如
data:text/html,<script>alert(1)</script>(需浏览器支持且站点未限制伪协议范围),或者针对IE环境的vbscript:alert(1)。 - 事件属性注入:如果
href过滤严格,尝试注入onclick等事件属性(比如构造参数为onclick=alert(1)),需确认目标属性是否允许用户输入且未被过滤。 - Unicode转义:在支持JS解析的场景下,用Unicode转义字符代替
:,比如javascript\u003aalert(1),部分过滤逻辑可能未覆盖这类转义。 - 换行符分隔:尝试用URL编码的换行符
%0a或%0d分隔协议与代码,比如javascript%0a:alert(1),部分WAF可能允许这种格式。
内容的提问来源于stack exchange,提问作者aws abbadi
相关产品推荐
相关产品推荐

