博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DVWA笔记之三:CSRF
阅读量:5141 次
发布时间:2019-06-13

本文共 4277 字,大约阅读时间需要 14 分钟。

CSRF与XSS不同,它称为跨站请求伪造,它是利用其他页面的恶意脚本来加载访问或操作存在CSRF的漏洞的可信网站。

1.Low级别

核心代码如下:

<?php 

if( isset( $_GET'Login' ] ) ) { 
    
// Get username 
    
$user $_GET'username' ]; 
    
// Get password 
    
$pass $_GET'password' ]; 
    
$pass md5$pass ); 
    
// Check the database 
    
$query  "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"
    
$result mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res false)) . '</pre>' );
    if( 
$result && mysqli_num_rows$result ) == ) { 
        
// Get users details 
        
$row    mysqli_fetch_assoc$result ); 
        
$avatar $row["avatar"]; 
        
// Login successful 
        
echo "<p>Welcome to the password protected area {
$user}</p>"
        echo 
"<img src=\"{
$avatar}\" />"
    } 
    else { 
        
// Login failed 
        
echo "<pre><br />Username and/or password incorrect.</pre>"
    } 
    ((
is_null($___mysqli_res mysqli_close($GLOBALS["___mysqli_ston"]))) ? false $___mysqli_res); 
?> 

没有加任何过滤和验证,抓去请求包如下:

发现它是通过GET形式提交,因此可以构造如下恶意网页1.html:

<iframe hidden src="http://www.xxx.com/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change" ></iframe>

将其如果能让可信用户访问,那么会自动更改密码为passowrd。

2.Medium级别

核心代码:

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

首先想到的是直接伪造REFFER头,但是Cookie也要跟着伪造,此时的PHPSESSION却无法获取,因此只能换一种其他思路。

还是想着如何进行绕过过滤函数吧。

首先了解下striops函数

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

因此访问的地址里只要存在HOST就可以实现过滤的绕过,因此直接构造链接文件为HOST.html即可。

其中构造的恶意代码不变

3.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(); 
?> 

HIGH级别中加入了令牌机制,一种思路是获取USER_token,带USER_TOKEN提交,第二种思路就是通过XSS获取SESSION,继而提交恶意请求

转载于:https://www.cnblogs.com/vspiders/p/7399089.html

你可能感兴趣的文章
中国六大最忙和六大最懒城市
查看>>
并发编程之死锁
查看>>
Ubuntu 下 su:authentication failure的解决办法
查看>>
Git 使用ssh密钥
查看>>
四叶草与动感线条背景矢量图
查看>>
汇编语言第一章 基础知识 总结
查看>>
商城项目基本框架开源
查看>>
PowerDesigner 15学习笔记:十大模型及五大分类
查看>>
passport 自动取密码
查看>>
Android硬件抽象层(HAL)深入剖析(二)
查看>>
物联仓储系统ZigBee组网原理
查看>>
Linux下Nginx+Tomcat整合的安装与配置
查看>>
linux命令之let、expr
查看>>
Asp.Net Url 传值出现乱码的解决方法
查看>>
JavaScript常用检测脚本(正则表达式)
查看>>
SSM框架+slf4j 以Gradle实现
查看>>
【PHP】Sublime下PHP网站开发指南
查看>>
java编译期优化与执行期优化技术浅析
查看>>
打印object对象
查看>>
LCD开发之汉字显示
查看>>