云曦第二次考核復現
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=
直接傳參


浙公網安備 33010602011771號