什么是XSS攻击

一,什么是xss攻击

XSS全称Cross-Site Scripting。是一种注入攻击方式。攻击者将客户端脚本代码(如JS,AS,HTML,Flash等一切可被客户端执行的代码。互联网时代主要指javascript)注入目标网站,在正常用户访问受害网站时,浏览器执行这些恶意代码,实现一系列恶意行为。

注入的方式一般通过url或者input输入框将恶意代码提交至后台

二,xss攻击有哪些危害

当恶意脚本被执行时,可能获取用户的敏感cookie信息,从而获取用户权限。也可能引导用户至恶意网站页面等等。

三,xss攻击都有哪几类

1,存储型xss

攻击方式

被注入的恶意代码被存储在网站服务器。正常用户访问特定页面时,存储的恶意代码被输出执行导致的攻击。此种攻击危害较大,可能危及众多用户。

举例

有一个帖子评论区,用户A在评论框中输入了恶意脚本提交到后台。后台未做任何处理即存入数据库。当其它普通用户访问该帖子的评论时,该恶意脚本被当作正常评论从数据库中查询并返回给浏览器执行,导致这些用户遭受攻击。

防范方式

对web应用中每一处可能被输出的输入进行检查,并转义特殊字符

2,反射型xss

攻击方式

输入的恶意代码未经服务器处理即返回给浏览器展示执行的攻击方式。一般通过url参数输入。

举例

某电商网站有商品搜索框,当用户输入computer时,页面会返回已找到“computer”多少件提示语。其对应的url为:

www.xxx.com/query?name=computer

恶意用户A构造了一个恶意代码url:

www.xxx.com/query?name=<script>alert('i am malicious ')</script>

他将这个url以邮件等方式发给受害用户,诱骗其点击。受害用户点击后,服务器返回这段代码执行,从而达到攻击的目的。

防范方式

对web应用中每一处可能被输出的输入进行检查,并转义特殊字符

3,DOM型XSS

攻击方式

依然是通过url注入恶意代码,但是通过的是url的hash注入(因为url的hash是不会传入后台的)。他不是依赖http请求返回response到浏览器执行。而是基于页面自己的dom操作漏洞来达到攻击的目的。此种攻击方式由于不会传达到服务器,所以服务器所有的xss处理都将失效,其隐密性和危害更大

举例

某页面有如下dom操作代码

<script> document.write("<b>Current URL<b> : " + document.baseURI); </script>

如果构造如下恶意url请求该页面,即可注入恶意代码,且被以上dom操作代码执行恶意url如下:

http://www.example.com/test.html#<script>alert(1)</script>

可能遭受dom xss攻击的dom操作有:

* HTML Modification sinks
* 
    * document.write
    * (element).innerHTML

* HTML modification to behaviour change
* 
    * (element).src (in certain elements)

* Execution Related sinks
* 
    * eval
    * setTimout / setInterval
    * execScript

防范方式

The best way to fix DOM based cross-site scripting is to use the right output method (sink). For example if you want to use user input to write in a <div> element don’t use innerHtml, instead use innerText/textContent. This will solve the problem, and it is the right way to remediate DOM based XSS vulnerbilities.

It is always a bad idea to use a user-controlled input in dangerous sources such as  eval. 99% of the time it is an indication of bad or lazy programming practice, so simply don’t do it instead of trying to sanitize the input.

Finally, to fix the problem in our initial code, instead of trying to encode the output correctly which is a hassle and can easily go wrong we would simply use element.textContent to write it in a content like this:
<b>Current URL:</b> <span id="contentholder"></span>

<script>
document.getElementById("contentholder").textContent = document.baseURI;    
</script>
It does the same thing but this time it is not vulnerable to DOM based cross-site scripting vulnerabilities.

四,参考资料

https://www.owasp.org/index.php/Cross-siteScripting(XSS)
https://en.wikipedia.org/wiki/Cross-site_scripting
https://www.netsparker.com/blog/web-security/dom-based-cross-site-scripting-vulnerability/