云曦第二次考核复现
WEB
EzGetFlag
打开是这样一个界面
这里去看下源代码
点击查看代码
from flask import Flask, request
import mysql.connector, hashlib
app = Flask(__name__)
# MySQL connection configuration
mysql_host = "127.0.0.1"
mysql_user = "ctf"
mysql_password = "ctf123"
mysql_db = "CTF"
def authenticate_user(username, password):
try:
conn = mysql.connector.connect(
host=mysql_host,
user=mysql_user,
password=mysql_password,
database=mysql_db
)
cursor = conn.cursor()
query = "SELECT * FROM users WHERE username = %s AND password = %s"
cursor.execute(query, (username, password))
result = cursor.fetchone()
cursor.close()
conn.close()
return result
except mysql.connector.Error as error:
print("Error while connecting to MySQL", error)
return None
@app.route('/login', methods=['POST'])
def handle_request():
try:
username = request.form.get('username')
password = hashlib.md5(request.form.get('password').encode()).hexdigest()
# Authenticate user
user_data = authenticate_user(username, password)
if user_data:
with open('/flag', 'r') as f:
flag = f.read().strip()
return flag
else:
return "Invalid credentials"
except:
return "internal error happened"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
这里可以看见就是只要我们使用admin这个账户登录进去就可以得到flag
然后还有一个db文件
这里可以看见他插入了admin这个用户
后面按那一串是密码
但是这个是经过加密的
这个在另一个文件里
这个是被经过md5加密的当时随手一猜就是admin
这里可以记一下21232f这个md5加密可以说是admin的特征
但是我们登录的时候就可以发现
这里只能使用本地来登录,但是这里使用XFF这些没有用
去看逻辑
这里是php代码的逻辑
这里我们要了解一个都行叫做php参数污染
其实就是HTTP参数污染
这里先放图
这里就可以这么理解
我传入两个参数到php/Apache服务器里
比如?par=1&par=2
他最后接受的参数是2
但是最后返回flag的代码又是flask的框架
而对于Flask他接受的是第一个参数
所以这里我们可以绕过之后让flask接受第一个参数
username=admin&username=1&password=admin&login-submit=
直接传参