CodeReview/backend/app/services/agent/knowledge/vulnerabilities/csrf.py

99 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
CSRF跨站请求伪造漏洞知识模块
"""
from ..base import KnowledgeDocument, KnowledgeCategory
CSRF = KnowledgeDocument(
id="vuln_csrf",
title="跨站请求伪造 (CSRF)",
category=KnowledgeCategory.VULNERABILITY,
tags=["csrf", "cross-site", "request-forgery", "state-changing"],
content="""
# 跨站请求伪造 (CSRF)
## 概述
CSRFCross-Site Request Forgery攻击允许攻击者诱导用户在已经认证的Web应用程序上执行非预期的操作。
## 漏洞模式
### 1. 缺少CSRF Token
```python
# 危险模式 - 无CSRF保护
@app.route('/transfer', methods=['POST'])
def transfer():
to_account = request.form['to']
amount = request.form['amount']
# 直接执行转账没有CSRF验证
execute_transfer(to_account, amount)
```
### 2. Token验证绕过
```python
# 危险模式 - Token可预测或未正确验证
def verify_csrf(request):
token = request.form.get('csrf_token')
# 只检查token存在不验证值
return token is not None # 应该比较实际值
```
### 3. 敏感操作使用GET请求
```python
# 危险模式 - 状态更改操作使用GET
@app.route('/delete/<id>', methods=['GET'])
def delete_item(id):
Item.query.filter_by(id=id).delete()
```
## 发现技术
1. 检查状态更改操作的HTTP方法
2. 验证是否存在CSRF Token
3. 检查Token验证逻辑
4. 查找SameSite Cookie配置
5. 分析敏感操作的保护机制
## 测试步骤
1. 识别状态更改端点POST/PUT/DELETE
2. 检查请求中是否包含CSRF Token
3. 尝试重放请求不带Token或使用过期Token
4. 检查Referrer验证
5. 测试跨域请求
## 修复建议
```python
# 安全模式 - 使用CSRF Token
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
@app.route('/transfer', methods=['POST'])
@csrf.exempt # 不要使用exempt
def transfer():
# Token自动验证
pass
# 安全模式 - SameSite Cookie
response.set_cookie(
'session',
value=session_id,
samesite='Strict', # 或 'Lax'
secure=True,
httponly=True
)
```
## 严重性评估
- 涉及资金操作Critical
- 涉及账户设置High
- 涉及数据修改Medium
- 仅影响个人偏好Low
""",
)
__all__ = ["CSRF"]