Web刷题之旅(一)-攻防世界 站

easy_tornado

题目打开,大概率是模板注入

修改filename,报错

http://124.126.19.106:56689/error?msg=Error

tplmap里跑一下,没有注入的地方,可能注入方式有问题

基于hint要寻找cookie_secret,控制台找不到

查资料无果,查WP:

handler指向的处理当前这个页面的RequestHandler对象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings,这里面就是我们一下环境变量,我们正是从这里获取的cookie_secret

Payload:

?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))

 

shrine

 

得到源码:

import flask
import os

 

app = flask.Flask(__name__)

 

app.config['FLAG'] = os.environ.pop('FLAG')

 


@app.route('/')
def index():
return open(__file__).read()

 


@app.route('/shrine/')

def shrine(shrine):

def safe_jinja(s):

s = s.replace('(', '').replace(')', '')

blacklist = ['config', 'self']

return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__':

app.run(debug=True) 

 看样子可能是flask的模板注入,@app.route后面跟的是浏览器请求的默认方法,即路由,大概率还有过滤

/shrine/{{ 2+2 }}

能返回4,说明的确是ssti,放tplmap里面是没法跑的,因为没有注入点(像id一类)

 倒是第一次接触,查WP:

app.config['FLAG'] = os.environ.pop('FLAG')

注册了一个名为FLAG的config,猜测这就是flag,如果没有过滤可以直接{{config}}即可查看所有app.config内容,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号

return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

上面这行代码把黑名单的东西遍历并设为空,例如:

/shrine/{{config}}

不过python还有一些内置函数,比如url_for和get_flashed_messages

/shrine/{{url_for.__globals__}}

那我们就当前app下的config:

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

get_flashed_messages

返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。

同理

/shrine/{{get_flashed_messages.__globals__['current_app'].config}}

也就是说,我们只要能查看config文件就能获得flag

 

Lottery

买彩票,猜数字,flag要用一定的奖励金额来购买

 

githack一下,源码爆出

 

看了看api.php源码,如下,大致说号码是随机生成的7位,至少猜对两位才能得到奖励

查阅WP:

$numbers 来自用户json输入 {"action":"buy","numbers":"1122334"},没有检查数据类型。 $win_numbers 是随机生成的数字字符串。
使用 PHP 弱类型松散比较,以"1"为例,和TRUE,1,"1"相等。 由于 json 支持布尔型数据,因此可以抓包改包

就是将数据包里面的7位数,修改为7个true(PHP弱类型可以这么用吗?)

之后一直重复,直到可以购买flag为止

posted @ 2020-05-17 14:49  ch0bits  阅读(730)  评论(0编辑  收藏  举报