CSRF

一、基本认识

首先,我觉得有必要记住CSRF的全名——Cross Site Request Forgery(伪造)。顾名思义,也就是在a.com可以执行(发送)b.com的请求,例如请求b.com删除某个数据

csrf很多时候都与cookie挂钩(如果不需要cookie策略,那就跳过吧)。cookie总体可以分为session cookie与第三方cookie,第一个存在浏览器,而第二个存在本地(所以也称本地cookie)。

攻击方式

  1. a.com发送第三方cookie(b.com)与请求,到b.com,然后执行操作。
  2. 先获得b.com的session cookie,然后再去a.com发送请求。这种方法没有第一种好用,但是,第三方cookie若被禁止发送,只能用这个了。

发送第三方cookie

  1. 能够发送第三方cookie的标签有:<img>, <iframe>, <script>, <link>等。
  2. IE、Safari禁用了以上标签发送第三方cookie,但是Firefox、Opera、Chrome等浏览器没有。

1.2 P3P头

P3P的初衷是保护用户隐私,主要用于类似广告等需要跨域访问的页面,然而,如果网站返回给浏览器的HTTP头中包含P3P头,在某种给程度上说,将允许浏览器发送第三方cookie,即使像IE这样,<iframe>等标签都不再禁止发送第三方cookie。因为cookie是以域和path为单位的,这并不符合“最小权限”原则。所以,若IE等可以通过<iframe>发送哦cookie,应该考虑它使用了P3P头。

1.3 防御方式

验证码

这个有时候会影响用户体验,所以有时候并不能使用。但是这个方法固然是好的(强制人机交互)。

Referer Check

确认“源”网页,则确保了只有“本源”的网站才能访问“本源”的资源。但是并不是所有时候都收到referer的,存在绕过方式。要么删掉(当https转http时,referer为空,还有类似的例子),要么伪造(如将攻击页面命名为被害主机的ip.html等)【参考

Anti CSRF TOKEN

用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
大多数CSRF都是使用GET方式来进行攻击,但是,若使用$_REQUEST来接收参数(而不是$_POST),则可以将POST表单改成GET请求,则可以对POST进行CSRF攻击。
抛开其他不讲,单单是anti token就可以极大地限制csrf攻击,因为不拿到token就无法成功构造POST请求,就无法跨域访问修改密码。所以得借用其他方法获得token(这个方法需要其他漏洞,如xss等),构造POST请求,然后才能完成。

构造POST请求

  1. 通过javascript构造
    创建虚拟表单然后提交
    使用window.location.href= url,但只能是GET请求
  2. *通过php构造*
    curl函数
    file_get_contents函数

二、实践

通过dvwa来测试

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSRFtest</title>
</head>
<body>
    <!--with src attribute-->
<!--    <img src="http://10.10.10.129/dvwa/vulnerabilities/csrf/?password_new=admin1&password_conf=admin1&Change=Change#">-->
<!--    <iframe src="http://10.10.10.129/dvwa/vulnerabilities/csrf/?password_new=admin2&password_conf=admin2&Change=Change#"></iframe>-->
<!--    <script src="http://10.10.10.129/dvwa/vulnerabilities/csrf/?password_new=admin3&password_conf=admin3&Change=Change#"></script>-->
<!--    <link href="http://10.10.10.129/dvwa/vulnerabilities/csrf/?password_new=admin4&password_conf=admin4&Change=Change#" >-->
<!--<a href="http://10.10.10.129/dvwa/vulnerabilities/csrf/?password_new=admin5&password_conf=admin5&Change=Change#">change password</a>-->
</body>
</html>

参考:https://www.freebuf.com/articles/web/118352.html

posted @ 2021-01-21 10:01  DuK  阅读(122)  评论(0)    收藏  举报