CSRF漏洞详解与挖掘

CSRF漏洞详解与挖掘

CSRF的定义:

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。

CSRF攻击原理如下:

  1. 用户打开浏览器,访问登陆受信任的A网站
  2. 在用户信息通过验证后,服务器会返回一个cookie给浏览器,用户登陆网站A成功,可以正常发送请求到网站A
  3. 用户未退出网站A,在同一浏览器中,打开一个危险网站B
  4. 网站B收到用户请求后,返回一些恶意代码,并发出请求要求访问网站A
  5. 浏览器收到这些恶意代码以后,在用户不知情的情况下,利用cookie信息,向网站A发送恶意请求,网站A会根据cookie信息以用户的权限去处理该请求,导致来自网站B的恶意代码被执行

这样太过于官方,简单来说就是通过构造URL造成攻击的就是CSRF,用目标的cookie来执行我们的攻击

挖掘工具

  1. burp
  2. AWVS
  3. appscan
  4. netspark
  5. CSRFTester(后台回复12855)
  6. CSRF Request Builder

DVWA靶场演练

初级

更改密码发现构造如下

http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#

复制

发现规律

password_new=admin&password_conf=admin

复制

两者对应,在表单中为新密码与确认新密码,为此我们构造链接如下

http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin123&password_conf=admin123&Change=Change#

复制

**一个扩外的知识点:同学们注意到"?“后跟参数的规律了吧,后续再次拼接就不需要再用问号,使用”&"**进行拼接

返回值为;Password Changed.代表我们操作成功

查看背后代码

例子0X00

 <?php 
 
 if( isset( $_GET[ 'Change' ] ) ) {
     // Get input
     $pass_new  = $_GET[ 'password_new' ];
     $pass_conf = $_GET[ 'password_conf' ];
 
     // Do the passwords match?
     if( $pass_new == $pass_conf ) {
         // They do!
         $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
         $pass_new = md5( $pass_new );
 
         // Update the database
         $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
         $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
 
         // Feedback for the user
         echo "<pre>Password Changed.</pre>";
     }
     else {
         // Issue with passwords matching
         echo "<pre>Passwords did not match.</pre>";
     }
 
     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
 }
 
 ?>

复制

我们发现,在第九行上

   if( $pass_new == $pass_conf )

复制

代码中服务器只进行了两次密码输入是否相同的验证,如果相同则会修改密码


中级

重放修改操作,发现在构造URL时,返回错误。

URL:

http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin1&password_conf=admin1&Change=Change#

复制

返回

 That request didn't look correct.#那个要求看起来不太正确。

复制

我们并没有修改成功,为了节约时间,我看了对应的源码如下

例子0X01

<?php
 
 if( isset( $_GET[ 'Change' ] ) ) {
     // Checks to see where the request came from
     if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
         // Get input
         $pass_new  = $_GET[ 'password_new' ];
         $pass_conf = $_GET[ 'password_conf' ];
 
         // Do the passwords match?
         if( $pass_new == $pass_conf ) {
             // They do!
             $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
             $pass_new = md5( $pass_new );
 
             // Update the database
             $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
             $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
 
             // Feedback for the user
             echo "<pre>Password Changed.</pre>";
         }
         else {
             // Issue with passwords matching
             echo "<pre>Passwords did not match.</pre>";
         }
     }
     else {
         // Didn't come from a trusted source
         echo "<pre>That request didn't look correct.</pre>";
     }
 
     ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
 }
 
 ?>

复制

其对应的第五行我发现了

  if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )

复制

代码中使用stripos()函数判断Referer参数中是否包含Host参数

stripos() 函数查找字符串在另一字符串中第一次出现的位置

**细节1:**stripos() 函数是不区分大小写的。

**细节2:**该函数是二进制并且是安全的。

其语法为

 stripos(string,find,start)

复制

**知识点:**返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE,这里看懂了那行代码了吗?

**细节:**字符串位置从 0 开始,不是从 1 开始。

