云曦第二次考核复现

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参数污染

这里先放图

up0suavanp

这里就可以这么理解
我传入两个参数到php/Apache服务器里
比如?par=1&par=2

他最后接受的参数是2

但是最后返回flag的代码又是flask的框架

而对于Flask他接受的是第一个参数

所以这里我们可以绕过之后让flask接受第一个参数

username=admin&username=1&password=admin&login-submit=

直接传参

图片

posted @ 2025-10-14 23:07  crook666  阅读(6)  评论(0)    收藏  举报