CSRF
一、基本认识
首先,我觉得有必要记住CSRF的全名——Cross Site Request Forgery(伪造)。顾名思义,也就是在a.com可以执行(发送)b.com的请求,例如请求b.com删除某个数据。
1.1 cookie
csrf很多时候都与cookie挂钩(如果不需要cookie策略,那就跳过吧)。cookie总体可以分为session cookie与第三方cookie,第一个存在浏览器,而第二个存在本地(所以也称本地cookie)。
攻击方式:
- a.com发送第三方cookie(b.com)与请求,到b.com,然后执行操作。
- 先获得b.com的session cookie,然后再去a.com发送请求。这种方法没有第一种好用,但是,第三方cookie若被禁止发送,只能用这个了。
发送第三方cookie:
- 能够发送第三方cookie的标签有:
<img>,<iframe>,<script>,<link>等。 - 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请求
- 通过javascript构造
创建虚拟表单然后提交
使用window.location.href= url,但只能是GET请求 - *通过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>

浙公网安备 33010602011771号