[LitCTF 2023]作业管理系统
发布人:shili8
发布时间:2025-02-21 18:35
阅读次数:0
**LitCTF2023: 作业管理系统**
作为一名CTF挑战者,我最近遇到了一个叫做"作业管理系统"的题目。这个题目似乎很简单,但实际上它包含了很多有趣的漏洞和挑战。
**题目描述**
题目描述如下:
"您是学校的一个新老师,负责管理学生的作业。您的任务是开发一个能够处理学生的作业请求的系统。"
**系统设计**
为了实现这个目标,我设计了一个基本的Web应用程序,使用Flask框架和SQLite数据库。
from flask import Flask, request, jsonifyimport sqlite3app = Flask(__name__) # 连接数据库conn = sqlite3.connect('homework.db') cursor = conn.cursor() # 创建表格cursor.execute(''' CREATE TABLE IF NOT EXISTS homeworks ( id INTEGER PRIMARY KEY, student_id INTEGER, title TEXT, content TEXT ) ''') @app.route('/submit', methods=['POST']) def submit_homework(): # 提交作业请求 data = request.get_json() cursor.execute(''' INSERT INTO homeworks (student_id, title, content) VALUES (?, ?, ?) ''', (data['student_id'], data['title'], data['content'])) conn.commit() return jsonify({'message': 'Homework submitted successfully!'}) @app.route('/get_homework', methods=['GET']) def get_homework(): # 获取学生的作业 student_id = request.args.get('student_id') cursor.execute('SELECT * FROM homeworks WHERE student_id=?', (student_id,)) homeworks = cursor.fetchall() return jsonify([{'id': hw[0], 'title': hw[2]} for hw in homeworks]) if __name__ == '__main__': app.run(debug=True)
**漏洞分析**
经过初步检查,我发现这个系统存在一个严重的SQL注入漏洞。攻击者可以通过恶意的JSON数据提交到`/submit`接口,导致数据库中的数据被篡改。
# SQL注入漏洞示例data = {'student_id':1, 'title': 'Malicious Homework', 'content': "SELECT * FROM homeworks WHERE id=1; DROP TABLE homeworks;"} response = requests.post(' json=data) print(response.json()) # {"message": "Homework submitted successfully!"}
**修复漏洞**
为了修复这个漏洞,我们需要在`submit_homework`函数中对用户输入的数据进行过滤和转义。
@app.route('/submit', methods=['POST']) def submit_homework(): # 提交作业请求 data = request.get_json() student_id = int(data['student_id']) # 转换为整数 title = str(data['title']).strip() # 去除空格和转义特殊字符 content = str(data['content']).strip() # 去除空格和转义特殊字符 cursor.execute(''' INSERT INTO homeworks (student_id, title, content) VALUES (?, ?, ?) ''', (student_id, title, content)) conn.commit() return jsonify({'message': 'Homework submitted successfully!'})
**其他漏洞**
除了SQL注入漏洞外,这个系统还存在一个CSRF漏洞。攻击者可以通过在浏览器中打开一个恶意的HTML页面,导致用户的会话被劫持。
# CSRF漏洞示例html = ''' <html> <body> <form action=" method="GET"> <input type="hidden" name="student_id" value="1"> <button type="submit">Get Homework</button> </form> </body> </html> ''' with open('csrf.html', 'w') as f: f.write(html) requests.get(' />
**修复漏洞**
为了修复这个漏洞,我们需要在Flask应用程序中启用CSRF保护。
from flask import Flask, request, jsonifyimport sqlite3app = Flask(__name__) app.config['SECRET_KEY'] = 'secret_key' # 设置秘钥# 连接数据库conn = sqlite3.connect('homework.db') cursor = conn.cursor() # 创建表格cursor.execute(''' CREATE TABLE IF NOT EXISTS homeworks ( id INTEGER PRIMARY KEY, student_id INTEGER, title TEXT, content TEXT ) ''') @app.route('/submit', methods=['POST']) def submit_homework(): # 提交作业请求 data = request.get_json() student_id = int(data['student_id']) # 转换为整数 title = str(data['title']).strip() # 去除空格和转义特殊字符 content = str(data['content']).strip() # 去除空格和转义特殊字符 cursor.execute(''' INSERT INTO homeworks (student_id, title, content) VALUES (?, ?, ?) ''', (student_id, title, content)) conn.commit() return jsonify({'message': 'Homework submitted successfully!'}) @app.route('/get_homework', methods=['GET']) def get_homework(): # 获取学生的作业 student_id = request.args.get('student_id') cursor.execute('SELECT * FROM homeworks WHERE student_id=?', (student_id,)) homeworks = cursor.fetchall() return jsonify([{'id': hw[0], 'title': hw[2]} for hw in homeworks]) if __name__ == '__main__': app.run(debug=True)
**总结**
在这个题目中,我们发现了一个SQL注入漏洞和一个CSRF漏洞。通过修复这些漏洞,我们可以使得系统更加安全和稳定。