浅谈 跨站脚本攻击(XSS)
一、概述
1、什么是跨站脚本攻击
不同于大多数攻击(一般只涉及攻击者和受害者),XSS涉及到三方,即攻击者、客户端与网站。XSS的攻击目标是为了盗取客户端的cookie或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。
2、为什么简称XSS,而不是CSS
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
3、XSS漏洞成因
XSS漏洞成因是由于动态网页的Web应用对用户提交请求参数未做充分的检查过滤,允许用户在提交的数据中掺入代码,然后未加编码地输出到第三方用户的浏览器,这些攻击者恶意提交代码会被受害用户的浏览器解释执行。
4、举个例子
Hi,".$username."!"; ?> //这段PHP代码的主要作用是从URL获取用户输入的参数作为用户名,并在页面中显示“Hi,XXX”
(1)正常情况下:我们在url中输入: http://localhost/test.php?name=Sam
给参数name传一个值Sam,显示如下图

(2)那么,在非正常情况下呢(即:把传递给name的参数值改为一段可执行的Javascript代码)?
我们在url中输入:http://localhost/test.php?name=
如果我们后台没有进行任何关于传入参数值的过滤,会显示如下图结果

二、XSS生效方式
XSS主要有三种生效方式:(1)构造URL (2)发布内容式 (3)蠕虫式
1、生效方式:构造URL
XSS攻击者通过构造URL的方式构造了一个有问题的页面;当其他人点击了此页面后,会发现页面出错,或者被暗中执行了某些js脚本,这时,攻击行为才真正生效。
一般来说,动态页面中会将url中的部分内容回写在页面中。以百度的搜索为例,输入网址:http://www.baidu.com/s?wd=
搜索后会显示如下页面:

因为参数转义后的结果,搜索结果页中,会在标题中中和搜索框中回写用户输入的内容。
如果这里没有经过转义处理,则页面中就嵌入了一段script,并执行该代码,并弹出对话框提示用户。如果是其他恶意代码,则可能造成破坏。然后攻击者将此URL广为传播——比如说,以报错的方式发给百度的管理员,管理员打开这个URL就中招了。
下面我们来通过下图,图解XSS

举例
例1、
若未对XSS进行预防,
我们在URL中正常输入如下,搜索结果会如下图显示:beijing 的相关词条

如果在url中非正常输入如下的话,查看源码后input的value属性值会自动变为

若已对XSS进行了预防,
非正常输入后则会显示如下图:

例2、
若未对XSS进行预防,
在URL中输入红框中的值,搜索后则显示如下:

若已对XSS预防,
则搜索结果如下图:

2、生效方式:发布式内容
构造URL攻击方式传播范围有限,被攻击者只要有基本的安全意识就可以避免,因此这种手段的危险性比较小。相比之下,通过发表内容构造的XSS的危害就大了很多。
在可以发表内容的论坛、讨论区、吧、博客、微博等网站上,用户发表的内容会保存起来,允许其他用户浏览。这些保存的内容显示在页面上的时候,如果没有经过正确的处理,也会把攻击者精心构造的内容显示出来,访问该内容的用户就此中招。如果该页面流传广泛,则影响会更加深远。
拿 留言板举例
例、
留言板的任务是把用户留言的内容展示出来。正常情况下,用户的留言都是正常的语言文字,留言板显示的内容也就没毛病。
然而这个时候如果有人不按套路出牌,在留言内容中丢进去一行”
之后当浏览这条留言的时候,就会弹出如下信息框。

3、生效方式:蠕虫式
最暴力的方式是使用蠕虫——就是首先发一个有问题的文章,浏览者阅读时会被暗中执行恶意代码,发表一篇新的文章的,该文章也含有同样的恶意代码。这样有可能在最快时间内将攻击铺满整个网站。蠕虫式攻击将暗中偷偷摸摸的攻击行为变成了光明正大的攻城拔寨,极容易被发现和修复。
注:上面我们只是为了方便以弹窗举例,但是XSS攻击方式绝不是弹窗这么简单
三、XSS攻击实例
(1)XSS偷取用户信息
(2)XSS盗取Cookie
(3)XSS钓鱼网站
四、XSS的破坏方式
(1)破坏页面结构:用户输入的内容包含了html的标签,与前面的标签等闭合,导致页面的DIV结构发生变化,页面错乱。
(2)破坏显示内容:用户输入的内容包含了单引号或双引号,与前面的单引号或双引号匹配,导致后面的内容丢失,显示不出来。
五、XSS攻击 绕过过滤的一些简单方法
1、大小写绕过
这个绕过方式的出现是因为网站仅仅只过滤了
例:
如果我们在URL中输入: localhost/test.php?name=
,由于网站对
而如果我们输入: localhost/test.php?name=
,实质就是改变了

2、利用过滤后返回语句再次构成攻击语句来绕过
即我们输入一串原始值,网站将输入的原始值进行过滤,过滤后的值仍是一段可执行的代码。
例
如下图:将参数name值设为

,输入后仍会出现弹窗

类似的还有onclick,这个要点击后才能运行代码
4、编码脚本代码绕过关键字过滤。
有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。【eval()会将编码过的语句解码后再执行】
例
alert(1)编码过后就是\u0061\u006c\u0065\u0072\u0074(1),
所以构建出来的攻击语句http://localhost/test.php?name=
6、等等等············
六、如何防范 XSS攻击
(1)PHP里的htmlspecialchars()函数:把原生的html代码给变为符号实体
(2)下载htmlpurifier插件:对内容过滤处理,直接能删除html标签
具体请参考:如何全面防范网站的XSS攻击
(3)HttpOnly:https://www.cnblogs.com/softidea/p/6040260.html
(4)CSP
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218602.html原文链接:https://javaforall.net