那我们只能从包下手,既然检测referer参数,那么咱们就构造这个参数。

首先先过一遍正常操作,截取referer如下;

Referer:http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change

复制

构造URL

http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#

复制

抓包修改为咱们截取的referer,点击intercept is on(burp),返回Password Changed.我们操作成功


困难

首先我抓了个包,如下

GET /dwva/vulnerabilities/csrf/?password_new=admin1&password_conf=admin1&Change=Change&user_token=1e457f530db4c98d317a676e042319ad HTTP/1.1
 Host: 127.0.0.1
 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
 Accept-Encoding: gzip, deflate
 DNT: 1
 Referer: http://127.0.0.1/dwva/vulnerabilities/csrf/
 Cookie: security=high; PHPSESSID=1vp4qsnhuarsp59enbrv5gtio4
 X-Forwarded-For: 8.8.8.8
 Connection: keep-alive
 Upgrade-Insecure-Requests: 1

复制

与以往不同的是增加了user_token

token机制内容;每次访问修改密码的页面时,服务器都会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token是否正确,只有token正确,才会继续处理客户端请求。

常见思路

抓取目标cookie然后获得token,再利用token来修改密码

可这样我们就要涉及到游览器的同源策略了。有的同学不知道什么是同源策略,这里简单的引用《白帽子讲WEB安全》一书中对同源策略的讲解如下;

游览器 的同源策略,限制了来自不同源的“document(文件)”或脚本,对当前的“document(文件)”读取或设置某些属性

简单的理解为

不同源的客户端脚本,在没有明确授权的情况下,不能互相读写对方资源,不允许进行跨域

要解决这个问题就要xss注入了,把我们的文件注入到对方服务器上去。

点击[XSS (Stored)]我们开始写入一个简单的表单进行提交并抓包。如下所示

POST /dwva/vulnerabilities/xss_s/ HTTP/1.1
 Host: 127.0.0.1
 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
 Accept-Encoding: gzip, deflate
 DNT: 1
 Referer: http://127.0.0.1/dwva/vulnerabilities/xss_s/
 Cookie: security=high; PHPSESSID=1vp4qsnhuarsp59enbrv5gtio4
 X-Forwarded-For: 8.8.8.8
 Connection: keep-alive
 Upgrade-Insecure-Requests: 1
 Content-Type: application/x-www-form-urlencoded
 Content-Length: 54
 
 txtName=sssassd&mtxMessage=ssss&btnSign=Sign+Guestbook

复制

修改txtName为

 txtName=<iframe src="../csrf" />
 &mtxMessage=ssss&btnSign=Sign+Guestbook

复制

从弹窗中拿到我们的token;ce3a5ec7491742e4062f2f60a05a9c93并post提交

复制

构造

/dwva/vulnerabilities/csrf/index.php?password_new=password&password_conf=password&Change=Change&user_token=ce3a5ec7491742e4062f2f60a05a9c93

复制

修改成功。


挖掘CSRF漏洞

CSRF用于越权操作,漏洞在有权限控制的地方,其构造URL或者get提交,都可以测一测。

黑盒

打开非静态操作的页面,抓包查看是否存在token,如果没有token,直接请求这个页面,不带referer,如果返回的数据是一样的话,那说明很有可能有CSRF漏洞了。

白盒

读代码的时候看看核心文件里有没有验证token和referer相关的代码。可以直接搜索token关键字

使用工具

半自动检测CSRF

使用CSRFTester教程 https://www.sogou.com/link?url=DSOYnZeCC_p8qT7bQ6Ez_IrwkGJvRRLdYQYE4_vHjb03UFOatHCO_d9GQw9zhM_U

下载地址; http://www.mediafire.com/file/3j9kbyd3rtardq5/CSRFTester-1.0-src.zip/file


如何防止CSRF攻击

  1. 加验证码
  2. 尽量使用POST,少用GET
  3. 验证HTTP Referer字段
  4. 在请求地址中添加token并验证

