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

DVWA下的CSRF通关是怎样的

DVWA下的CSRF通关是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。CSR

DVWA下的CSRF通关是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

CSRF跨站点请求伪造(Cross—Site Request Forgery):

跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。

CSRF攻击攻击原理及过程如下:

1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2.在用户信息通过验证后,网站A产生COOKIE信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5.  浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 COOKIE 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 COOKIE 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。

与XSS的区别:

XSS是通过修改页面Javascript等代码后,发给用户从而实现盗取COOKIE信息,之后利用COOKIE进行登陆网站等操作。非法操作是黑客。
CSRF并没有盗取COOKIE信息,而是通过用户直接利用COOKIE进行操作。非法操作并不是黑客,而是用户本身。

1、low级别


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);
}

?>

可以看到,源码中的mysql_real_escape_string() 函数有防护sql注入的作用,然后就只进行了$pass_new == $pass_conf判断,没有进行任何的验证。

在新密码和确认密码之处填写123456

DVWA下的CSRF通关是怎样的

burp suite抓包发现,通过get请求执行

DVWA下的CSRF通关是怎样的

http://172.21.98.85/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_cOnf=123456&Change=Change#

根据上面的url,进行构造payload:

http://172.21.98.85/DVWA-master/vulnerabilities/csrf/?password_new=test&password_cOnf=test&Change=Change#

这样的payload,一般人都可以看出来存在陷进,往往不会去点击,因此我们还需要进一步伪装,把它缩短。

DVWA下的CSRF通关是怎样的

DVWA下的CSRF通关是怎样的

得到一个短的url:http://r6d.cn/9rGy,提醒一句,以后但凡看见很短的url,然后以很不常见的格式出现,千万别着急点击浏览。

DVWA下的CSRF通关是怎样的

现在的密码已经变成test,不再是123456。

我们还可以编辑一个页面,填好payload,等正常用户浏览访问就执行了。

DVWA下的CSRF通关是怎样的

后缀改成.html.就行了。

DVWA下的CSRF通关是怎样的

真实情况下,这个html文件的表象应该具备各种诱惑力,例如,如何一夜暴富、xxx照等等,让你情不自禁的想去浏览访问。

DVWA下的CSRF通关是怎样的

正当你想开喷时,说好的惊喜呢,怎么是404,哈哈,但其实你已经将你的密码从test修改为password了。

DVWA下的CSRF通关是怎样的

2、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);
}

?>

先看看里面几个重要的函数

eregi()函数: 匹配符合条件的字符串,已经被preg_match() 替代,加i不区分大小写。
stripos函数:返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
$_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址。
$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。

同样的内容,换成1.html

DVWA下的CSRF通关是怎样的

DVWA下的CSRF通关是怎样的

DVWA下的CSRF通关是怎样的

但是实际上没修改完成,因为这个级别的增加了Referer认证,那么将http包头的Referer参数的值中包含主机名就行了。

3、High级别

先放弃,这个token值我一直绕不过去,表示先放弃了,大概绕过的思路知道就行,不求甚解!

4、mpossible级别


if( isset( $_GET[ 'Change' ] ) ) { 
// Check Anti-CSRF token 
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

// Get input 
$pass_curr = $_GET[ 'password_current' ]; 
$pass_new  = $_GET[ 'password_new' ]; 
$pass_conf = $_GET[ 'password_conf' ]; 

// Sanitise current password input 
$pass_curr = stripslashes( $pass_curr ); 
$pass_curr = mysql_real_escape_string( $pass_curr ); 
$pass_curr = md5( $pass_curr ); 

// Check that the current password is correct 
$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); 
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); 
$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); 
$data->execute(); 

// Do both new passwords match and does the current password match the user? 
if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) { 
// It does! 
$pass_new = stripslashes( $pass_new ); 
$pass_new = mysql_real_escape_string( $pass_new ); 
$pass_new = md5( $pass_new ); 

// Update database with new password 
$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); 
$data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); 
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); 
$data->execute(); 

// Feedback for the user 
echo "

Password Changed.
"; 

else { 
// Issue with passwords matching 
echo "
Passwords did not match or current password incorrect.
"; 



// Generate Anti-CSRF token 
generateSessionToken(); 

?>

也是采用PDO技术防护了,根据现实情况,一般防护csrf的办法最常见的就是增加原始密码验证,短信验证、验证码验证,这样基本就很难进行scrf攻击了。

看完上述内容,你们掌握DVWA下的CSRF通关是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程笔记行业资讯频道,感谢各位的阅读!


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
sunshinena
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有