XSS原理
XSS攻击是在网页中嵌入客户端恶意脚本代码,这些代码一般是使用JavaScript语言编写的。所以如果想要深入研究XSS,必须精通JavaScript。JavaScript能做到什么效果,XSS的威力就有多大。
JavaScript可以用来获取用户的Cookie、改变网页内容、URL调转,那么存在XSS漏洞的网站,就可以盗取用户Cookie、黑掉页面、导航到恶意网站,而攻击者需要做的仅仅是向Web页面中注入JavaScript代码。
XSS类型
反射型
反射型XSS也被称为非持久性XSS,是最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。这个过程就像一次反射,故称为反射型XSS。且反射型XSS会写入页面源代码,并在刷新页面后从源代码清除。
存储型
存储型XSS又被称为持久性XSS,是最危险的一种跨站脚本。
允许用户存储数据的Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击。
存储型XSS与反射型、DOM型相比,具有更高的隐蔽性,危害性也更大。它们之间最大的区别在于反射型与DOM型执行都必须依靠用户手动去触发,而存储型XSS不需要。
DOM型
DOM的全称为Document Object Model,即文档对象模型,DOM通常用于代表在HTML、XHTML和XML中的对象。使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。
通过JavaScript可以重构整个HTML页面,需要重构页面或者页面中的某个对象,JavaScript就需要知道HTML文档中所有元素的“位置”。而DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM规定,HTML文档中的每个成分都是一个节点。
DOM型XSS不会写入前端源码。
DOM的规定如下。
整个文档是一个文档节点;每个HTML标签是一个元素节点;包含在HTML元素中的文本是文本节点;每一个HTML属性是一个属性节点;节点与节点之间都有等级关系。HTML的标签都是一个个节点,这些节点组成了DOM的整体结构:节点树。
XSS危害
盗取用户Cookie;
修改网页内容;
网站挂马;
利用网站重定向;
XSS蠕虫。
XSS会话劫持
Cookie简介
Cookie是能够让网站服务器把少量文本数据存储到客户端的硬盘、内存,或是从客户端的硬盘、内存读取数据的一种技术。因为HTTP协议是无状态的,Web服务器无法区分请求是否来源于同一个浏览器。所以Web服务器需要额外的数据用于维护会话。Cookie正是一段随HTTP请求、响应一起被传递的额外数据,它的主要作用是标识用户、维持会话。
当浏览某个网站时,该网站可能会向客户端硬盘写入一个非常小的文件,它可以记录用户ID、密码、停留的时间等信息,这个文件就是Cookie文件。当再次来到该网站时,浏览器会自动检测硬盘,并将存储在本地的Cookie发送给网站,网站通过读取Cookie,得知用户相关信息,做出相应动作,如直接登录无需再次输入用户名密码。
Cookie按照在客户端存储的位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失,存在时间短暂。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,否则硬盘Cookie不会被删除,其存在时间是长期的。所以Cookie也可分为持久Cookie和非持久Cookie。
一个用户的电脑里可以存在多个Cookie,它们分别是不同网站存储的信息,但是一个网站只能取回该网站本身放在电脑的Cookie,它无法得知电脑上其他的Cookie信息,也无法取得其他任何数据。
大多数浏览器支持最大为4096B的Cookie,而且浏览器也限制该站点可以在用户计算机上存储Cookie的数量,大多数浏览器只允许每个站点存储20个Cookie。如果试图存储更多的Cookie,则最旧的Cookie就会被丢弃。有些浏览器还会对来自所有站点的Cookie总数做出限制,通常为300个。
Cookie各选项含义
Set-Cookie:HTTP响应头,Web服务器通过此HTTP头向客户端发送Cookie;
name=value:这是每一个Cookie均必须有的部分。用户可以通过name取得Cookie中存放的值(Value)。在字符串“name=value”中,不含分号、逗号和空格等字符;
expires=date:Expires确定了Cookie的有效终止日期,该属性值date必须以特定的格式来书写“星期几,DD-MM-YY HH:MM:SS GMT”,其中,GMT表示这是格林尼治时间。反之,若不以这样的格式来书写,系统将无法识别。该变量可省,如果缺省,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存中,Cookie将随浏览器的关闭而自动消失;
domain=domain-name:Domain变量确定了哪些Internet域中的Web服务器可读取浏览器存储的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省,值为该Web服务器的域名;
path=path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器发送的Cookie。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。同样,该项设置是可选的,如果缺省,则Path的属性值为Web服务器传给浏览器的资源路径名。借助对domain和path两个变量的设置,即可有效地控制Cookie文件被访问的范围;
Secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS;
HttpOnly:禁止JavaScript读取;
Cookie中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,但服务器的处理程序知道它们真正的含义。
Session
除Cookie之外,维持会话状态还有一种形式是session。
Session在计算机中,尤其是在网络应用中,被称为“会话”。Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。
Web中的session是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是一次客户端与服务端的“对话”,被称为session,当浏览器关闭后,session自动注销。
每个用户的会话状态都是不同的session,比如管理员登录网站是一个session,普通用户登录网站又是一个session,每个session都是不同的。服务器区分这些用户的方式就是sessionid。
当用户第一次连接到服务器时,会自动分配一个sessionid,这个sessionid是唯一且不会重复的“编号”。如果服务器关闭或浏览器关闭,session将自动注销,当用户再次连接时,将会重新分配sessionid。
Sessionid可以存储在Cookie中,相当于临时Cookie。
Session与cookie最大的区别在于,cookie是将数据存储在客户端,而session则是保存在服务端,仅仅是在客户端存储一个ID。相对来说,session比cookie更安全。
XSS蠕虫
XSS蠕虫具有传染性,与系统病毒唯一的区别就是无法对系统底层操作,因为XSS蠕虫一般是基于JavaScript编写,而JavaScript最大的用武之地是Web,但对于底层编程能力几乎为零。一般来说XSS蠕虫是针对浏览器的攻击,且网站规模越大,攻击效果就越大。在大用户量的情况下,XSS蠕虫完全可以在短时间内达到对巨大数量的计算机感染。
XSS蠕虫最早出现在2005年10月初的MySpace.com网站系统,在仅仅20个小时内就有超过100万用户被感染,这是世界上第一条XSS蠕虫。
XSS蠕虫大多数出现在大用户量的网站平台,比如微博、贴吧等一些社交网站,因为只有当用户量足够多的情况下,XSS蠕虫才能发挥效果。
XSS漏洞防御
XSS跨站脚本漏洞最终形成的原因是对输入与输出没有严格过滤,在页面执行JavaScript等客户端脚本,也就意味着只要将敏感字符过滤,即可修补XSS漏洞。但是这一过程是非常复杂的,很多情况下无法识别哪些是正常字符,哪些是非正常字符。
在PHP中提供了htmlspecialchars()、htmlentities()函数可以把一些预定义的字符转换为HTML实体,起到修补XSS漏洞的功能。当字符串经过这类函数处理后,敏感字符会被一一转义。
预定义字符如下:
&转换为&
"转换为"
'转换为'
<转换为<
>转换为>
本文转载自: https://blog.csdn.net/m0_68080066/article/details/128470252
版权归原作者 超级大黑兔 所有, 如有侵权,请联系我们删除。
版权归原作者 超级大黑兔 所有, 如有侵权,请联系我们删除。