签到就算成功
challenge
题目关键过滤点在while循环检测ejs的模板语法,如果存在除了复制语法外则返回400
solve
首先查看ejs的渲染函数,根据注释和查看源码,可以知道shallowCopyFromList
函数的作用是遍历data中的键值对,如果data中有键名为_OPTS_PASSABLE_WITH_DATA
其中一个,则将其复制到opts
中
所以我们现在可以通过data可控以下几个参数
var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
然后看了下delimiter
是模板引擎中选择的控制符号,默认为%,也就是默认我们使用 <% %>
达到使用模板语句的效果,但是完美被前面的while给防御住了,但是我们只用传入的是<$ $>
然后让模板引擎可以正常的解析的话我们就可以使用模板语句RCE了,如下是delimiter
的复制所以我们的控制符号可以通过opts
可控了
然后检测标签的地方在
完成绕过,最后避免一下缓存就可以了