注入的JS代码被服务器转为全大写时,如何利用XSS生成有效alert PoC?
解决方案
不需要额外开发“渲染前自动转小写”的绕过逻辑,针对服务端强制把响应文本转全大写的场景,最直接有效的方式是借助HTML实体编码,利用浏览器原生解析流程生成符合大小写要求的可执行JS代码。
核心原理:服务端的全大写转换只会修改字符串中的英文字母(小写转大写),对纯数字、特殊符号组成的HTML实体没有任何影响;浏览器解析页面时,会自动对script标签内部、HTML事件属性内部的内容做HTML实体解码,解码完成后才会把代码交给JS引擎执行,整个过程无需额外脚本介入。
可直接复用的PoC
只需要把要执行的JS代码中所有的小写英文字符,替换成对应的十进制HTML实体,再提交注入即可。比如要执行alert(document.cookie),不需要直接书写小写字母,拼接后的注入内容为:
<script>alert(document.cookie)</script>
这段注入内容里没有任何小写英文字母,服务端的大写转换逻辑不会对其做任何修改,会原封不动输出到响应中;浏览器解析时会自动把所有实体解码为对应的小写字符,最终script标签内生成的可执行代码就是标准的alert(document.cookie),可正常触发弹窗。
其他场景的备选思路
- 如果服务端逻辑是先把用户输入的HTML实体解码、再做全大写转换、最后输出,可以换用HTML事件的注入向量:比如构造
<IMG SRC=# ONERROR=alert(1)>形式的内容,利用浏览器对属性值的原生解析完成实体解码,不受服务端处理顺序的影响。 - 完全使用大写字符、数字、符号构造注入内容,顺着JS原型链定位到全局Function构造器,动态生成需要执行的代码字符串:全程不需要书写小写关键字,即使服务端把所有内容转全大写,也不会破坏代码的执行逻辑。
测试注意事项:优先确认服务端的大写转换范围,避免把需要保留的大写字符误转成实体,导致PoC失效。
内容的提问来源于stack exchange,提问作者Mr.Laf
相关产品推荐
相关产品推荐

