shacker_shen

导航

攻防世界Web_shrine

题目:

 

 

 给的是源代码,整理一下如下:

 

 

 看到jinjia flask,render_template_string猜测到这题应该是考查python模板注入。

代码分析可以得到以下信息:

1.路径在 /shrine/ 下

2.将()都用空格替换 所以通过render()渲染函数方式失效。这里的方式是适用内置函数:get_flashed_messages(), url_for()

3.黑名单有config,self

url_for()
一般我们通过一个URL就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL呢?
url_for函数就可以帮我们实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。
get_flashed_messages()
返回之前在Flask中通过 flash() 传入的闪现信息列表。
把字符串对象表示的消息加入到一个消息队列中,然后通过调用get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)

解题过程:参考python_template_injection这篇。
1.测试路径发现是模板注入点

 2.查询当前类

 

 3.查询当前类所继承的基类

 

 4.查询引用这些基类的列表发现报错,之前方法行不通,换给方法。

payload换成{{url_for.__globals__}}查找当前当前的app

 

 查看当前配置,找到flag.

 

或用get_flashed_messages()

 

 

 

总结:

flask 在 /shrine/ 下的 SSTI模板注入方法payload如下:

 {{url_for.__globals__['current_app'].config}}

{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

 

 

 

 



posted on 2022-02-25 00:01  shacker_shen  阅读(106)  评论(0编辑  收藏  举报