网络安全之xss攻击

Hello, 欢迎登录 or 注册!

/ 0评 / 1

本文作者:  本文分类:hacker  浏览:757
阅读时间:1886字, 约2-3分钟

跨站脚本攻击(Cross-site scripting,XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。若受害者运行这些恶意代码,攻击者就可以突破网站的访问限制并冒充受害者。根据开放式 Web 应用安全项目(OWASP),XSS 在 2017 年被认为 7 种最常见的 Web 应用程序漏洞之一

引用自MDN(https://developer.mozilla.org/zh-CN/docs/Glossary/Cross-site_scripting)

这是一种很常见的漏洞,也非常好利用。它一般产生于“来源不可靠的链接”,从而在页面中注入恶意代码。

据我所知LPDict就有这个漏洞,但由于没什么利用价值所以我也一直懒得去修复。我们先借此做一个demo帮助大家理解。

演示

LPDict地址(顺便说一句,为了方便各位网课期间使用,网页端也已开放):https://lp.hywiki.xyz/app.php

正常查一个词的结果是这样的:https://lp.hywiki.xyz/app.php?word=lp

但是如果利用了漏洞,我们现在查询“<script>window.location.href="https://blog.nth.ink"</script>”,就会得到如下的结果:https://lp.hywiki.xyz/app.php?word=%3Cscript%3Ewindow.location.href=%22https://blog.nth.ink%22%3C/script%3E

是不是直接跳转到blog.nth.ink去了?

你可能会说,这有什么用啊?用户不查不就行了?

其实啊,确实不是给你用的,但是如果有坏人给你发来了一个恶意链接,包含以上的内容,那你的搜索页面是不是秒变“跳转”页面?如果跳转的地址是一些不好的网站,可能还会对你造成影响。

如果这还不够吓人,你还可以这么想:上面我们是执行了一段跳转的代码,那如果是执行的获取cookie并通过xhr发送到对方的服务器上呢?那你的登录状态等就被对方得到了,从而造成危险。

说起原理,那就再简单不过了吗,看一眼view-source,立马就能明白。

<h1 id="searchtitle">Search Results for "<script>window.location.href="https://blog.nth.ink"</script>"</h1>

就是这一小段代码,一看就知道为什么了。后端程序直接把搜索的结果放到了h1标题里面,导致h1里面包含了一个script标签。当浏览器解析到这里的时候,遇到<script>,便去执行了这段JavaScript代码,代码的内容是跳转,于是浏览器照做,你就可以看到是进行了跳转。

预防

预防非常简单,你看到导致问题的原因以后就应该立马知道了。在这种要直接展示用户在参数中给出的数据的时候,一定要进行HTML特殊字符转义或类似的操作!不要嫌麻烦,包括php、asp在内的许多语言都提供了这个功能,如果你用的是react等前端框架,那最好了,它们一般都自带有这个功能。

在这次的案例中,只要在后端将字符串转义就行。转移后的字符串如下,就可以完美规避这个问题。

&lt;script&gt;window.location.href=&quot;https://blog.nth.ink&quot;&lt;/script&gt;

如果你觉得没必要,那就错了。先不说风险,如果不做这一步,用户输入触及到<>这些符号的时候很容易就会把html解析器搞晕,最终可能会打乱呈现出的界面,影响用户体验。同样的还有表单处理等,转义是一定要做的。

除了今天讲到的这一种,还有利用a标签的href属性的,各位自己理解啦!

其实也不只是这样一种产生方式。比如张三在E站写文,但他发现了E站编辑器的漏洞,从而在文章中加入了恶意代码。这时数据已经是存储在数据库里了,导致之后每一个打开这篇文章的人都会执行该代码,这个危害就要大不少。

结尾

我觉得用一些比较专业的方法来讲其实没有什么必要,大家只要知道还能这样,以后注意不要在自己的项目上跳坑就行。如果大家喜欢,后面两天再来写写SQL注入(与xss有几分类似)和CSRF攻击(跨站)等内容。SQL注入与xss很像,都是用户输入来欺骗这些语言,只不过一个是HTML一个是SQL;但这个顶多影响前端和用户,SQL注入就凶险的多,完全可以把数据库搞炸,因此不得不防。说句实话,这几篇的内容我和559还有873很久以前都口头讲过,这次只是落实到笔头跟大家分享一下而已。

关于作者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注