0xl4ughCTF và mình đã quá chủ quan.
Mình cứ nghĩ giải này nó kiểu dễ dễ nhưng nó bruh thật đấy :V Member team mình nghỉ Tết hết roài nên chơi một mình thoai :<
Web1: Micro
Bài này mình được cho source, xem qua cấu trúc thư mục trước đã
index.php
<?php
error_reporting(0);
function Check_Admin($input)
{
$input=iconv('UTF-8', 'US-ASCII//TRANSLIT', $input); // Just to Normalize the string to UTF-8
if(preg_match("/admin/i",$input))
{
return true;
}
else
{
return false;
}
}
function send_to_api($data)
{
$api_url = 'http://127.0.0.1:5000/login';
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $data,
],
];
var_dump($options);
$context = stream_context_create($options);
$result = file_get_contents($api_url, false, $context);
var_dump(file_get_contents($api_url, false, $context));
if ($result !== false)
{
echo "Response from Flask app: $result";
}
else
{
echo "Failed to communicate with Flask app.";
}
}
if(isset($_POST['login-submit']))
{
if(!empty($_POST['username'])&&!empty($_POST['password']))
{
$username=$_POST['username'];
$password=md5($_POST['password']);
echo $username;
if(Check_Admin($username) && $_SERVER["REMOTE_ADDR"]!==127.0.0.1)
{
die("Admin Login allowed from localhost only : )");
}
else
{
var_dump(file_get_contents("php://input"));
send_to_api(file_get_contents("php://input"));
}
}
else
{
echo "<script>alert('Please Fill All Fields')</script>";
}
}
?>
app.py
from flask import Flask, request
import mysql.connector, hashlib
app = Flask(__name__)
# MySQL connection configuration
mysql_host = "localhost"
mysql_user = "root"
mysql_password = "root"
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()
print(f"[username]:{username}")
query = "SELECT * FROM users WHERE username = %s AND password = %s"
cursor.execute(query,(username,password))
# query log
print(f"[query]:{cursor.statement}")
result = cursor.fetchone()
print(f"[result]:{result}")
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')
print(username)
password = hashlib.md5(request.form.get('password').encode()).hexdigest()
# Authenticate user
user_data = authenticate_user(username, password)
if user_data:
return "0xL4ugh{Test_Flag}"
else:
return "Invalid credentials"
except:
return "internal error happened"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
Mình đã có đặt khá nhiều breakpoint nhưng ngại sửa nên mong mn thông cảm V:
Cơ bản ở đây chúng ta chỉ cần bypass username làm sao cho nó vượt qua hàm check mà mysql vẫn hiểu rằng là admin.
Payload của mình sẽ như sau.
Nhận xét
Đăng nhận xét