Web漏洞_CSRF学习

一、原理

CSRF(Cross-site request forgery)跨站请求伪造。当受害者在与目标网站保持一个会话连接的时候,这时黑客构造了一个可以执行在目标网站相关操作(如修改密码、转账)的URL发送给受害者,受害者点击之后执行了此操作。需要注意的就是受害者必须与目标网站保持连接,这是点击链接之后才会执行操作。

二、DVWA靶机实验

Low级别

打开页面显示修改密码,需要输入新密码然后确定,当点击提交之后查看URL,显示了GET方式提交
此时如果黑客事先下载并研究了这个流程之后,可以构造一条URLhttp://192.168.1.4/vulnerabilities/csrf/?password_new=abc&password_conf=abc&Change=Change#原始用户为1337密码为charley然后发送给1337用户,当点击后显示页面
在这里插入图片描述
说明密码已经修改。这时退出登陆,通过原密码已经无法登陆,通过abc可以登陆

medium级别

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Checks to see where the request came from
    if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
        // 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 = mysql_real_escape_string( $pass_new );
            $pass_new = md5( $pass_new );

            // Update the database
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
            $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</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>";
    }

    mysql_close();
}

?> 

查看后台源代码
通过使用eregi()函数增加了一层检查,此函数的作用就是在$_SERVER[ 'HTTP_REFERER' ] (引导用户代理到当前页的前一页的地址)中检查是否含有$_SERVER[ 'SERVER_NAME' ](当前运行脚本所在的服务器的主机名。),在这个环境下,后者即为192.168.1.4
在这里插入图片描述
即在http包中referer参数中查找host的参数

此时需要准备一台服务器,然后在服务器中创建一个名为HOST的html文件,这时在refer中去检索是否含有host的时候检索到html文件名时就会通过从而导致csrf

首先查看现在
我在vmware win7的网站根目录下创建一个文件,192.168.1.4.html,内容为:
<img src=http://192.168.1.4/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change# >,然后构造URL,http://192.168.216.130/192.168.1.4.html 此时,这段URL即为refer,DVWA会在这段URL中查找是否含有192.168.1.4,由于文件名为192.168.1.4所以会通过检查

在访问这段URL之前,先查看下密码(password)
然后访问链接之后,再通过password来进行登陆已经无法登陆,尝试admin来登陆,成功登陆

说明已经产生了csrf的攻击

标签的使用

<a>标签
<iframe>标签
<img>标签
CSS层叠样式表中background:url(csrf的URL)

三、防御

1、验证码进行验证(二次验证)

2、referer check

3、anti csrf token

检测token的原理:
一般在敏感操作的时候比如修改个人信息的场景,后台程序会随机给用户当前的操作发送一个token,然后当用户提交表单的时候会将token一起发送给后台程序,此时后台程序对讲用户发来的token和后台存储的token值进行比较,如果相同则为合法操作,不同则为非法操作。
token的泄露:
①GET型泄漏:页面包含<img src="URL">时,referer中会携带token
②POST型泄漏:当网站存在XSS漏洞时,如果token包含在cookie中会通过XSS获取token从而获得用户的token。

<think>好的,我需要解释这段Python代码的功能。首先,用户给了一个方法configure_wtf,属于某个类的配置部分。代码涉及Flask-WTF的CSRF保护配置。 首先看方法定义:def configure_wtf(self) -> None:,说明这是一个配置方法,返回类型是None。接下来检查self.config中的"WTF_CSRF_ENABLED"是否为真。如果开启,就初始化CSRF保护,通过csrf.init_app(self.superset_app),将应用实例传入。 然后处理豁免列表,从配置中获取WTF_CSRF_EXEMPT_LIST,遍历每个豁免项,使用csrf.exempt(ex)来排除这些视图的CSRF检查。需要确认csrf是Flask-WTF的CSRF实例,比如可能是from flask_wtf.csrf import CSRFProtect创建的csrf对象。 可能需要注意的点:为什么需要豁免某些视图?比如API端点或不需要CSRF保护的路径。另外,配置项的名称是否符合特定框架(如Superset)的约定。需要确保代码逻辑正确,比如先初始化再豁免,或者顺序是否有影响。可能还要提到Flask-WTF的CSRF工作原理,比如在表单中插入token,验证POST请求等。 总结步骤:检查配置是否启用CSRF,初始化,然后豁免指定视图。确保用户理解各部分的作用,以及配置项的来源和用途。</think>这段代码属于Flask应用(可能是Superset框架)中配置CSRF保护的逻辑。下面逐步解释其作用: --- ### 1. **方法定义** ```python def configure_wtf(self) -> None: ``` 这是一个类方法,用于配置Flask-WTF(Web表单安全防护)相关功能,返回类型为`None`。 --- ### 2. **检查CSRF是否启用** ```python if self.config["WTF_CSRF_ENABLED"]: ``` - 从配置中读取`WTF_CSRF_ENABLED`的值,判断是否启用CSRF保护。 - CSRF(跨站请求伪造)是一种安全机制,用于防止恶意网站伪造用户请求。 --- ### 3. **初始化CSRF保护** ```python csrf.init_app(self.superset_app) ``` - 若CSRF已启用,调用`csrf.init_app()`将CSRF保护绑定到Flask应用实例(`self.superset_app`)。 - 这里`csrf`一般来自`flask_wtf.csrf.CSRFProtect`,需提前导入并创建实例。 --- ### 4. **处理CSRF豁免列表** ```python csrf_exempt_list = self.config["WTF_CSRF_EXEMPT_LIST"] for ex in csrf_exempt_list: csrf.exempt(ex) ``` - 从配置中获取`WTF_CSRF_EXEMPT_LIST`,这是一个需要豁免CSRF保护的视图(路由)列表。 - 遍历列表,通过`csrf.exempt(ex)`对每个视图禁用CSRF检查。 - **豁免场景**:某些API或特殊端点不需要CSRF保护(如开放接口)。 --- ### 关键点总结 | 步骤 | 作用 | |----------------|--------------------------------------------------------------------| | 检查配置开关 | 决定是否启用CSRF保护 | | 绑定CSRF到应用 | 为整个Flask应用添加CSRF防护 | | 豁免特定视图 | 允许某些路由绕过CSRF验证(需谨慎配置) | --- ### 补充说明 - **CSRF工作机制**:在表单中插入隐藏的Token,服务器验证该Token是否匹配。 - **典型配置**:在`config.py`中设置`WTF_CSRF_ENABLED = True`和`WTF_CSRF_EXEMPT_LIST = ['api.route1', 'auth.special_endpoint']`。 - **安全建议**:仅对无需会话验证的接口(如纯API)豁免CSRF,避免安全漏洞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值