web攻击方法及防御

[TOC]

CSRF、XSS、session攻击

CSRF跨站请求伪造攻击(cross-site request forgery)

1.概念:用户浏览器同时打开正常网站和钓鱼网站时,钓鱼网站利用图片隐藏链接或者JS脚本操纵用户发送请求给正常的网站,因为此时用户是通过了session验证的,所以钓鱼网站的请求会得以执行。
2.这个攻击方法就是利用用户已登陆的正常网站的session等一些已有验证,偷偷在用户浏览器上执行恶意请求。

下面有个很形象的图表示:

3.CSRF类型:

  • GET类型的CSRF:<img src=http://wooyun.org/csrf?xx=11 /> 在访问含有这个img的页面后,偷偷向http://wooyun.org/csrf?xx=11 发出了一次HTTP请求
  • POST类型的CSRF:偷偷发起post请求

    1
    2
    3
    4
    <form action=http://wooyun.org/csrf.php method=POST>
    <input type="text" name="xx" value="11" />
    </form>
    <script> document.forms[0].submit(); </script>
  • 其他其他猥琐流CSRF:

根本原因:web的隐式身份验证机制
解决办法:
1.验证HTTP Referer字段:Referer字段记录了HTTP请求的来源地,可以判别是否是钓鱼网站发起的请求
2.在请求地址中添加token:在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求
3.在HTTP头中自定义属性并验证:这种方法也是使用 token 并进行验证,但是是把token放在HTTP头中自定义token,通过SMLHTTPRequest(ajax)类添加


XSS跨站脚本攻击(cross site script)

1.概念:网站对攻击者提交的一些数据没有转义或过滤,导致一些恶意代码添加到网页中(比如评论区中),其他用户浏览网页的时候,这些携带的代码得以执行。

例如在一个论坛评论中发表:

1
<script>alert('hacked')</script>

这样的话,当其他用户浏览到这个页面,这段js代码就会被执行。当然,我们还可以执行一些更严重的代码来盗取用户信息。
分类:

  • 非持久性XSS:一次性执行的,服务器仅将XSS代码保存在内存中,每次触发XSS都需要由用户输入相关的XSS代码
  • 持久性XSS:XSS代码保存在数据库中,XSS代码只需一次输入
  • DOM XSS:完全在前端浏览器触发,无需服务端,预防DOM XSS,需要前端开发人员警惕用户所有的输入数据,做到数据的excape转义,同时尽可能少的直接输出HTML的内容;不用eval、new Function、setTimeout等较为hack的方式解析外站数据和执行js脚本;禁止内联事件处理函数;如果在考虑安全性的前提下需要获取外站脚本的执行结果,可以采用前端沙盒。
  • 解决办法: 转移和过滤用户提交的信息

session攻击,会话劫持

1.概念:用某种手段得到用户session ID后,冒充用户进行请求
2.session ID一般是以cookie形式存储在用户本地,session的value是存储在服务器上的,用户通过session ID可以请求服务器获得session的value

原因: 由于http本身无状态,为了维持会话,会设置一个session ID用来认证用户,基于这个标识进行用户授权,只有请求中带有这个标识才能得到响应

三种攻击者获取用户session ID的方式:
1.预测:猜session ID,这种方法不靠谱,session ID很复杂的
2.会话劫持: URL参数传递sessionID; 隐藏域传递sessionID;比较安全的是cookie传递。但同样也可以用xss攻击取得sessionID
3.会话固定: 诱骗用户使用指定的sessionID进行登录,这样系统不会分配新的sessionID

防御方法:
每次登陆重置sessionID
设置HTTPOnly,防止客户端脚本访问cookie信息,阻止xss攻击
关闭透明化sessionID
user-agent头信息验证
token校验

【持续更新…】

热评文章