常见web攻击方式与防御方法

1. 客户端攻击

1.1 跨站脚本攻击(XSS)

跨站脚本攻击(XSS)是客户端脚本安全中的头号大敌。OWASP TOP 10威胁多次把XSS列在榜首。

1.1.1 XSS分类

XSS根据效果的不同可以分成如下几类:

第一种类型:反射型XSS
反射型XSS只是简单地把用户输入的数据“反射”给浏览器。也就是说,黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”(Non-persistent XSS)。

http://www.a.com/test.php?param=<script>alert(/xss/)</script>

第二种类型:存储型XSS
存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。

比较常见的一个场景就是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的JavaScript代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击就叫做“存储型XSS”。

1.1.2 XSS攻击

XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“XSSPayload”。

“Cookie劫持”攻击
一个最常见的XSS Payload,就是通过读取浏览器的Cookie对象,从而发起“Cookie劫持”攻击。

Cookie中一般加密保存了当前用户的登录凭证。Cookie如果丢失,往往意味着用户的登录凭证丢失。换句话说,攻击者可以不通过密码,而直接登录进用户的账户。

“Cookie劫持”并非所有的时候都会有效。有的网站可能会在Set-Cookie时给关键Cookie植入HttpOnly标识;有的网站则可能会把Cookie与客户端IP绑定,从而使得XSS窃取的Cookie失去意义。

构造GET与POST请求
一个网站的应用,只需要接受HTTP协议中的GET或POST请求,即可完成所有操作。对于攻击者来说,仅通过JavaScript,就可以让浏览器发起这两种请求。

通过构造特定的GET与POST请求,攻击者可以做到,比如:删除博客文章、发表评论、读取私密信息等非法操作。

构造GET与POST请求也并非所有时候都有效。比如在提交表单时要求用户输入验证码,那么这种XSS Payload都会失效。

XSS钓鱼
利用JavaScript在当前页面上“画出”一个伪造的登录框,当用户在登录框中输入用户名与密码后,其密码将被发送至黑客的服务器上。

XSS蠕虫
以往的蠕虫是利用服务器端软件漏洞进行传播的。比如2003年的冲击波蠕虫,利用的是Windows的RPC远程溢出漏洞。

在2005年,年仅19岁的Samy Kamkar发起了对MySpace.com的XSS Worm攻击。Samy Kamkar的蠕虫在短短几小时内就感染了100万用户——它在每个用户的自我简介后边加了一句话:“but most of all, Samy is my hero.”(Samy是我的偶像)。这是Web安全史上第一个重量级的XSS Worm,具有里程碑意义。

一般来说,用户之间发生交互行为的页面,如果存在存储型XSS,则比较容易发起XSS Worm攻击。比如,发送站内信、用户留言等页面,都是XSS Worm的高发区,需要重点关注。

而相对的,如果一个页面只能由用户个人查看,比如“用户个人资料设置”页面,因为缺乏用户之间互动的功能,所以即使存在XSS,也不能被用于XSS Worm的传播。

1.1.3 XSS防御

XSS的本质还是一种“HTML注入”,用户的数据被当成了HTML代码一部分来执行,从而混淆了原本的语义,产生了新的语义。

想要根治XSS问题,可以列出所有XSS可能发生的场景,再一一解决。

比如,XSS的利用方式一般是构造一个

常见的防御方法是对使用HtmlEncode/JavascriptEncode/encodeForCSS/URLEncode等函数进行过滤。

1.2 跨站点请求伪造(CSRF)

CSRF的全名是Cross Site Request Forgery,翻译成中文就是跨站点请求伪造。

1.2.1 CSRF攻击

比如:

  1. 攻击者首先在自己的域构造一个页面:http://www.a.com/csrf.html,其内容为: img src=“http://blog.sohu.com/manage/entry.do?m=delete&id=1111”
  2. 攻击者诱使目标用户访问这个页面,就会导致用户删除自己的博客文章。
  3. 试想,如果这张图片展示在某个公共的论坛/博客中,会产生什么效果呢?

