漏洞知识点《Tornado框架中RequestHandler的对象》
Tornado
框架中RequestHandler
的所有对象
['SUPPORTED_METHODS', '_INVALID_HEADER_CHAR_RE',
'__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', '__weakref__', '_break_cycles',
'_clear_representation_headers', '_convert_header_value', '_decode_xsrf_token',
'_execute', '_get_argument', '_get_arguments', '_get_raw_xsrf_token', '_handle_request_exception',
'_initialize', '_log', '_remove_control_chars_regex', '_request_summary', '_stream_request_body',
'_template_loader_lock', '_template_loaders', '_transforms', '_ui_method', '_ui_module',
'_unimplemented_method', 'add_header', 'check_etag_header', 'check_xsrf_cookie', 'clear',
'clear_all_cookies', 'clear_cookie', 'clear_header', 'compute_etag', 'cookies', 'create_signed_value',
'create_template_loader', 'current_user', 'data_received', 'decode_argument', 'delete', 'detach', 'finish', 'flush', 'get', 'get_argument', 'get_arguments', 'get_body_argument', 'get_body_arguments', 'get_browser_locale', 'get_cookie', 'get_current_user',
'get_login_url', 'get_query_argument', 'get_query_arguments', 'get_secure_cookie',
'get_secure_cookie_key_version', 'get_status', 'get_template_namespace', 'get_template_path',
'get_user_locale', 'head', 'initialize', 'locale', 'log_exception', 'on_connection_close', 'on_finish',
'options', 'patch', 'path_args', 'path_kwargs', 'post', 'prepare', 'put', 'redirect', 'render',
'render_embed_css', 'render_embed_js', 'render_linked_css', 'render_linked_js', 'render_string',
'require_setting', 'reverse_url', 'send_error', 'set_cookie', 'set_default_headers', 'set_etag_header',
'set_header', 'set_secure_cookie', 'set_status', 'settings', 'static_url', 'write',
'write_error', 'xsrf_form_html', 'xsrf_token']
核心方法分类及功能解析
一、请求生命周期方法
-
初始化阶段
initialize()
:接收路由参数(如数据库连接),需开发者自定义初始化逻辑。例如,路由中传递的字典参数会通过此方法注入。prepare()
:在HTTP方法(如get()
)前调用,适合执行权限校验或数据预加载。可在此处调用finish()
提前终止请求。
-
HTTP方法处理
get()/post()/put()/delete()
:需开发者重写以实现业务逻辑,对应HTTP动词的请求处理。head()/options()/patch()
:支持其他HTTP方法的扩展处理。
-
请求结束阶段
on_finish()
:响应完成后触发,用于资源清理或日志记录,不可修改响应内容。finish(chunk=None)
:显式结束响应,异步场景必须调用,支持多次写入后统一发送。
二、参数与数据处理
-
参数获取
get_argument(name)
:从URL或Body中获取单个参数(优先Body),默认去空格。get_arguments(name)
:返回同名参数的列表(适用于多选参数)。get_query_argument(name)
:仅从URL查询字符串获取参数。get_body_argument(name)
:仅从请求体(如表单)获取参数。decode_argument(value)
:处理URL或参数的编码转换(如Unicode解码)。
-
文件与元数据
request.files
:获取上传文件列表(字典形式,包含filename
、content_type
等)。request.remote_ip
:客户端IP地址;request.method
:HTTP请求方法。
三、响应控制与输出
-
状态与头信息
set_status(code, reason)
:设置HTTP状态码及描述(如404, "Not Found"
)。set_header(name, value)
:设置响应头(覆盖同名头);add_header(name, value)
:追加多值头。clear_header(name)
:删除已设置的响应头。
-
内容输出
write(chunk)
:向响应体写入字符串、字节或字典(字典自动转JSON)。flush()
:立即发送缓冲区内容,适用于流式响应。redirect(url)
:重定向到指定URL,支持permanent
参数设置301/302状态。
-
模板渲染
render(template_name, **kwargs)
:渲染模板文件并输出结果,支持动态参数传递。render_string()
:返回渲染后的字符串,用于二次处理。
四、Cookie与安全
-
Cookie管理
get_cookie(name)
:读取Cookie值;set_cookie(name, value)
:设置常规Cookie。get_secure_cookie(name)
:读取签名Cookie;set_secure_cookie(name, value)
:设置加密Cookie。clear_all_cookies()
:清除所有Cookie。
-
安全机制
check_xsrf_cookie()
:验证CSRF令牌,防止跨站请求伪造。xsrf_form_html
:生成隐藏的CSRF令牌字段,需嵌入表单。
五、异步与扩展功能
-
异步处理
data_received(chunk)
:处理流式请求体数据,需配合@stream_request_body
装饰器。on_connection_close()
:客户端断开连接时触发,用于清理异步任务。
-
路由与上下文
reverse_url(name)
:通过路由名称生成URL(需在路由中定义name
参数)。settings
:访问应用级配置(如debug
模式、cookie_secret
)。
六、错误处理与日志
-
异常处理
write_error(status_code, **kwargs)
:自定义错误页面,可重写以美化输出。send_error(status_code)
:触发错误响应并调用write_error
。
-
日志记录
log_exception(typ, value, tb)
:记录异常信息到日志系统。_request_summary()
:生成请求摘要(如GET /path
),用于日志输出。
七、特殊属性与内部方法
request
:获取HTTPServerRequest
对象,包含完整的请求元数据(如headers
、path
等)。SUPPORTED_METHODS
:定义支持的HTTP方法列表(可扩展如PROPFIND
)。path_args/path_kwargs
:从URL正则捕获的参数(如/user/(\d+)
中的数字)。
SSTI(服务器端模板注入)相关的核心方法及属性
一、敏感配置与全局变量访问
-
handler.settings
- 作用:指向
Application.settings
,包含应用级配置(如cookie_secret
、数据库连接参数等)。 - 利用场景:
- 注入
{{handler.settings}}
可直接获取cookie_secret
,用于签名Cookie或生成文件哈希(如护网杯2018题目中的md5(cookie_secret + filename)
)。 - 示例Payload:
{{handler.settings}} # 返回包含cookie_secret的字典
- 注入
- 作用:指向
-
handler.__init__.__globals__
- 作用:访问
RequestHandler
构造函数中的全局命名空间,暴露内置函数(如eval
、__import__
)。 - 利用场景:
- 通过链式调用执行系统命令:
{{handler.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
- 通过链式调用执行系统命令:
- 作用:访问
二、参数注入与数据获取
-
handler.get_argument(name)
/handler.get_arguments(name)
- 作用:从URL查询或请求体中获取参数值,默认去空格。
- 利用场景:
- 若参数未过滤直接渲染到模板中,可构造恶意输入触发SSTI:
{{eval(handler.get_argument('payload'))}} # 传递?payload=__import__("os").system("id")
- 常用于绕过过滤,动态传递攻击载荷。
- 若参数未过滤直接渲染到模板中,可构造恶意输入触发SSTI:
-
handler.decode_argument(value)
- 作用:解码URL或参数中的编码值(如Unicode转义)。
- 利用场景:
- 绕过字符过滤,例如用
\u006f
代替字母o
:{{handler.decode_argument("\u006f\u0073").popen("ls").read()}}
- 绕过字符过滤,例如用
三、Cookie与安全机制操作
-
handler.get_secure_cookie(name)
- 作用:读取加密的Cookie值,依赖
cookie_secret
签名验证。 - 利用场景:
- 若
cookie_secret
泄露(通过handler.settings
),可伪造管理员Cookie:{{handler.settings['cookie_secret']}} # 获取密钥后伪造签名
- 若
- 作用:读取加密的Cookie值,依赖
-
handler.set_secure_cookie(name, value)
- 作用:设置加密Cookie,需配合
cookie_secret
使用。 - 风险点:若攻击者能控制
cookie_secret
,可篡改任意Cookie。
- 作用:设置加密Cookie,需配合
四、模板渲染与执行控制
-
handler.render(template_name, **kwargs)
- 作用:渲染模板文件并输出结果。
- 漏洞场景:
- 用户输入直接嵌入模板(如
render_string(user_input)
),导致任意代码执行。 - 示例漏洞代码:
self.render("template.html", content=user_input) # user_input含{{恶意代码}}
- 用户输入直接嵌入模板(如
-
handler.write(content)
- 作用:向响应体写入内容,支持字符串或字典(自动转JSON)。
- 风险点:若未转义用户输入,可能触发XSS或模板注入。
五、特殊属性与沙箱逃逸
-
handler.request
- 作用:包含请求元数据(如
method
、headers
、remote_ip
)。 - 利用场景:
- 结合
request.method
动态获取参数名:{{eval(handler.get_argument(handler.request.method))}} # 通过GET/POST传递载荷
- 结合
- 作用:包含请求元数据(如
-
handler.application
- 作用:关联的
Application
实例,可访问全局路由和配置。 - 高级利用:篡改路由规则或配置参数,例如修改文件路径指向恶意资源。
- 作用:关联的
六、防御与安全建议
- 输入过滤与转义:避免直接渲染用户输入,使用
tornado.escape.xhtml_escape
转义。 - 禁用调试模式:生产环境中设置
debug=False
,防止敏感信息泄露。 - 限制模板作用域:通过
autoescape
配置强制转义模板变量,或使用沙箱环境。 - 密钥管理:保护
cookie_secret
,避免通过handler.settings
泄露。