
1. 项目概述一次竞赛复盘的技术价值最近整理硬盘翻到了前年带队参加全国职业院校技能大赛“网络空间安全”赛项时的一些备赛笔记和真题记录。其中2022年的那道“试题8”让我印象尤为深刻。它不像一些单纯考察漏洞利用的题目那样直接而是将多个看似独立的安全风险点巧妙地嵌套在一个接近真实业务逻辑的场景里对选手的“攻击面梳理”和“纵深渗透”能力提出了很高的要求。当时我和队员们为了彻底吃透这道题前前后后折腾了将近一周从最初的毫无头绪到中间的反复试错再到最后梳理出一条清晰的攻击链整个过程本身就是一次极佳的综合能力训练。今天我想抛开标准的“参考答案”格式从一个一线教练和渗透测试从业者的角度重新拆解这道题。我的目的不是提供一个“标准答案”而是分享我们当时是如何思考的、遇到了哪些坑、以及最终如何将这些分散的技术点串联成一个完整故事的。这道题涉及Web安全、主机信息收集、权限提升等多个层面非常适合用来检验和提升中高级水平学习者的综合实战能力。无论你是正在备赛的学生还是希望巩固Web渗透知识的安全爱好者相信这篇基于实战的深度解析都能给你带来一些不一样的启发。2. 试题环境与核心目标拆解拿到任何一道CTF或实战模拟题第一步永远不是急着去扫描、去爆破而是静下心来像侦探勘察现场一样理解环境、明确目标。这是很多新手容易忽略却至关重要的一步。2.1 初始访问点分析根据回忆试题8提供了一个Web访问入口。通常这类竞赛题的初始入口会是一个IP地址加端口例如http://192.168.1.100:8080。访问后呈现的是一个具备基础功能的网站可能是一个内容管理系统CMS、一个办公系统OA或者一个自定义开发的Web应用。我们的首要任务是进行快速的信息收集技术栈指纹识别使用浏览器插件如Wappalyzer或命令行工具如whatweb快速识别前端框架、后端语言、Web服务器、数据库类型等。例如识别出是PHP 7.x Apache MySQL的组合或是Spring Boot Tomcat的架构。这直接决定了后续漏洞利用的方向。目录与文件发现使用工具如dirsearch,gobuster或ffuf配合一个强大的字典对网站目录和隐藏文件进行扫描。重点寻找后台管理入口 (/admin,/manage,/wp-admin)配置文件 (/config.php,/web.config,/.env)备份文件 (/.git/,/.svn/,/*.bak,/*.tar.gz)接口文件 (/api/,/upload/,/export)参数与功能点梳理手动浏览网站的每一个链接、表单和功能。关注用户登录、注册、找回密码。文件上传点任何可以传图片、附件的地方。数据查询或展示功能如新闻列表、用户搜索、订单查询这里常存在SQL注入或XSS。任何包含文件包含功能的地方如?fileabout.php。注意在竞赛环境中扫描力度要适度。过于暴力的扫描可能导致IP被临时封禁或者触发防护告警影响其他题目。建议使用-t参数降低线程或使用--delay增加请求间隔。2.2 最终目标定义这类赛题的目标通常是阶梯式的。初步目标可能是获取Web服务器的webshell即能够在服务器上执行命令的权限。但这往往只是“立足点”最终目标Flag可能存放在数据库中某个特定表里。服务器本地文件系统的某个路径下如/flag,/root/flag.txt。内网另一台机器上需要以当前服务器为跳板进行横向移动。当前主机的更高权限用户如root手中需要进行权限提升。因此我们的攻击链规划必须是“Web入口 - Web权限 - 数据库/系统权限 - 横向移动/提权 - 获取最终Flag”。试题8的巧妙之处在于它可能将Flag的获取条件与一个需要多步骤组合利用才能触发的“敏感操作”绑定在一起。3. 漏洞链构建与关键技术点实战基于初步的信息收集我们假设识别出了几个潜在的风险点一个存在SQL注入的搜索框、一个头像上传功能、以及一个疑似本地文件包含LFI的参数。真正的挑战在于如何将它们有机地组合起来。3.1 突破口从SQL注入到获取敏感信息我们首先发现http://target/search.php?keywordtest这个搜索接口对keyword参数未做过滤。通过注入测试keywordtest页面返回了数据库错误信息确认存在字符型SQL注入。常规利用与碰壁 我们立刻使用sqlmap进行自动化注入sqlmap -u “http://target/search.php?keywordtest” --batch --dbs。很快我们获取了数据库名并成功枚举出表名和字段。我们发现了users表里面包含了username,password_hash等字段。 然而当我们兴致勃勃地尝试去破解这些哈希值时发现它们用的是强盐值salt的SHA256加密在竞赛有限时间内几乎不可能破解。同时我们也未在数据库中直接找到Flag。第一条路看似走通了实则进入了死胡同。关键转折利用注入读取服务器文件 这时我们需要转变思路。既然SQL注入存在且数据库用户权限可能不低我们能否利用它做点别的在MySQL中有一个函数叫LOAD_FILE()可以读取服务器上的文件内容。我们尝试keywordtest UNION SELECT LOAD_FILE(/etc/passwd), null-- -如果成功页面可能会显示/etc/passwd的内容这能帮助我们了解系统用户。更重要的是我们可以尝试读取Web应用的配置文件因为里面往往有数据库连接密码甚至其他敏感路径。 我们尝试猜测配置文件路径/var/www/html/config.php,/var/www/html/inc/config.inc.php,/var/www/html/application/config/database.php等。 最终通过注入LOAD_FILE(/var/www/html/conn.php)我们成功读取到了配置文件其中包含了数据库明文密码以及一个有趣的路径$upload_path ‘/var/www/html/uploads/’。实操心得在CTF中当直接的数据获取受阻时立刻思考SQL注入的“扩展利用”。LOAD_FILE()和INTO OUTFILE/DUMPFILE写文件是两大神器。读取配置文件是突破僵局的常见手段。3.2 结合点利用上传与文件包含获取Webshell现在我们手头有两条信息1. 一个文件上传点头像上传2. 一个可能存在的文件包含漏洞例如http://target/show.php?pageabout。上传绕过测试 访问头像上传功能发现它只允许上传jpg,png,gif格式并且会检查文件内容头Magic Bytes。直接上传shell.php会被拒绝。 我们尝试了多种绕过方式双写后缀shell.php.jpg- 被后端截取.jpg前的部分失败。大小写绕过shell.PHp- 被统一转为小写后检查失败。修改Content-Type将Content-Type: application/php改为image/jpeg- 服务器端似乎不仅检查这个失败。制作图片马使用copy shell.jpg /b shell.php /a webshell.jpg命令制作包含PHP代码的图片文件。上传成功但访问/uploads/webshell.jpg时代码并不会被执行它只是被当作图片解析。文件包含LFI的妙用 这时我们回想起之前信息收集时发现的一个参数page。访问http://target/show.php?pageabout会显示关于我们页面。我们测试LFIpage../../../../etc/passwd。成功服务器返回了/etc/passwd的内容确认存在目录遍历漏洞。 那么能否利用LFI来执行我们上传的图片马中的PHP代码呢答案是肯定的这被称为“文件包含配合文件上传”的经典组合拳。PHP的include或require函数在包含文件时会将其内容作为PHP代码执行只要该文件内容符合PHP语法无论其后缀名是什么。 我们构造Payloadhttp://target/show.php?page../../../uploads/webshell.jpg服务器会尝试去包含这个图片文件。当它读取文件内容时遇到?php phpinfo();?这样的标签就会启动PHP解析器执行其中的代码。于是我们成功在页面上看到了phpinfo()的输出这等同于获得了一个能够执行任意PHP代码的“ Webshell”。写入更稳定的Webshell 通过包含图片马执行代码我们可以利用PHP的文件写入函数在服务器上创建一个真正的、后缀为.php的Webshell文件。 我们构造一个POST请求向show.php?page../../../uploads/webshell.jpg发送数据其中图片马里的代码是?php if(isset($_POST[‘cmd’])) { system($_POST[‘cmd’]); } ?然后我们再用这个“临时Webshell”执行命令echo ‘?php eval($_POST[“ant”]);?’ /var/www/html/shell.php。 这样一个更稳定、功能更强大的 Webshellshell.php就被写入到了Web目录下我们可以直接连接蚁剑或冰蝎进行后续操作。注意事项1. 上传路径的绝对路径我们是从SQL注入读取的配置文件中获得的这是信息串联的关键。2. 在利用LFI包含上传文件时可能需要尝试不同的路径深度 (../的数量)这取决于show.php文件与uploads目录的相对位置。3.3 权限提升与Flag获取拿到Webshell后我们通常处于一个低权限的Web服务用户身份下比如www-data或apache。执行whoami和id命令确认当前用户权限。信息收集主机层面系统版本与内核uname -a 为寻找本地提权Privilege Escalation漏洞做准备。运行的服务与进程ps aux 查看是否有以root身份运行的可疑服务或程序。具有SUID/SGID权限的特殊文件find / -perm -us -type f 2/dev/null。SUID文件在执行时会以文件所有者的身份运行。如果找到一个属于root且具有SUID权限的、我们又能控制的程序可能就是提权点。定时任务Cron Jobscat /etc/crontab或crontab -l 查看是否有定期执行的脚本且该脚本我们是否有写入权限。用户主目录ls -la /home/和ls -la /root/如果可读寻找历史文件、密码文件、SSH密钥等。试题8中的提权场景 在我们的实战中通过sudo -l命令需要当前用户有sudo权限且知道密码但有时配置不当可能不需要密码发现www-data用户被允许以root身份无需密码运行一个自定义的脚本/opt/backup.sh。 查看这个脚本内容#!/bin/bash tar -czf /backups/web_backup_$(date %Y%m%d).tar.gz /var/www/html/*这是一个简单的备份脚本用tar命令打包网站目录。这里存在一个经典的“通配符注入”提权漏洞。漏洞原理当在命令行中使用通配符*时Shell会先对其进行扩展。如果我们可以控制被打包目录这里是/var/www/html/下的文件名就可以注入命令行参数。利用方法在/var/www/html/目录下创建两个特殊文件touch /var/www/html/--checkpoint1 touch /var/www/html/--checkpoint-actionexecsh shell.sh--checkpoint和--checkpoint-action是tar命令的参数用于在备份过程中执行动作。再创建一个恶意脚本shell.sh在同一个目录内容为给/bin/bash设置SUID权限#!/bin/bash chmod us /bin/bash并给它执行权限chmod x shell.sh。当root用户执行/opt/backup.sh时脚本中的tar -czf ... /var/www/html/*命令会被展开。由于我们创建了以--开头的文件它们会被tar解析为命令行参数而非被打包的文件。于是实际执行的命令相当于tar -czf /backups/web_backup_xxx.tar.gz --checkpoint1 --checkpoint-actionexecsh shell.sh [其他文件...]这会导致tar在执行备份过程中运行我们的shell.sh脚本从而将/bin/bash设置为SUID。提权等待定时任务执行或手动触发备份后我们运行/bin/bash -p-p参数表示保留提升的权限这样我们就获得了一个root身份的bash shell。最后在/root目录下我们找到了最终的Flag文件cat /root/flag.txt。4. 核心防御视角与备赛训练建议作为防守方或者从备赛训练的角度看这道题几乎涵盖了Web安全防护的各个薄弱环节。复盘整个攻击链每一个环节的失守都对应着一个可以加强的防御点。4.1 针对漏洞链的逐点防御SQL注入防御根本措施使用参数化查询Prepared Statements或ORM框架确保用户输入永远不被解释为SQL代码。辅助措施对输入进行严格的类型检查和长度限制使用Web应用防火墙WAF规则进行过滤遵循最小权限原则数据库用户只赋予应用所需的最小权限禁止FILE权限等。不安全的文件上传防御白名单策略只允许特定的、安全的文件扩展名如.jpg,.png而非黑名单。文件内容校验不仅检查MIME类型更应检查文件头魔数Magic Numbers和文件内容结构。重命名与隔离对上传的文件进行随机化重命名如UUID并存储在Web根目录之外通过后端脚本代理访问。禁用上传目录的脚本执行权限通过服务器配置如Apache的php_admin_flag engine off。病毒扫描对上传文件进行恶意代码扫描。本地文件包含LFI防御避免动态包含尽量避免使用用户输入直接控制文件路径。如果必须则采用白名单机制。路径固定如果需要包含不同模块使用一个固定的映射表如$pages [‘about’ ‘about.php’, ‘contact’ ‘contact.php’]而不是直接拼接。输入净化严格过滤输入中的../等目录遍历字符。权限提升防御最小权限原则Web服务运行用户如www-data必须是一个低权限用户绝不能有sudo权限或运行SUID程序的能力。安全脚本编写在Shell脚本中避免使用通配符*与用户可控的路径直接结合。如果需要应使用--参数来明确终止选项解析或者遍历目录时使用find -exec等更安全的方式。定期审计定期使用类似linpeas这样的脚本进行主机安全审计检查异常的SUID文件、sudo权限、可写定时任务等。4.2 对参赛选手的训练建议这道题完美诠释了“攻击链”思维。在训练时不能只满足于孤立地练习SQL注入、文件上传等单项技术而要有意识地进行“串联”训练。建立标准化流程形成自己的“作战流程”从信息收集、漏洞探测、漏洞利用、到权限维持、内网横向、痕迹清理每一步用什么工具、看什么信息都要形成肌肉记忆。培养“突破僵局”的思维当一条路走不通时如SQL注入拿不到密码要立刻思考技术的“横向利用”如读文件、写文件。多了解每种漏洞的“非常规”利用方式。重视权限提升Privilege Escalation这是区分初级和中级选手的关键。要熟练掌握Linux/Windows下常见的提权方法并学会使用自动化枚举脚本如LinPEAS, WinPEAS来加速信息收集。从防守理解进攻多花时间学习安全开发、安全运维的知识。只有明白了防御措施通常如何部署才能更有效地找到其疏漏之处。尝试自己搭建一个存在漏洞的靶场然后从防御角度去修复它这个过程能极大地加深理解。文档与复盘像我们这次做的一样对每一道复杂的题目进行详细的复盘和记录。记录下你的思考过程、尝试过的失败方法、以及最终的成功路径。这份文档将成为你个人最宝贵的知识库。这道2022年的国赛题其技术点本身或许并不算最新颖但它所体现的“多漏洞组合利用”和“纵深渗透”思想在任何时候都不会过时。安全攻防的本质很多时候就是一场关于信息差和思维缜密度的较量。希望这次基于实战的深度解析能帮助你不仅“解出”一道题更能掌握解开一整类问题的方法。在真正的渗透测试或安全竞赛中这种将零散信息拼凑成完整攻击地图的能力远比记住几个漏洞的利用代码要重要得多。