首页 > 技术文章 > CSRF--漏洞分析

xMonica 2019-03-03 14:41 原文

简介:攻击者可伪造当前用户的行为,让目标服务器误以为请求由当前用户发起,并利用当前用户权限实现业务请求伪造。

XSS与CSRF区别:

XSS是利用站点信任用户,CSRF则是伪造用户行为

攻击方式:攻击者伪造一个页面,在页面中采用一些诱导行为,诱使用户点击以实现触发。

 

满足条件:

1、用户登录状态

2、伪造的链接与正常应用请求链接一致

3、后台未对用户业务开展合法性做校验

 

危害

攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

示例

首先找到一个目标站点,csrf存在的危害主要存在于可以执行操作的地方,那么我在我搭建的一个环境中的登录后页面进行测试

环境就是一个wordpress的环境,大家可以直接去官网下载
我们选择用户界面进行测试,可以看到现在只有一个用户

下面我添加用户

利用burp进行截断

利用burp的自带插件来利用csrf

会生成一个可以利用csrf.html
修改标注内的值,来保证添加的用户不会重复造成无法添加

在浏览器中尝试

执行按键,发现除了本来存在的第一个用户和我们通过正常手段加入的用户双增加了一个新的test1用户,这个用户就是我们利用csrf点击图片中的submit来执行的操作,因为是我们的测试没有对页面进行修改和直接触发,如果是攻击者利用JS来让用户进行直接的触发,只要打开了相应的页面就会执行这一行为。

Csrf高级应用

利用html很不容易让人利用,漏洞触发复杂,那我们就想办法让这个触发方式变的简单起来。
利用xss漏洞来触发csrf漏洞,完成用户添加的操作。
我们首先要先了解发送的数据包内容

打开上节讲到的xss平台,创建一个csrf的项目,我们来编写一下我们的代码吧

把这段代码粘到项目的代码配置中去

然后把我们的可利用代码通过留言的存储型XSS漏洞存入到我们的目标站点中去

当管理员查看留言时就执行了我们的危险代码并发送了添加用户的请求

在查看用户列表成功的加入了test2用户

到这里,csrf的攻击实例可以说讲的差不多了,以后就要大家自己去挖掘了。

利用工具介绍

Burp相信大家也都有一定的了解,截断数据包,构造csrf漏洞poc,基本是最简单方便的工具了。
在给大家介绍一个CSRFTester-1.0,这个工具,专门针对csrf漏洞,可以构造多种样式的poc

双击bat文件运行

设置浏览器8008代理,点start就可以获取到通过

原文链接:https://www.freebuf.com/column/155800.html

修复方案:

1、添加中间环节,当用户填写完内容后点击submit,服务器会接收到内容,并弹出一个确认框,让用户进行二次确认。

2、添加验证码,用户在提交内容时需要输入验证码,利用验证码来确认是否为当前用户发起的请求。

3、验证referer,可通过验证referer值是否合法,既通过验证请求来源的方式确定此次请求是否正常。

4、在建设web系统时利用token来识别当前用户身份的真实性。(token必须为一次性,在每次用户请求时均重新生成token并在客户端进行更新,token需有较强的随机性,避免采取简单的可预测的方式,使攻击者猜测出token的生成规律,导致token失效)

referer:当浏览器向web服务器发送请求的时候好,一般会带上referer,告诉服务器我是从哪个页面链接过来的。

token:用于验证用户身份的一种工具,是一个客户端令牌

流程:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个token,再把这个token发送给客户端

客户端收到token以后可以把它存储起来,比如放在cookie里

客户端每次向服务端请求资源的时候需要带着服务端签发的token

服务端收到请求,然后去验证客户都按请求里面带着的token,如果验证成功,就向客户端返回请求的数据

 

 

cookie:客户端保持状态,cookie内容主要包括名字、内容、创建时间、过期时间、路径和域,服务器在对用户登录请求进行检验并通过后,生成唯一的cookie并发送给用户,之后用户在此网站中执行任意点击功能,浏览器都会将服务器生成的cookie一并发送,从而达到区分用户的目的。

发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。

 

 

session:服务器端保持状态,session内容存储在服务器端,远程用户无法直接修改session文件的内容,存储一个a变量来判断用户是否登录,首次验证通过后设置“a”值为true,以后判断该值是否为true。假如不是,转入登入页面。

发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

推荐阅读