XSS攻击即跨站点脚本攻击(Cross Site Script),指黑客经过篡改网页,注入恶意HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操做的一种攻击方式。数据库
常见的XSS攻击类型有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚本的连接,达到攻击的目的,以下图所示。编程
攻击者发布的微博中含有恶意脚本URL(在实际应用中,该脚本在攻击者本身的服务器上,URL中包含脚本的连接),用户点击该URL,脚本会自动关注攻击者的新浪微博ID,发布含有恶意脚本URL的微博,攻击就扩散了。浏览器
攻击者能够采用XSS攻击,偷取用户Cookie、密码等数据,进而伪造交易、盗窃用户财产、窃取情报。安全
另外一种XSS攻击是持久型XSS攻击,黑客提交包含有恶意脚本的请求,保存在被攻击的Web站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的,以下图所示。此种攻击常用在论坛,博客等Web应用中。服务器
常见应对手段:数据结构
消毒架构
XSS攻击者通常都是经过在请求中嵌入恶意脚本达到攻击的目的,这些脚本是通常用户输入中不使用的,若是进行过滤和消毒处理,即对某些HTML危险字符转义,如">"转义为">"、"<"转义为"<"等,就能够防止大部分攻击。为了不对没必要要的内容错误转义,如"3<5"中的"<"须要进行文本匹配后再转义,如"<img src="这样的上下文中的"<"才转义。事实上,消毒几乎是全部网站最必备的XSS防攻击手段。框架
HttpOnly编程语言
浏览器禁止页面JavaScript访问带有HttpOnly属性的Cookie。防止XSS攻击者窃取Cookie。工具
对于存放敏感信息的Cookie,如用户认证信息等,可经过对该Cookie添加HttpOnly属性,避免被攻击脚本窃取。
主要有两种形式,SQL注入攻击和OS注入攻击。
SQL注入攻击的原理以下图所示。
攻击者在HTTP请求中注入恶意SQL命令(drop table users;),服务器用请求参数构造数据库SQL命令时,恶意SQL被一块儿构造,并在数据库中执行。
SQL注入攻击须要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构信息的手段有以下几种。
开源
若是使用开源软件搭建的网站,网站数据结构是公开的,攻击者就能够直接获取。
错误回显
若是网站开启错误回显,即服务器内部500错误会显示到浏览器上。攻击者经过故意构造非法参数,使服务端异常信息输出到浏览器端,为攻击者猜想数据库表结构提供了便利。
盲注
网站关闭错误回显,攻击者根据页面变化状况判断SQL语句的执行状况,据此猜想数据库表结构,此种方式攻击难度较大。
防护SQL注入攻击首先要避免被攻击者猜想到表名等数据库表结构信息,此外还能够采用以下方式。
消毒
和防XSS攻击同样,请求参数消毒使一种比较简单粗暴又有效的手段。经过正则匹配,过滤请求数据中可能注入的SQL,如"drop table"、"\b(?:update\b.*?\bset\delete\b\W*?\bfrom)\b"等。
参数绑定
使用预编译手段,绑定参数是最好的防SQL注入方法。目前许多数据访问层框架,如MyBatis、Hibernate等,都实现SQL预编译和参数绑定,攻击者的恶意SQL会被看成SQL的参数,而不是SQL命令被执行。
除了SQL注入,攻击者还根据具体应用,注入OS命令、编程语言代码等,利用程序漏洞,达到攻击目的。
CSRF(Cross Site Request Forgery,跨站点请求伪造),攻击者经过跨站点请求,以合法用户的身份进行非法操做,如转帐交易、发表评论等,以下图所示。
CSRF的主要手法是利用跨站请求,在用户不知情的状况下,以用户的身份伪造请求。其核心是利用了浏览器Cookie或服务器Session策略,盗取用户身份。
相应地,CSRF地防护手段主要是识别请求者身份。主要有下面几种方法。
表单Token
CSRF是一个伪造用户请求地操做,因此须要构造用户请求的全部参数才能够。表单Token经过在请求参数中增长随机数的办法来阻止攻击者得到全部请求参数:在页面表单中增长一个随机数做为Token,每次响应页面的Token都不相同,从正常页面提交的请求会包含该Token值,而伪造的请求没法得到该值,服务器检查请求参数中Token的值是否存在而且正确以肯定请求提交者是否合法。
验证码
相对来讲,验证码则更加简单有效,即请求提交时,须要用户输入验证码,以免在用户不知情的状况下被攻击者伪造请求。可是输入验证码是一个糟糕的用户体验,因此请在必要时使用,如支付交易等关键页面。
Referer check
HTTP请求头的Referer域中记录者请求来源,可经过检查请求来源,验证其是否合法。不少网站使用这个功能实现图片防盗链(若是图片访问页面来源不是来自本身网站的网页就拒绝)。
Error Code
错误回显,许多Web服务器默认是打开异常信息输出的,即服务器端未处理的异常堆栈信息会直接输出到客户端浏览器,这种方式虽然对程序调试和错误报告有好处,但同时也给黑客形成可乘之机。
经过故意制造非法输入,是系统运行时报错,得到异常信息,从而寻找系统漏洞进行攻击。
防护手段:
经过配置Web服务器参数,跳转500页面到专门的错误页面便可,Web应用经常使用的MVC框架也有这个功能。
HTML注释
程序发布前须要进行代码review或自动扫描,避免HTML注释漏洞。
文件上传
通常网站都会有文件上传功能,设置头像、分享视频、上传附件等。若是上传的是可执行程序,并经过该程序得到服务器命令执行能力,那么攻击者几乎能够在服务器上随心所欲,并以此为跳板攻击集群环境的其余机器。
最有效的防护手段是设置上传文件白名单,只容许上传可靠的文件类型。
此外还能够修改文件名、使用专门的存储等手段,保护服务器免受上传文件攻击。
路径遍历
攻击者在请求的URL中使用相对路径,遍历系统未开放的目录和文件。
防护方法主要是将JS、CSS等资源文件部署在独立服务器、使用独立域名,其余文件不使用静态URL访问,动态参数不包含文件路径信息。
ModSecurity是一款开源的Web应用防火墙,探测攻击并保护Web应用程序,便可以嵌入Web应用服务器中,也能够做为独立的应用程序启动。ModSecurity最先只是Apache的一个模块,如今已经有Java、.Net多个版本,并支持Nginx。
ModSecurity采用处理逻辑与攻击规则集合分离的架构模式。
处理逻辑(执行引擎)负责请求和响应的拦截过滤,规则加载执行等功能。而攻击规则集合则负责描述对具体攻击的规则定义、模式识别、防护策略等功能(能够经过文本方式进行描述)。
处理逻辑比较稳定,规则集合须要不断针对漏洞进行升级,这是一种可扩展的架构设计,以下图所示。
除了开源的ModSecurity,还有一些商业产品也能够实现Web应用防火墙功能,如NEC的SiteShell。
网站安全漏洞扫描工具是根据内置规则,构造具备攻击性的URL请求,模拟黑客攻击行为,用以发现网站安全漏洞的工具。许多大型网站的安全团队都有本身开发的漏洞扫描工具,不按期地对网站的服务器进行扫描,查漏补缺。市场上也有不少商用的网站安全漏洞扫描平台。