热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DVWA学习笔记系列:深入理解CSRF攻击机制

篇首语:本文由编程笔记#小编为大家整理,主要介绍了DVWA笔记系列-CSRF相关的知识,希望对你有一定的参考价值。 0x01 CSRF 简介 跨站请求伪造(英语:Cross-site request

篇首语:本文由编程笔记#小编为大家整理,主要介绍了DVWA笔记系列-CSRF相关的知识,希望对你有一定的参考价值。



0x01 CSRF 简介

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。


0x02 CSRF 原理

CSRF攻击原理如下:



  1. 首先正常的用户输入口令登陆了网站A(被攻击站点)


  2. 网站A(被攻击站点)判断该用户口令合法,生产COOKIE保存在浏览器中


  3. 用户在没关闭网站A的情况下,访问了网站B的攻击页面(攻击者站点)


  4. 网站B(攻击者站点)利用网站A留在浏览器的COOKIE,访问网站A的某个URL,并偷偷做了该URL能做的事情


CSRF攻击原理图:


0x03 DVWA-CSRF-LOW

说完原理,我们直接看DVWA中CSRF的代码吧,下面是LOW级别的代码:



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( '

. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res false)) . '
);
        
// Feedback for the user 
        
echo "
Password Changed.
"

    } 
    else { 
        
// Issue with passwords matching 
        
echo "
Passwords did not match.
"

    } 
    ((
is_null($___mysqli_res mysqli_close($GLOBALS["___mysqli_ston"]))) ? false $___mysqli_res); 
}
?> 



LOW级别的代码很简单,没有Referer也没有token校验,只是单纯的比较一下两次输入的密码一不一样,我们可以直接利用Burp实现制造一个CSRF页面,如下图,首先点击右键:

DVWA笔记系列-CSRF

构造成功,得到html代码,接着我们直接把他复制到服务器上,保存为一个html文件,在诱使别人点击,即可以实现CSRF攻击。



 

 

   

     

     

     

     

   

 




0x04 DVWA-CSRF-Medium




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( '

. ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res false)) . '
);
            
// Feedback for the user 
            
echo "
Password Changed.
"

        } 
        else { 
            
// Issue with passwords matching 
            
echo "
Passwords did not match.
"

        } 
    } 
    else { 
        
// Didn't come from a trusted source 
        
echo "
That request didn't look correct.
"

    } 
    ((
is_null($___mysqli_res mysqli_close($GLOBALS["___mysqli_ston"]))) ? false $___mysqli_res); 

?> 



Medium级别在Low级别的基础上了加了HTTP_REFERER校验与服务器校验,具体代码如下:



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



stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写),即该行代码具体作用是判断服务器名是否在Referer字段中。

我们来看burp截取的数据包:

DVWA笔记系列-CSRF

红线部分即为后端加的REFERER字段,如果是黑盒测试的话,我们可以先把REFERER字段后面的值去除,在发送该数据包,然后判断服务器是否校验REFERER的值。但之前我们以前审计了该密码重置的代码。我们知道服务端代码只用stripos()函数来判断服务器名是否在返回的REFERER字段中。这样的话,我们绕过他的检验就很简单了,我们可以这样构造攻击URL:
http://攻击者IP/192.168.203.141.html

我们在BURP中尝试一下,下面是我修改过后的数据包:




GET /DVWA-master/DVWA-master/vulnerabilities/csrf/?password_new=huangguohua&password_cOnf=huangguohua&Change=Change HTTP/1.1

Host: 192.168.203.141

Proxy-Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Referer: http://127.0.0.1/192.168.203.141.html

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

COOKIE: security=medium; PHPSESSID=45uteveeouuha9l5hn39uh1151



发现可以,成功绕过

DVWA笔记系列-CSRF

我们先按Low级别上面讲的,先构造好CSRF页面:

诱使用户点击:

攻击成功。


0x05 结束语

High级别的增加Token校验和session校验,单纯的只是CSRF是不行的,要打组合拳,要通过XSS+CSRF组合才行,这里就不细说了。




推荐阅读
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
author-avatar
Nedo_zou
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有