网络安全工程师(白帽子)企业级学习路线

第一阶段:安全基础(入门)

img

第二阶段:Web渗透(初级网安工程师)

img

第三阶段:进阶部分(中级网络安全工程师)

img

:黑客&网络安全的渗透攻防

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

在这里领取:

这个是我花了几天几夜自整理的最新最全网安学习资料包免费共享给你们,其中包含以下东西:

1.学习路线&职业规划

在这里插入图片描述
在这里插入图片描述

2.全套体系课&入门到精通

在这里插入图片描述

3.黑客电子书&面试资料

在这里插入图片描述

4.漏洞挖掘工具和学习文档

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAD法(附python实现)和Siamese神经网络计算图像的视差图

1 视差图 视差图&#xff1a;以左视图视差图为例&#xff0c;在像素位置p的视差值等于该像素在右图上的匹配点的列坐标减去其在左图上的列坐标 视差图和深度图&#xff1a; z f b d z \frac{fb}{d} zdfb​ 其中 d d d 是视差&#xff0c; f f f 是焦距&#xff0c; b b…

mysql语句学习

SQL Select语句完整的执行顺序&#xff1a; 1、from子句组装来自不同数据源的数据&#xff1b; &#xff08;先join在on&#xff09; 2、where子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&a…

【Entity Framework】EF日志-简单日志记录

【Entity Framework】EF日志-简单日志记录 文章目录 【Entity Framework】EF日志-简单日志记录一、概述二、EF日志分类三、简单的日志记录3.1 配置3.2 日志记录到控制台3.3 记录到凋试窗口3.4 记录到文件3.5 敏感数据处理3.6 详细查询异常3.6 日志级别3.7 消息内容和格式设置 一…

蓝牙耳机推荐哪个品牌好?2024火爆机型推荐,拒绝云测

​音乐和有声读物是许多人放松身心、缓解等待无聊时刻的好伴侣。尽管市面上蓝牙耳机琳琅满目&#xff0c;挑选合适的款式却颇具挑战。作为一个经验丰富的耳机用户&#xff0c;我深知哪些蓝牙耳机值得你的信赖。接下来&#xff0c;我将分享几款我个人认为很不错的蓝牙耳机来给大…

便宜的猫粮给猫吃有什么副作用?

便宜的猫粮&#xff0c;虽然价格诱人&#xff0c;但便宜的猫粮可能会给猫咪的健康带来一些隐患哦。让我们一起来了解一下&#xff0c;便宜的猫粮给猫吃会有什么副作用吧。 1️⃣ 原材料作假&#xff1a;便宜&#xff1d;低质&#xff0c;这是恒古不变的道理&#xff0c;没有那…

HTMLCSS

前端入门 1、HTML&CSS 1、选择器 通配选择器 元素选择器 类选择器 id选择器 复合(组合) 选择器 交集选择器(且) <style> p.class {... } /* 元素选择器需在前面 */.class1.class2 {... } </style>并集选择器(或者) <style> .class1, .class2, …

性能监控工具--sysstat使用

一、sysstat安装 sysstat提供了Linux性能监控工具集&#xff0c;包括sar、sadf、mpstat、iostat、pidstat等&#xff0c;用于监控Linux系统性能和使用情况。 其中sar功能非常强大&#xff0c;能够收集、报告、保存系统活动信息&#xff1a;CPU、内存、磁盘、中断、网络接口…

蓝桥杯刷题第八天(dp专题)

这道题有点像小学奥数题&#xff0c;解题的关键主要是&#xff1a; 有2种走法固走到第i级阶梯&#xff0c;可以通过计算走到第i-1级和第i-2级的走法和&#xff0c;可以初始化走到第1级楼梯和走到第2级楼梯。分别为f[1]1;f[2]1(11)1(2)2.然后就可以循环遍历到后面的状态。 f[i…

ubuntu16如何使用高版本cmake

