xss-跨站脚本攻击漏洞

前备知识:

Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术,它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。

**Cookie**

  • Cookie是一种由服务器发送到客户端(通常是用户的浏览器)的小型数据块。它以文本文件的形式存储在客户端,并在后续对同一服务器的请求中自动携带回服务器。

  • **特点**

  • 存储容量有限:通常每个cookie大小限制为4KB左右。

  • 安全性较低:因为存储在客户端,理论上可以被用户查看、修改或删除;并且在网络传输中如果不加密,容易被截获。

  • 有效期可设置:可以设置为会话级别的(浏览器关闭时失效),也可以设置一个具体的过期时间。

  • 可跨域访问控制:通过`SameSite`属性等机制控制是否允许跨域携带。

  • **用途**

  • 用户认证:例如保存登录状态标识符。

  • 个性化设置:如用户偏好、主题选择等。

  • 购物车功能:记录用户临时添加的商品信息。

**Session**

  • Session是服务器端的一种技术,用于维护特定用户的信息集合,这些信息存储在服务器上,而不是客户端。

  • **工作原理**

  • 当用户首次访问服务器时,服务器为其创建一个唯一的Session ID,并将这个ID通过Cookie或者URL重写的方式传递给客户端。

  • 客户端在后续请求时,会将这个Session ID发送给服务器,服务器根据ID从内存、数据库或其他存储介质中查找对应的Session数据。

  • 服务器通过验证Session ID的有效性来识别不同的用户会话。

-**特点**

  • 数据安全:服务器端存储,相比Cookie更不易受到攻击和篡改。

  • 存储空间大:不受限于4KB的大小限制,理论上可以根据服务器资源存储更多数据。

  • 生命周期:Session默认生命周期通常依赖于服务器端配置,当用户一段时间内无活动后,Session可能会超时自动销毁。

  • **用途**

  • 用户认证和授权:保存登录用户的身份信息和权限数据。

  • 保持会话状态:如购物车内容、页面间的跳转状态等。

总结来说,Cookie与Session都是为了追踪用户状态而存在的,但Cookie是基于客户端存储的机制,而Session则是基于服务器端存储的机制。两者结合使用可以提供灵活且相对安全的用户会话管理方案。

xss简介

XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web应用程序安全漏洞。它允许恶意攻击者将恶意的客户端脚本(通常为JavaScript)注入到原本无害的网页中,当其他用户浏览这些页面时,嵌入其中的恶意脚本会在用户的浏览器上执行,从而可能窃取用户的敏感信息、模拟用户操作、破坏网站或者进行重定向等。

XSS攻击分类:

  1. 反射型XSS (Non-Persistent / Type-I)

    • 攻击者构造包含恶意脚本的URL或其他形式的用户输入,然后诱骗用户点击或访问。
    • 服务器接收到请求后,没有正确过滤和转义用户输入,直接将其包含在响应中返回给浏览器。
    • 浏览器解析并执行了这个恶意脚本。
  2. 存储型XSS (Persistent / Type-II)

    • 攻击者将恶意脚本提交至Web应用,如评论区、论坛帖子或个人资料中。
    • 服务器端将该脚本存储在数据库或文件系统中。
    • 当其他用户访问显示包含恶意脚本内容的页面时,服务器会从持久化存储中取出数据并在HTML页面中渲染,导致恶意脚本被执行。
  3. DOM Based XSS (Type-0 or DOM XSS)

    • 在这种类型的XSS中,不是由服务器直接输出未过滤的数据造成的,而是由于客户端JavaScript代码处理不安全的输入,并基于此动态修改了DOM(文档对象模型),使得恶意脚本得以执行。
    • 即使服务器对所有输出进行了严格的过滤,如果前端JavaScript代码没有正确验证和转义来自不可信源的数据,仍可能导致DOM-Based XSS漏洞。

XSS漏洞的危害:

  • 窃取用户的Cookie和其他认证信息,用于账户劫持。
  • 控制用户的浏览器进行钓鱼攻击、点击劫持等。
  • 操纵用户界面,展示虚假内容欺骗用户进行非法操作。
  • 在用户浏览器上植入恶意软件。

防止XSS漏洞的方法:

  • 对所有用户提供的输入进行严格的过滤和转义,确保它们不会被当作HTML或JavaScript代码执行。
  • 使用HTTP头部Content-Security-Policy (CSP)来限制加载外部资源和执行内联脚本。
  • 对于持久化数据,实施严格的输入验证与清理策略。
  • 使用HTTP-only标志保护敏感的Cookie不被JavaScript访问。
  • 在前端代码中同样谨慎处理DOM操作,确保不会引入新的DOM-based XSS风险。

xss漏洞检测和利用

XSS漏洞检测:

  1. 手动检测:

    • 输入测试: 检查所有用户可控的输入点,包括URL查询参数、表单字段、HTTP头部等,并尝试注入基础的XSSPayload(如<script>alert(1)</script>)以查看是否能在浏览器中执行。
    • 动态分析: 使用Burp Suite、OWASP ZAP或类似的代理工具进行中间人攻击模拟,拦截并篡改请求数据,观察服务器响应内容是否对注入的脚本进行了正确过滤。
  2. 自动化扫描:

    • 工具检测: 使用专门的安全扫描器如Nessus、Acunetix、Burp Suite中的Scanner模块、或者ppmap这样的专用XSS检测工具,这些工具会自动发送大量预定义的Payload,寻找潜在的XSS漏洞。
    • 代码审计: 对Web应用程序源代码进行静态分析,查找可能存在的不安全的数据输出位置,确保所有输出到HTML上下文的数据都经过了适当的转义或编码。

