CSRF的原理

发现漏洞可利用处->构造(搭建)搭建代码->发送给用户(管理员)->触发代码(发送请求)………

从这个利用的一个流程中,我们可以发现,攻击者仅仅只是做了两处工作.第一处是:发现漏洞利用处,,第二处就是构造利用代码以及发送至用户(管理员)。至于利用,你会发现CSRF与XSS不同,XSS是攻击者自己提交,等待结果,而CSRF呢,是由用户(管理员)自身提交。甚至可以说攻击者只做了构造代码的工作。

OWASP CSRFTester

这是OWASP推出的CSRF半自动化软件,他省去了CSRF最繁琐的过程,代码构造。下面是软件的截图‍‍

利用CSRFTester进行CSRF攻击

进入已经搭建的CMS后台的管理员管理模块

浏览器里代理设置为CSRFTester的代理127.0.0.1:8008

开启CSRFTester抓取数据包,正常添加管理员 返回可以看到已经抓取到了数据包

在Form Parameters中没有找到token的值,那么就可以实现CSRF攻击

在Report Type中。有四种方法来进行攻击。‍‍

  • ‍‍Forms:创建一个form表单。内容为hidden(隐藏),用户不可见(可POST、GET)‍‍
    ‍‍ iFrame:创建一个iframe框架,高宽为0,用户不可见。(可POST、GET)‍‍
    ‍‍
    IMG:创建一个IMG标签(只能GET)。‍‍
    ‍‍ XHR:创建一个AJAX请求(可POST、GET)‍‍
    ‍‍
    Link:创建一个a标签的超链接(只能GET)

此处先选择Forms进行测试

点击Generate HTML 便生成了一个index.html

由其中的HTML源码可以看出这是一个简单的提交表单,点击运行这个html文件
可以看到成功的添加了一个管理员用户


到此利用CSRFTester进行CSRF攻击成功

构造提交表单进行CSRF攻击

审查元素得到管理员管理的URL,进入查看源码。分析提交表单

修改提交表单

点击按钮提交,成功添加管理员

在html中增加javascript脚本,自动提交表单

利用ajax结合xss进行CSRF攻击

就是把CSRF的AJAX请求放到XSS里,以达到攻击的效果

在测试用的这套CMS的留言板处就存在存储型XSS漏洞

在这里我们可以使用CSRFTester生成一个ajax

我们可以看到ajax中核心部分

同时也可以自己编写一个简单的ajax

1
2
3
4
5
6
7
8
9
var xmlhttp;
if(window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST","/admin/admin_manage.asp?act=add",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("admin=789&password=789&password3=789&button=提交数据");

在xss平台上配置项目

然后插入测试网站的留言板里

管理员查看留言信息就能添加一个管理员账号了

CSRF 漏洞防护

其实现在有关CSRF漏洞防护已经是比较成熟了,其主要防护的思路就是需要在进行后台数据修改操作的过程中,添加对当前用户身份的有效验证措施,而不能仅限于cookie的识别,这里简单的罗列了下防护措施如下。

(1) 来源校验

使用http请求头中referer来源,对客户端源进行身份校验,此方法早期使用比较多,但是仍然容易被绕过,所以这里并不建议使用。

(2) 用户token 校验

添加基于当前用户身份的有效tokens随机验证机制,即在向后端提交数据操作请求时,添加基于当前用户的随机token校验值,此种校验方法当前使用比较多;

(3)当前用户密码验证

在修改关键信息时,要钱当前用户输入其自身的密码,以验证当前用户身份的真伪,防止未授权的恶意操作;

(4)添加验证机制

在请求数据的提交前,需填写验证码信息提交,以增加对用户来源的有效验证,防止恶意未授权的操作产生。

参考链接:
http://www.test404.com/post-1410.html
http://www.freebuf.com/articles/web/55965.html