1.引言 最近在尝试ubuntu16.04下编译开源项目vsome&#xff0c;发现使用apt命令默认安装cmake的的版本太低。如下 最终得知&#xff0c;ubuntu16默认安装确实只能到3.5.1。解决办法只能是源码安装更高版本。 2.源码下载3.20 //定位到opt目录 cd /opt 下载 wget https://cmak…

Aurora8b10b(2)上板验证

文章目录 前言一、AXI_Stream数据产生模块二、上板效果总结 前言 上一篇内容我们已经详细介绍了基于aurora8b10b IP核的设计&#xff0c;本文将基于此进一步完善并且进行上板验证。 设计思路及代码思路参考FPGA奇哥系列网课 一、AXI_Stream数据产生模块 AXIS协议是非常简单的…

【御控物联】JSON结构数据转换在物流调度系统中的应用(场景案例三)

文章目录 一、前言二、场景概述三、解决方案四、在线转换工具五、技术资料 一、前言 物流调度是每个生产厂区必不可少的一个环节&#xff0c;主要包括线边物流和智能仓储。线边物流是指将物料定时、定点、定量配送到生产作业一线的环节&#xff0c;其包括从集中仓库到线边仓、…

14种建模语言(UML)图形

前言 UML 中有四种关系&#xff1a;依赖、关联、泛化和实现。这四种关系是 UML 模型中可以包含的基本关系事物。这里介绍14种UML图形:类图&#xff0c;对象图&#xff0c;包图&#xff0c;构件图&#xff0c;组合结构图&#xff0c;部署图&#xff0c;制品图&#xff0c;用例图…

【Web理论篇】Web应用程序安全与风险

目录 &#x1f332;1.Web应用程序的发展历程 &#x1f342;1.1 Web应用程序的常见功能&#x1f342;1.2 Web应用程序的优点 &#x1f332;2.Web安全 &#x1f342;2.1Web应用程序常见漏洞&#x1f342;2.2未对用户输入做过滤&#x1f342;2.3 造成这些漏洞的原因是什么呢&…

数据安全之认识数据库防火墙

文章目录 一、什么是数据库防火墙二、数据库防火墙的主要功能三、数据库防火墙的工作原理四、数据库防火墙如何防护数据库免受SQL注入攻击五、数据库防火墙的部署方式六、数据库防火墙与网络防火墙的关系与区别七、数据库防火墙的应用场景 随着信息技术的快速发展&#xff0c;数…

数据结构进阶篇 之【选择排序】详细讲解(选择排序,堆排序)

民以食为天&#xff0c;我以乐为先 嘴上来的嘘寒问暖&#xff0c;不如直接打笔巨款 一、选择排序 1.直接选择排序 SelectSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接选择排序的特性总结 2.堆排序 HeapSort 跳转链接&#xff1a;数据结构 之 堆的应用 二、完…

C++ | Leetcode C++题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution { public:int reverse(int x) {int rev 0;while (x ! 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} };

The Google File System [SOSP‘03] 论文阅读笔记

原论文&#xff1a;The Google File System 1. Introduction 组件故障是常态而非例外 因此&#xff0c;我们需要持续监控、错误检测、容错和自动恢复&#xff01; 按照传统标准&#xff0c;文件数量巨大大多数文件都是通过添加新数据而不是覆盖现有数据来改变的&#xff0c;因…

基于springboot实现网上购物商城系统研发系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上购物商城系统研发系统演示 摘要 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上购物商城系统&#xff0c;来满足用户网络购物的需求。 本网上购物商城系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring …

最优算法100例之21-数组的逆序对

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 逆序数: 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一…

如何使用 Windows 文件恢复工具恢复丢失的数据

当您不小心删除了一个文件时&#xff0c;那种可怕的感觉就会席卷您。那种冰冷的感觉&#xff0c;想到失去工作、失去时间或失去记忆而感到的不安。 您会很高兴听到一切并没有立即丢失。如果您行动迅速&#xff0c;您有机会恢复已删除的文件。使用 Windows 文件恢复&#xff0c…