- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-
워게임 풀다가 관련 개념이 나와서 간단히 정리해 보려 한다.
pug는 html을 더 효과적으로 보여주는 렌더링 엔진이다. pretty option을 통해 입력 값을 들여쓰기 해서 보여줄 수 있는데, 여기서 RCE가 발생할 수 있다고 한다.
visitMixin: function(mixin) {
var name = 'pug_mixins[';
var args = mixin.args || '';
var block = mixin.block;
var attrs = mixin.attrs;
var attrsBlocks = this.attributeBlocks(mixin.attributeBlocks);
var pp = this.pp;
var dynamic = mixin.name[0] === '#';
var key = mixin.name;
if (dynamic) this.dynamicMixins = true;
name +=
(dynamic
? mixin.name.substr(2, mixin.name.length - 3)
: '"' + mixin.name + '"') + ']';
this.mixins[key] = this.mixins[key] || {used: false, instances: []};
if (mixin.call) {
this.mixins[key].used = true;
if (pp)
this.buf.push(
"pug_indent.push('" + Array(this.indents + 1).join(pp) + "');"
);
내부 코드를 보면 pp에 pretty의 입력값을 넣게 된다.
마지막 부분을 보면 버퍼에 push 하는 부분이 있는데, 문법에 맞춰서
')console.log('hello');// 를 넣으면
if (pp)
this.buf.push(
"pug_indent.push('')console.log('hello');//');"
);
이렇게 넣을 수 있다.
이후 버퍼에 흘러들어간 코드가 내부 로직을 통해 실행된다는 것 같다.
3.0.0 이후 버전부터는 조치되었다고 하니, 알아만 놓자.
Reference
https://github.com/pugjs/pug/issues/3312
https://www.piolink.com/kr/service/Security-Analysis.php?bbsCode=security&vType=view&idx=67&page=4
'Study' 카테고리의 다른 글
| JWT (Json web token) (0) | 2025.08.20 |
|---|---|
| Web cache deception (0) | 2025.07.19 |
| Unicode case mapping collision (0) | 2025.06.26 |
| Prototype Pollution (0) | 2025.06.25 |
| CSP (1) | 2025.06.24 |