跨站脚本漏洞(XSS)基础

什么是跨站脚本攻击XSS

跨站脚本(cross site script),为了避免与样式css混淆所以简称为XSS,是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。

什么是XSS?XSS是指恶意攻击者利用网站没有对用户提交的数据进行转义处理或者过滤不足的缺点,往Web页面里插入恶意Script代码;当其他用户浏览该页面时,嵌入的Script代码会被执行,从而达到恶意攻击用户的目的。

XSS根源就是利用了系统对用户的信任,没完全过滤客户端提交的数据。

xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export。
 

xss分类(三类)

  • 反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

  • 存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie。

  • DOM型XSS:<不经过后端>,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。 

反射型XSS

攻击代码在URL里,输出在http响应中。黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。

简单例子:

正常发送消息:

http://www.test.com/message.php?send=Hello,World!

接收者将会接收信息并显示Hello,Word

非正常发送消息:

http://www.test.com/message.php?send=<script>alert(‘hack!’)</script>!

接收者接收消息显示的时候将会弹出警告窗口:

这个弹窗并没有什么实际的意义,但说明该网站存在反射性XSS漏洞,恶意Script代码可以成功植入;当我们换成一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。

反射型的XSS漏洞的数据流向是: 前端-->后端-->前端

反射型XSS漏洞攻击场景模拟:

Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点需要Alice使用用户名/密码进行登录,并存储了Alice敏感信息(比如银行帐户信息)。
Tom 发现 Bob的站点存在反射性的XSS漏洞
Tom编写了一个包含恶意代码的URL,并利用各种手段诱使Alice点击
Alice在登录到Bob的站点后,浏览了 Tom 提供的URL
嵌入到URL中的恶意脚本在Alice的浏览器中执行。此脚本盗窃敏感信息(cookie、帐号信息等信息)。然后在Alice完全不知情的情况下将这些信息发送给 Tom。
Tom 利用获取到的cookie就可以以Alice的身份登录Bob的站点,如果脚本的功更强大的话,Tom 还可以对Alice的浏览器做控制并进一步利用漏洞控制。

存储型XSS

攻击代码在服务器端(数据库),输出在http响应中。
比较常见的场景是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客的用户,都会在他们的浏览器中执行这段恶意js代码。

简单例子:

存储型XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。例如留言板

留言板表单中的表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>

正常操作:

用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用去数据并显示。

非正常操作:

攻击者在value填写<script>alert(‘foolish!’)</script>【或者html其他标签(破坏样式。。。)、一段攻击型代码】

此数据将会存储到数据库中;

其他用户取出数据显示的时候,将会执行这些攻击性代码。

一次提交之后,每当有用户访问这个页面都会受到XSS攻击,因此持久的XSS相比非持久性XSS攻击危害性更大,隐蔽性也更好。

存储型XSS的数据流向是:前端-->后端-->数据库-->后端-->前端

存储型XSS漏洞攻击场景模拟:

Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。
Tom检测到Bob的站点存在存储型的XSS漏洞。
Tom在Bob的网站上发布一个带有恶意脚本的热点信息,该热点信息存储在了Bob的服务器的数据库中,然后吸引其它用户来阅读该热点信息。
Bob或者是任何的其他人如Alice浏览该信息之后,Tom的恶意脚本就会执行。
Tom的恶意脚本执行后,Tom就可以对浏览器该页面的用户发动一起XSS攻击

DOM型XSS

从效果上来说,也属于反射型XSS;攻击代码在URL里,输出在DOM节点中。

当用户能够通过交互修改浏览器页面中的DOM(DocumentObjectModel)并显示在浏览器上时,就有可能产生这种漏洞。

简单例子

<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
…
</HTML>

这个例子是个欢迎页面,name是截取URL中get过来的name参数

正常操作:

http://www.vulnerable.site/welcome.html?name=Joe

非正常操作:

http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>

将产生xss条件,让我们看看为什么:受害者的浏览器接收到这个链接,发送HTTP请求到www.vulnerable.site并且接受到上面的HTML页。受害者的浏览器开始解析这个HTML为DOM,DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改你的HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,然后立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它,这就产生了xss的条件。

DOM型XSS的数据流向是: 前端-->浏览器

总结

从以上我们可以知道,存储型的XSS危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL。

XSS防御的总体思路是:

不相信用户提交的数据,过滤过滤过滤!

对用户的输入(包括URL参数)进行过滤,对输出进行html编码。

也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。

参考:

https://www.jianshu.com/p/4fcb4b411a66

https://blog.csdn.net/extremebingo/article/details/81176394

https://blog.csdn.net/qq_35393693/article/details/86597707

https://www.cnblogs.com/phpstudy2015-6/p/6767032.html



原文地址:https://www.cnblogs.com/xulan0922/p/14075490.html