an4er

Want to be a Ctfer, Developer, Red Team


HxpCTF valentine WP

Published March 22, 2023

签到就算成功

challenge

题目关键过滤点在while循环检测ejs的模板语法,如果存在除了复制语法外则返回400

image-20230322183606409

solve

首先查看ejs的渲染函数,根据注释和查看源码,可以知道shallowCopyFromList函数的作用是遍历data中的键值对,如果data中有键名为_OPTS_PASSABLE_WITH_DATA其中一个,则将其复制到opts

image-20230322184026486

所以我们现在可以通过data可控以下几个参数

var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];

然后看了下delimiter是模板引擎中选择的控制符号,默认为%,也就是默认我们使用 <% %> 达到使用模板语句的效果,但是完美被前面的while给防御住了,但是我们只用传入的是<$ $>然后让模板引擎可以正常的解析的话我们就可以使用模板语句RCE了,如下是delimiter的复制所以我们的控制符号可以通过opts可控了

image-20230322184340053

然后检测标签的地方在

image-20230322185444762

完成绕过,最后避免一下缓存就可以了