这个删除博客文章的请求,是攻击者所伪造的,所以这种攻击就叫做“跨站点请求伪造”。

1.2.2 CSRF防御

验证码

验证码被认为是对抗CSRF攻击最简洁而有效的防御方法。

CSRF攻击的过程,往往是在用户不知情的情况下构造了网络请求。而验证码,则强制用户必须与应用进行交互,才能完成最终请求。因此在通常情况下,验证码能够很好地遏制CSRF攻击。

但是验证码并非万能。很多时候,出于用户体验考虑,网站不能给所有的操作都加上验证码。因此,验证码只能作为防御CSRF的一种辅助手段,而不能作为最主要的解决方案。

Anti CSRF Token

现在业界针对CSRF的防御,一致的做法是使用一个Token。

CSRF为什么能够攻击成功?其本质原因是重要操作的所有参数都是可以被攻击者猜测到的。攻击者只有预测出URL的所有参数与参数值,才能成功地构造一个伪造的请求;反之,攻击者将无法攻击成功。

出于这个原因,可以想到一个解决方案:把参数加密,或者使用一些随机数,从而让攻击者无法猜测到参数值。

http://host/path/manage?username=abc&token=[random]

1.3 点击劫持ClickJacking

1.3.1 ClickJacking攻击

点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

点击劫持攻击与CSRF攻击有异曲同工之妙,都是在用户不知情的情况下诱使用户完成一些动作。但是在CSRF攻击的过程中,如果出现用户交互的页面,则攻击可能会无法顺利完成。与之相反的是,点击劫持没有这个顾虑,它利用的就是与用户产生交互的页面。

ClickJacking相对于XSS与CSRF来说,因为需要诱使用户与页面产生交互行为,因此实施攻击的成本更高,在网络犯罪中比较少见。

1.3.2 ClickJacking防御

针对传统的ClickJacking,一般是通过禁止跨域的iframe来防范。比如frame busting、X-Frame-Options、Content Security Policy等技术。

2. 服务端攻击

2.1 SQL注入

注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。

2.1.1 SQL注入攻击

SQL注入

var sql = "select * from order where ship_city='" + ship_city + "'";

变量ShipCity的值由用户提交。
假如用户输入一段有语义的SQL语句,比如:

Beijing';drop table order;

sql语句就变成

select * from order where ship_city='Beijing';drop table order;

盲注(BIind Injection)

比如,一个应用的URL如下:http://newspaper.com/items.php?id=2
对应的sql语句如下:select title, body from items where id= 2
如果攻击者构造如下的条件语句:select title, body from items where id= 2 and 1=1
对比页面返回结果的差异,就可以判断出SQL注入是否存在

2.1.2 SQL注入防御

从防御的角度来看,要做的事情有两件:(1)找到所有的SQL注入漏洞;(2)修补这些漏洞。

一般来说,各种Web语言都实现了一些编码函数,可以帮助对抗SQL注入。

检查输入数据的数据类型,在很大程度上可以对抗SQL注入。比如:限制了输入数据的类型只能为integer

2.2 文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。

“文件上传”本身没有问题,但有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

2.2.1 文件上传攻击

上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;
上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。

2.2.2 文件上传防御

  1. 文件上传的目录设置为不可执行
  2. 判断文件类型
  3. 使用随机数改写文件名和文件路径
  4. 单独设置文件服务器的域名

2.3 认证与会话管理

在Web应用中,用户登录之后,服务器端通常会建立一个新的Session以跟踪用户的状态。每个Session对应一个标识符SessionID, SessionID用来标识用户身份,一般是加密保存在Cookie中。

一般来说,Session是有生命周期的,当用户长时间未活动后,或者用户点击退出后,服务器将销毁Session。Session如果一直未能失效,会导致什么问题呢?

Session劫持就是一种通过窃取用户SessionID后,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值