XSS漏洞利用:

  1. 获取敏感信息:

    • Cookie窃取: 利用反射型或存储型XSS,构造一个可以将受害者的Cookie信息发送给攻击者服务器的恶意脚本,从而实现账户劫持。
    • DOM-Based XSS: 攻击者通过修改页面DOM结构,获取或操作用户的敏感信息。
  2. 会话劫持与持久化控制:

    • Session Hijacking: 获取用户的有效Session ID后,攻击者可以直接使用该ID登录受害者的账户。
    • 持久化植入: 存储型XSS允许攻击者在目标网站上留下长期有效的恶意脚本,持续影响访问该页面的其他用户。
  3. 钓鱼和社会工程学攻击:

    • 界面伪装: 改变网页内容,欺骗用户点击恶意链接或提供个人信息。
    • 重定向攻击: 通过XSS漏洞将用户重定向到恶意站点,进一步实施攻击。
  4. 更高级的利用:

    • 点击劫持(Clickjacking): 隐藏恶意操作在正常页面之下,诱导用户点击。
    • 浏览器插件/扩展攻击: 利用某些浏览器特性或漏洞,通过XSS发动针对浏览器插件或扩展的攻击。

XSS漏洞的防御和绕过

推荐xss靶场以及pikachu靶场.

此处以xss-labs为例:

html事件:HTML 事件 | 菜鸟教程

常用payload:<script>alert(1)</script>

用于检测过滤的payload: " sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106

bypass:

绕过htmlspecialchars()函数,也可叫做实体化函数

htmlspecialchars()函数,会将输入的特定字符进行为html实体。

&:转换为&amp;

":转换为&quot;

':转换为成为 '

<:转换为&lt;

>:转换为&gt;

常见绕过:

1.绕过htmlspecialchars实体化函数

1.使用onfocus事件

onfocus 事件是在 HTML 元素获得焦点时触发的事件。当用户点击或选择某个元素,使其成为当前活动元素时,就会触发 onfocus 事件。例如再次点击输入框.

实例:οnfοcus=javascript:alert(1)

2.使用onblur事件

onblur 事件 是在 HTML 元素失去焦点时触发的事件。当用户从一个元素切换到另一个元素或点击页面空白区域时,原本获得焦点的元素就会触发 onblur 事件。例如点击输入框后,在点击输入框外部。

实例:οnblur=javascript:alert(1)

2.script标签,以及on关键字被过滤:

1.大写绕过:scRipt,On

2.a标签

<a> 标签定义超链接,用于从一张页面链接到另一张页面。

<a> 元素最重要的属性是 href 属性,它指示链接的目的地。

实例: <a href=javascript:alert("qiushuo")>test</a>

3.iframe标签

<iframe> 标签定义行内框架(内联框架)。

实例:<iframe src="javascript:alert(1)">test</iframe>

4.当script被替换为空时:

在script中再写script: scrscriptipt

3.当写入内容在href属性中:

以上关键字都被过滤的时候,可以使用burpsuite的html编码器

例如:javascript:alert(1)的html编码

payload:

复制代码
&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;
下面是实例
<a href=&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>xss<a>

当输入有限制的,比如必须有"http:"元素,把该元素//然后放在后面如下

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x31;&#x27;&#x29;//http://

4.隐含参数

此处name属性对应的值也可能是get/post传参的参数。

5.隐藏注入点

一些隐藏注入点因为插入的数据可能被隐藏,一般不要急着注入,先看源码

referer:"type="text" οnclick="alert(1)"起插入作用

插入后:

user-agent也可能为注入点

payload:"type="text" οnclick="alert(1)"

不过payload并未绝对,还是要依靠实际情况而定

cookie为注入点

hackerbar

此次payload就不同:user="type="text" οnclick="alert(1)"

6.特殊框架注入

iframe框架

iframe调用的文件地址失效,无法进行测试。要考的应该是通过修改iframe调用的文件来实现xss注入,修改src引用的文件或者地址即可。

7.ng-include

ng-include 指令用于包含外部的 HTML 文件。包含的内容将作为指定元素的子节点。

ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件

需要包含在同一个域名下。

复制代码
payload='level1.php?name=test<img src=1 οnerrοr=alert(1)>'

onerror:如果在加载图片时发生错误则执行

8./、空格进行了转换

回车符 %0a

<img%0asrc=123%0aοnerrοr=alert(1)>

9.embed标签

<embed> 标签定义了一个容器,用来嵌入外部应用或者互动程序(插件)。

防御:

就是找好过滤工作,尽量不使用会有威胁的函数。

相关推荐
遗憾随她而去.30 分钟前
前端浏览器缓存深度解析:从原理到实战
前端
万行1 小时前
企业级前后端认证方式
前端·windows
2501_948120151 小时前
基于Vue 3的可视化大屏系统设计
前端·javascript·vue.js
Jinuss1 小时前
源码分析之React中createFiberRoot方法创建Fiber根节点
前端·javascript·react.js
Jinuss2 小时前
源码分析之React中ReactDOMRoot实现
前端·javascript·react.js
web守墓人2 小时前
【前端】vue3的指令
前端
想起你的日子3 小时前
EFCore之Code First
前端·.netcore
框架图3 小时前
Html语法
前端·html
深耕AI3 小时前
【wordpress系列教程】07 网站迁移与备份
运维·服务器·前端·数据库