
1. 项目概述与核心价值最近几年CTFCapture The Flag竞赛在国内外的技术圈子里越来越火它早已不是安全专业学生的专属游戏而是成为了众多开发者、运维工程师乃至技术爱好者检验和提升自己综合能力的绝佳练兵场。我作为一个在安全领域摸爬滚打了十多年的老鸟每年都会关注和参与一些高质量的CTF赛事其中“HGAME”系列赛事的Week1阶段因其题目设计精巧、难度梯度合理常常被我拿来作为给团队新人或对安全感兴趣的朋友的“入门第一课”。“HGAME 2020 Week1”这个标题指的就是2020年HGAME赛事第一周的题目集合。对于刚接触CTF的朋友来说看到这个标题可能会有点懵不知道从何下手。简单来说这就像一场闯关游戏的第一章里面包含了Web安全、逆向工程、密码学、杂项Misc等多个方向的初级题目。解决这些题目不仅能让你快速了解CTF的基本玩法更能帮你建立起对各类安全漏洞最直观的认知。比如一个看似简单的网页可能就藏着SQL注入的漏洞一段被加密的信息可能用基础的凯撒密码就能破解。这个过程远比枯燥地阅读教科书要生动有趣得多。我写这篇文章就是想以一个“过来人”的身份带你重新走一遍HGAME 2020 Week1的解题之路。我不会仅仅给出答案那样意义不大。我会重点拆解每道题目背后的核心考点、解题思路的建立过程、常用工具的使用技巧以及我在实战中踩过的那些坑。无论你是想入门安全领域的学生还是希望拓宽技术视野的开发者甚至是单纯对“黑客技术”感到好奇的爱好者这篇文章都能为你提供一条清晰、可操作的路径。你会发现安全并没有那么神秘那些酷炫的“黑客操作”其底层逻辑往往是由一个个扎实的基础知识点构成的。2. 题目整体分析与解题环境搭建2.1 Week1 题目类型与难度分布拿到一个赛题包第一步不是埋头就干而是先进行“战场侦察”。HGAME 2020 Week1的题目通常涵盖四大类Web、Reverse逆向、Pwn二进制漏洞利用、Crypto密码学和Misc杂项。作为第一周题目难度普遍定位在“新手友好”级别但“友好”不代表简单它意味着考点经典、线索明确非常适合用来建立知识体系。以我当时的解题经验来看Week1的题目设计有以下几个特点Web题偏向于基础的OWASP Top 10漏洞比如SQL注入、XSS跨站脚本、文件上传、目录遍历等。题目环境通常是静态或动态网页需要你通过浏览器和代理工具进行交互测试。Reverse题通常是给出一个可执行文件如ELF、PE要求你分析其逻辑找到隐藏的flag。可能会涉及基础的静态分析IDA Pro看汇编/伪代码和动态调试GDB。Crypto题考察古典密码和基础的现代密码概念比如凯撒密码、栅栏密码、Base64编码、简单的异或加密、RSA的公钥解析等。通常不需要复杂的数学推导更多是识别加密类型和寻找工具解密。Misc题五花八门可能涉及图片隐写LSB、文件结构、流量分析Wireshark、编码转换、社会工程学信息收集等。这类题考察的是信息敏感度和工具使用的熟练度。我的准备工作心得在开始解题前我强烈建议你搭建一个隔离的测试环境。我习惯使用虚拟机如VirtualBox安装一个Kali Linux系统。Kali内置了海量的安全工具省去了大量配置时间。如果条件不允许在本地安装一些核心工具也足够了比如Burp SuiteWeb代理、Python用于编写脚本、IDA Pro/Ghidra逆向、Stegsolve/WiresharkMisc。注意所有操作务必在合法授权的环境中进行。CTF题目环境是主办方专门搭建的靶场严禁对非授权目标进行任何测试。2.2 核心工具链配置与快速上手工欲善其事必先利其器。下面我分享几个在解Week1这类入门题时最高频、最有效的工具及其快速上手技巧1. Burp Suite Community Edition (Web测试)这是Web安全测试的“瑞士军刀”。对于新手你只需要掌握最核心的代理和重放功能。设置代理启动Burp在Proxy - Options中确保代理监听如127.0.0.1:8080是开启的。将浏览器推荐Chrome或Firefox的代理设置为相同地址。拦截与修改打开Proxy - Intercept点击“Intercept is on”。这时你在浏览器访问任何网址请求都会被Burp截获。你可以修改其中的参数比如将id1改为id1来测试SQL注入然后点击“Forward”发送修改后的请求。实战技巧遇到有搜索框、登录框的地方先尝试输入一个单引号观察页面返回是否有数据库报错信息。这是判断是否存在SQL注入最快速的方法之一。2. Python3 常用库 (脚本编写)很多题目需要编写小脚本来进行批量尝试、编码解码或数学计算。必备库requests网络请求、hashlib哈希计算、base64、Crypto可能需要单独安装pycryptodome库来处理加密算法。快速上手示例遇到一个需要暴力破解的密码题你可以用Python快速写一个循环。import hashlib target_hash “5f4dcc3b5aa765d61d8327deb882cf99” # 示例MD5 wordlist [“password”, “123456”, “admin”, “hello123”] for word in wordlist: if hashlib.md5(word.encode()).hexdigest() target_hash: print(f“Found password: {word}”) break3. CyberChef (在线编码/加密工具箱)这是一个“神器”级别的网站。当你遇到一段乱码不确定是Base64、Hex、Rot13还是什么其他编码时直接丢到CyberChef里用“Magic”功能它经常能自动识别并解码极大提升效率。4. Stegsolve Binwalk (图片隐写分析)Misc题中常有图片隐写。Stegsolve可以帮你分析图片的各个颜色通道查看LSB最低有效位隐写。Binwalk则可以分析文件结构看图片里是否隐藏了其他文件。常用命令binwalk -e picture.png可以自动提取隐藏的文件。配置好这些工具你的“武器库”就算初步成型了。记住工具是辅助最重要的是你的思路。3. Web类题目实战拆解与深度解析Web是CTF中占比最重的部分也是与现实应用关联最紧密的。我们挑两道HGAME 2020 Week1中非常经典的Web题来深入讲解。3.1 典型SQL注入漏洞从探测到利用假设题目是一个简单的新闻页面URL形如http://target/news.php?id1显示ID为1的新闻内容。第一步漏洞探测与确认基础探测将ID参数改为id1。如果页面返回SQL语法错误如“You have an error in your SQL syntax”那么存在注入漏洞的可能性极大。判断注入类型尝试id1 and 11和id1 and 12。如果前者页面正常后者页面异常无内容或报错则基本可以确定为数字型注入。如果都需要闭合引号如id1 and 11正常id1 and 12异常则为字符型注入。我的踩坑记录新手常犯的错误是看到报错就兴奋地开始用工具盲注却忽略了判断类型。字符型注入如果不闭合引号后续的所有Payload都会失效。第二步信息收集Union查询确认漏洞后目标是获取数据库中的数据flag通常存放在某张表里。判断列数使用order by语句。id1 order by 1order by 2... 依次递增直到页面报错。假设order by 4正常order by 5报错说明当前查询结果有4列。寻找回显点使用union select语句。构造id-1 union select 1,2,3,4。这里把id设为-1或一个不存在的值是为了让原查询无结果从而页面显示我们union查询的结果。观察页面中哪个数字1,2,3,4被显示出来这些位置就是我们可以插入查询语句的回显点。获取数据库信息假设回显点是2和3。我们可以构造id-1 union select 1, database(), version(), 4这样页面就会显示当前数据库名和数据库版本。第三步获取表名与字段名在MySQL中关键信息存储在information_schema数据库里。爆表名id-1 union select 1, group_concat(table_name),3,4 from information_schema.tables where table_schemadatabase()group_concat()函数会将所有表名合并成一个字符串显示。你可能会看到users, news, flag之类的表名。爆字段名假设我们怀疑flag在flag表里。id-1 union select 1, group_concat(column_name),3,4 from information_schema.columns where table_schemadatabase() and table_name‘flag’这样就能得到flag表的所有列名比如id, flag_content。第四步最终获取Flagid-1 union select 1, flag_content,3,4 from flag至此flag就应该显示在页面上了。重要提示以上是基于联合查询的注入。实际中可能会遇到报错注入、布尔盲注、时间盲注等。Week1的题目为了降低难度通常设计成联合查询可直接利用。如果遇到输入无回显的情况就要考虑盲注了思路是通过页面返回的真/假状态或响应时间差异来逐位推断数据这个过程通常需要编写自动化脚本。3.2 文件上传漏洞与绕过技巧另一类经典题目是文件上传。页面允许你上传图片但后端会对文件进行检查。常见检查与绕过方法前端JavaScript检查只检查文件扩展名如.jpg,.png。这是最弱的防护。绕过直接使用Burp Suite拦截上传请求将文件名shell.jpg修改为shell.php即可。或者直接禁用浏览器JavaScript。后端MIME类型检查检查HTTP请求头中的Content-Type字段如image/jpeg。绕过同样用Burp拦截将Content-Type: application/x-php修改为Content-Type: image/jpeg。后端文件内容/魔术字检查检查文件开头的几个字节魔术字例如GIF89a对应GIFÿØÿà对应JPEG。绕过制作图片马。在Linux下可以使用命令cat normal.jpg shell.php webshell.jpg。这样生成的文件既包含合法的图片头又包含PHP代码。如果服务器只检查了文件头就可能被绕过。后端文件扩展名黑名单/白名单黑名单绕过尝试一些罕见但可能被解析的后缀如.php5,.phtml,.phps,.php7。或者在后缀中加空格、点、::$DATAWindows特性等如shell.php.或shell.php末尾有空格。白名单绕过更严格如果只允许.jpg则需要结合其他漏洞。例如利用文件包含漏洞。先上传一个内容为PHP代码的shell.jpg然后找到一个存在本地文件包含LFI的页面通过参数包含它如?file./uploads/shell.jpg这样服务器就会将jpg文件当作PHP来解析。我的实战心得遇到上传题不要上来就传一个明显的shell.php。应该采用“阶梯式测试法”先传一个正常的test.jpg确认上传功能正常。尝试修改扩展名test.php.jpg。尝试修改Content-Type。尝试制作图片马。同时用Burp的Intruder模块加载一个后缀名字典进行模糊测试效率更高。4. Reverse与Crypto类题目精讲4.1 逆向工程入门静态分析定位关键逻辑假设题目给了一个名为crackme的Linux ELF文件运行后要求输入密码。第一步基础信息收集使用file命令查看文件类型strings命令查看文件中可打印的字符串。有时flag或关键提示会直接出现在strings的输出里。file crackme strings crackme | grep -i “flag\|password\|correct\|wrong”第二步使用IDA Pro进行静态分析载入文件用IDA打开选择默认选项分析。定位主函数在函数窗口Functions window里找到main函数按F5反编译成伪代码C语言格式。这是最关键的步骤。分析关键逻辑阅读伪代码。你会看到类似scanf(“%s”, input)的输入语句然后通常跟着一个if判断将你的输入与某个变量或经过某个函数处理后的值进行比较。寻找flag/密码明文比较最理想的情况密码直接出现在代码里如if ( strcmp(input, “SuperSecret123”) )。算法变换更常见的是你的输入会经过一个函数处理然后将结果与另一个值比较。你需要分析这个处理函数。例如它可能是一个简单的循环对每个字符进行异或XOR或加减操作。示例伪代码显示for ( i 0; i strlen(input); i ) v5[i] input[i] ^ 0x10;然后比较v5和“Uiwj!jsf!xpvme”。这是一个简单的异或加密密钥是0x10。你可以写个Python脚本解密.join(chr(ord(c) ^ 0x10) for c in “Uiwj!jsf!xpvme”)得到真正的密码。我的调试技巧如果静态分析看不明白就需要动态调试。使用gdbGNU Debugger。在关键函数如strcmp处下断点运行程序并输入测试值观察寄存器和内存的变化。对于新手可以先用gdb ./crackme载入然后disas main反汇编主函数找到比较指令如call strcmp的地址用break *0x地址下断点再用run执行info registers查看寄存器。4.2 密码学题目识别与破解古典密码Week1的Crypto题通常不会太难核心在于识别密码类型。1. 凯撒密码 (Caesar Cipher)特征字母被替换成字母表中固定偏移后的字母。识别一段无意义的英文字母组合。工具CyberChef的“ROT13 Brute Force”组件可以尝试所有25种偏移。或者写Python脚本循环移位。2. 栅栏密码 (Rail-fence Cipher)特征明文被写成锯齿形然后按行读取得到密文。识别密文长度适中可能提示“栅栏”。工具在线栅栏密码加解密工具很多。关键是尝试不同的栏数密钥。3. Base64/Base32/Base16(Hex) 编码特征Base64包含A-Za-z0-9/末尾常有填充Base32包含A-Z2-7Hex是0-9a-f。识别看字符集。Base64很常见可能多层嵌套。工具CyberChef直接拖入“From Base64”即可。多层就多次解码。4. 摩斯电码 (Morse Code)特征由.点和-划以及分隔符空格或/组成。识别题目描述可能提到“电报”、“滴滴答答”。工具在线摩斯电码解码器。注意区分点划和分隔符。5. 简单异或 (XOR)特征可能给了一段密文和提示“key”或者需要你暴力破解单字节密钥。破解如果密钥是单字节可以写脚本遍历0-255作为密钥进行解密观察输出中是否有可读的英文单词如“flag”。ciphertext bytes.fromhex(“...”) # 假设密文是16进制形式 for key in range(256): plain bytes([b ^ key for b in ciphertext]) if b“flag” in plain or b“FLAG” in plain: # 寻找flag特征 print(f“Key: {key}, Plain: {plain}”)综合解题思路拿到一段密文先观察其字符集和结构猜测可能的编码或密码类型。用CyberChef的“Magic”功能试一下。如果不行结合题目描述如果有的提示如“古代”、“移位”、“栅栏”。记住很多题目是多种编码套娃需要一层层剥开。5. Misc杂项题目思路拓展与工具深潜Misc题目千变万化考察的是发散思维和工具掌握度。5.1 图片隐写术全攻略1. 基础检查binwalk -e image.png检查并自动提取隐藏文件。strings image.png | grep -i “flag\|hgame”在图片中搜索字符串。file image.png确认文件真实类型有时后缀名被篡改。2. LSB最低有效位隐写原理将信息藏在图片每个像素RGB值的最低比特位人眼难以察觉。工具Stegsolve。打开图片后使用“Analyse”菜单下的“Frame Browser”和“Data Extract”功能。在“Data Extract”界面勾选RGB三个通道的最低有效位LSB选择适当的顺序如RGB预览提取出的数据看是否是flag或另一张图片。3. 文件结构修复与分离有时图片文件头被损坏或者多个文件被拼接在一起。工具dd命令。例如已知一个文件由jpg头和zip文件拼接可以用dd分别切出来。dd ifcombined.file ofheader.jpg bs1 count1000 # 切出前1000字节为jpg dd ifcombined.file ofhidden.zip bs1 skip1000 # 跳过1000字节剩下的为zip010 Editor这是一个强大的二进制编辑器可以手动分析文件头尾Magic Bytes修复错误的文件头。例如PNG文件头应为89 50 4E 47如果被修改改回来就能正常打开。5.2 流量包分析与协议取证题目给一个.pcap或.pcapng文件需要用Wireshark分析。打开过滤首先用http或tcp过滤快速查看HTTP请求。追踪流找到可疑的HTTP请求如POST上传、特定路径访问右键 - “追踪流” - “TCP流”或“HTTP流”可以看到完整的请求和响应内容flag可能就在里面。文件导出如果流量中有文件传输如FTP、HTTP下载可以在“文件” - “导出对象” - “HTTP”中找到传输的文件并导出。搜索关键字使用Wireshark的搜索功能CtrlF搜索字符串“flag”、“hgame”、“password”等。我的排查经验对于复杂的流量先看协议统计统计 - 协议分级看哪种协议占比高。如果是Web题重点看HTTP如果是远程访问可能看SSH或Telnet但注意CTF中Telnet流量可能包含键盘输入数据需要从TCP流中提取按键信息。6. 实战中遇到的典型问题与排查实录即使知道了方法实战中还是会遇到各种意想不到的问题。这里记录几个我踩过的坑和解决方法。问题1SQL注入用Union查询时页面没有显示回显点数字。可能原因回显点不在页面主体可能在HTTP响应头、页面的某个隐藏标签如input的value里、或者需要触发特定条件如错误才显示。排查查看Burp Suite的Response完整信息包括HTTP Headers。查看网页源代码CtrlU搜索你Union查询的数字。尝试报错注入如id1 and updatexml(1, concat(0x7e, database()), 1) --看错误信息中是否包含数据。问题2逆向题目用IDA F5反编译失败或伪代码难以阅读。可能原因程序加了壳或者IDA的识别有问题。排查用upx -d crackme尝试脱UPX壳如果用了UPX。尝试使用Ghidra它是NSA开源的逆向工具反编译引擎有时比IDA更好用。回归汇编代码分析。虽然难但结合动态调试gdb在关键函数如strcmp,memcmp下断点观察传入的参数也能推断出逻辑。问题3密码题解密出来是一段乱码不知道下一步怎么办。可能原因解密正确但flag被进一步处理了如反转、二次编码或者解密密钥/模式不对如AES加密除了密钥还有模式CBC/ECB和初始向量IV。排查将解密出的乱码再次用CyberChef的“Magic”功能识别。检查题目描述是否有额外提示比如“倒着看”、“十六进制”。对于现代密码如AES、RSA确认你使用的算法、模式、填充方式是否与题目一致。仔细查看题目给出的任何提示文件如.pem公钥文件用openssl rsa -pubin -in pub.key -text查看其参数。问题4文件上传成功但无法访问或执行。可能原因上传路径不对需要结合目录遍历找到绝对路径。服务器对上传目录没有执行权限。文件内容被安全函数如?php phpinfo(); ?被过滤成?phpinfo(); ?过滤。排查尝试上传一个纯文本文件内容为?php echo “test”; ?访问看能否输出“test”。使用短标签? “test” ?或script language“php”echo “test”;/script尝试绕过过滤。查看服务器返回的上传成功信息确认文件访问URL。最后我想说CTF Week1的题目就像一本精心设计的入门教程每一道题都指向一个经典的安全知识点。解题的过程其实就是主动学习、建立知识关联的过程。遇到卡住的地方别急着找“Writeup”题解多思考、多尝试、多利用搜索引擎和官方文档。那个苦苦思索后终于“灵光一现”的时刻才是CTF最大的乐趣所在。希望这篇基于HGAME 2020 Week1的复盘能帮你推开网络安全这扇大门看到背后那个充满逻辑与挑战的精彩世界。