当前位置:实例文章 » 其他实例» [文章][LitCTF 2023]作业管理系统

[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漏洞。通过修复这些漏洞,我们可以使得系统更加安全和稳定。

相关标签:管理系统
其他信息

其他资源

Top