5465 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / app.py PY
from flask import Flask, request, jsonify
import pymysql

app = Flask(__name__)

# Class CustomKey simulates the backend casting of JSON keys into Objects
class CustomKey:
    def __init__(self, key_str):
        self.key_str = key_str
        
    def __str__(self):
        # VULNERABILITY HERE: returns the raw string; PyMySQL 1.1.0 will not escape it
        return self.key_str
    def __repr__(self):
        return self.key_str

def get_db():
    return pymysql.connect(
        host='db',
        user='root',
        password='rootpassword',
        database='iot_logs',
        cursorclass=pymysql.cursors.DictCursor
    )

@app.route('/search', methods=['POST'])
def search_log():
    try:
        data = request.json
        
        # Convert JSON input and cast all keys into CustomKey objects
        # This models common serialize/deserialize patterns in complex apps
        query_params = {}
        if isinstance(data, dict):
            for k, v in data.items():
                query_params[CustomKey(k)] = v
        
        conn = get_db()
        with conn.cursor() as cur:
            # Buggy query: query_params is a dict containing object keys
            sql = "SELECT * FROM logs WHERE device_signature = %s"
            cur.execute(sql, (query_params,))
            result = cur.fetchall()
            
        return jsonify({"status": "success", "data": result})
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9669)