【juice-shop】★★★★ Server-side XSS Protection:绕过服务端安全措施进行存储型 XSS 攻击

通过 Null Byte 注入获取 package.json.bak,发现存在漏洞的 sanitize-html 库,利用非递归清理的特性进行双层编码绕过,在客户反馈页面执行存储型 XSS 攻击。

【juice-shop】★★★★ Server-side XSS Protection:绕过服务端安全措施进行存储型 XSS 攻击

🎯 挑战目标
使用 <iframe src="javascript:alert(`xss`)"> 代码绕过服务端安全措施进行存储型 XSS 攻击。
💡 官方提示 (Hints)
1. 您要重点关注"客户反馈"页面中的"注释"字段。
2. 在"联系我们"界面的"评论"字段中,您需要重点关注此处。
3. 攻击有效负载 <iframe src="javascript:alert(`xss`)"> 不会被任何验证器拒绝,但在持久化之前会被从评论中移除。
4. 在您之前收集的 package.json.bak 文件中查找可能与输入处理相关的依赖项。
5. 如果出现了 XSS 警告,但挑战在记分板上未显示为已解决,可能是您未能将精确的攻击字符串 <iframe src="javascript:alert(`xss`)"> 正确注入数据库。

前置条件

sanitize-html 库的漏洞

sanitize-html 是一个流行的 HTML 清理库,用于防止 XSS 攻击。但早期版本(如 1.4.2)存在一个严重漏洞:非递归清理

漏洞原理:

1
2
3
4
输入: <<img src="csrf-attack"/>img src="csrf-attack"/>
第一次清理: <img src="csrf-attack"/>
(删除了第一个 <,但没有递归检查)
结果: 恶意标签仍然存在!

开始

第1步

首先,拿到package.json.bak,使用 Poison Null Byte 获取这个文件

1
http://127.0.0.1:3000/ftp/package.json.bak%2500.md

工作原理:

  • %25 = URL 编码的 %
  • %00 = URL 编码的空字节 \0
  • %2500 = 双重编码的空字节
  • 服务器解码后:package.json.bak\0.md
  • 文件系统在 \0 处截断,实际访问:package.json.bak

第2步

这个文件里面藏着一个存在漏洞的依赖 “sanitize-html”: “1.4.2”,对于现状来说还是问ai的快,不过可能会有幻觉。

第3步

我们回到 客户反馈,输入题目给的xss,提交

完成挑战!

到关于我们页面验证,向右滑动到有这个白框的页面,等一会会出现弹窗

使用 Hugo 构建
主题 StackJimmy 设计