Files
examination/topics/cybersecurity/web-security/code_reading.json
T
wonder 70e368e235
Deploy Examination / deploy (push) Successful in 7s
feat: add cybersecurity topic with 6 subtopics (204 questions)
New topic group: 网络安全专题 (cybersecurity)
Subtopics:
- web-security: Web 安全基础 (34 questions)
- crypto-basics: 密码学基础 (34 questions)
- buffer-overflow: 缓冲区溢出与漏洞利用 (34 questions)
- os-security: 操作系统安全 (34 questions)
- network-attack: 网络攻防 (34 questions)
- secure-coding: 安全编程实践 (34 questions)

Question types per subtopic:
- single_choice × 20
- true_false × 10
- short_answer × 3
- code_reading × 1

Difficulty range: 1-3 (基础)
2026-09-17 13:33:04 +08:00

74 lines
5.9 KiB
JSON

{
"topic": "web-security",
"type": "code_reading",
"schema_version": "1.0.0",
"generated": "2026-09-17T00:00:00+08:00",
"questions": [
{
"id": "cr-001",
"type": "code_reading",
"difficulty": 3,
"tags": [
"web安全",
"sql注入",
"xss",
"ssrf",
"文件上传"
],
"question": "阅读以下 PHP 代码,该代码实现了一个简单的文件处理功能。请分析其中存在的安全漏洞。",
"source": null,
"related": [],
"code": "<?php\n// 文件上传处理\nif ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) {\n $file = $_FILES['avatar'];\n $filename = $file['name'];\n $target = \"uploads/\" . $filename;\n move_uploaded_file($file['tmp_name'], $target);\n echo \"File uploaded: <a href='$target'>$filename</a>\";\n}\n\n// 用户搜索功能\nif (isset($_GET['keyword'])) {\n $keyword = $_GET['keyword'];\n $conn = new mysqli('localhost', 'root', 'password123', 'mydb');\n $sql = \"SELECT * FROM products WHERE name LIKE '%$keyword%'\";\n $result = $conn->query($sql);\n echo \"<h2>Results for: $keyword</h2>\";\n while ($row = $result->fetch_assoc()) {\n echo \"<p>{$row['name']} - {$row['price']}</p>\";\n }\n}\n\n// URL 抓取功能\nif (isset($_GET['url'])) {\n $content = file_get_contents($_GET['url']);\n echo $content;\n}\n?>",
"language": "php",
"sub_questions": [
{
"index": 1,
"type": "single_choice",
"question": "代码中的文件上传部分存在哪些安全问题?",
"options": {
"A": "仅缺少文件大小限制",
"B": "未验证文件类型和扩展名、使用原始文件名、存在存储型 XSS",
"C": "仅存在目录遍历风险",
"D": "仅缺少 CSRF Token"
},
"answer": "B",
"explanation": "文件上传代码存在多个严重问题:①未验证文件类型和扩展名,攻击者可上传 .php 等可执行脚本;②使用原始文件名 $file['name'],可能导致路径遍历(如 ../../etc/cron.d/evil)或文件名解析漏洞;③直接将文件名输出到 HTML 中(`<a href='$target'>$filename</a>`),未做转义,存在存储型 XSS。选项 A 只提到大小限制,选项 C 只提到目录遍历,选项 D 只提到 CSRF,均不够全面。因此正确答案是 B。"
},
{
"index": 2,
"type": "single_choice",
"question": "搜索功能中的 SQL 查询存在什么漏洞?以下哪个 payload 可以利用该漏洞获取所有用户数据?",
"options": {
"A": "keyword=test",
"B": "keyword=' UNION SELECT username, password, email FROM users--",
"C": "keyword=<script>alert(1)</script>",
"D": "keyword=127.0.0.1"
},
"answer": "B",
"explanation": "搜索功能中 `$keyword` 直接拼接到 SQL 查询中,存在 SQL 注入漏洞。选项 B 使用联合查询注入(UNION SELECT),通过闭合原有的 LIKE 条件,注入 UNION 查询来读取 users 表中的敏感数据(用户名、密码、邮箱)。`--` 用于注释掉后续 SQL。选项 C 是 XSS payload,虽然代码中也存在 XSS 漏洞(`$keyword` 未经转义输出),但不能获取数据库数据。选项 A 是正常搜索,选项 D 是 IP 地址,均不能利用该 SQL 注入。"
},
{
"index": 3,
"type": "single_choice",
"question": "URL 抓取功能存在什么类型的漏洞?攻击者可以如何利用?",
"options": {
"A": "XSS 漏洞,注入脚本到 URL 参数",
"B": "SQL 注入,通过 URL 参数修改数据库查询",
"C": "SSRF 漏洞,可以读取本地文件或访问内网服务",
"D": "文件上传漏洞,通过 URL 上传文件到服务器"
},
"answer": "C",
"explanation": "`file_get_contents($_GET['url'])` 直接使用用户输入的 URL 发起请求,且未对协议和目标地址做任何限制,存在严重的 SSRF 漏洞。攻击者可以:①使用 `file:///etc/passwd` 读取服务器本地文件;②使用 `http://169.254.169.254/latest/meta-data/` 获取云实例元数据和临时凭证;③访问内网服务如 `http://192.168.1.1:8080/admin`。此外,`echo $content` 将远程内容直接输出,还可被利用进行 XSS 攻击(存储型或反射型),但该功能的核心漏洞是 SSRF。因此正确答案是 C。"
},
{
"index": 4,
"type": "short_answer",
"question": "请针对代码中的三个功能模块,分别给出至少一条关键修复建议。",
"answer": "1. 文件上传:①使用白名单验证文件扩展名(仅允许 jpg/png/gif 等);②使用 move_uploaded_file 前检查文件 MIME 类型和 Magic Number;③将文件重命名为 UUID 等随机名称;④对输出的文件名使用 htmlspecialchars() 转义。\n2. 搜索功能:①使用参数化查询替换字符串拼接(如 $stmt = $conn->prepare(\"SELECT * FROM products WHERE name LIKE ?\"); $stmt->bind_param('s', $keyword));②对输出的 $keyword 使用 htmlspecialchars() 转义防止 XSS;③不要在代码中硬编码数据库密码,使用环境变量或配置文件。\n3. URL 抓取:①建立允许访问的域名/IP白名单;②限制协议只能为 http/https;③解析 URL 域名后的 IP 地址,拒绝内网 IP 段;④对返回内容做 htmlspecialchars() 转义后再输出。",
"explanation": "该答案针对每个功能模块给出了具体的修复建议。文件上传需要类型验证、重命名和输出转义;搜索功能需要参数化查询、输出转义和凭证安全;URL 抓取需要白名单、协议限制、内网 IP 过滤和输出转义。这些建议涵盖了代码中识别出的所有主要漏洞。"
}
],
"explanation": ""
}
]
}