本当はこわいMySQLプロトコル

Club MySQL #2

2017/11/28

とみたまさひろ

MySQLのXじゃない方のプロトコル

接続

sequenceDiagram
    Client -->> Server: Connection
    Server ->> Client: Initial
    Client ->> Server: Authentication
    Server ->> Client: OK

クエリ(参照系)

sequenceDiagram
    Client ->> Server: Query
    Server ->> Client: Field Count
    loop field count
        Server ->> Client: Field Info
    end
    loop record count
        Server ->> Client: Record Data
    end
    Server ->> Client: EOF

クエリ(更新系)

sequenceDiagram
    Client ->> Server: Query
    Server ->> Client: Status

クエリをパースするのはサーバー

クライアントはクエリが参照か更新かは知らない

サーバーから教えてもらう

特殊なクエリ

LOAD DATA LOCAL INFILE

LOAD DATA LOCAL INFILE 'filename' INTO TABLE tblname;

クライアントのファイルをテーブルにロード

クエリをパースするのはサーバー
(2回目)

サーバーからファイル名を教えてもらう

LOAD DATA LOCAL INFILE

sequenceDiagram
    Client ->> Server: Query
    Server ->> Client: Filename
    Client ->> Server: Contents
    Client ->> Server: EOF
    Server ->> Client: Status

クライアントの指定とは異なるファイル名が
サーバーから返されてもそれを送る

デモ: Proxy でファイル名を差し替える

sequenceDiagram
    Client ->> Proxy: Query
    Proxy ->> Server: Query
    Server ->> Proxy: Filename(hoge)
    Proxy ->> Client: Filename(fuga)
    Client ->> Proxy: Contents
    Proxy ->> Server: Contents
    Client ->> Proxy: EOF
    Proxy ->> Server: EOF
    Server ->> Proxy: Status
    Proxy ->> Client: Status

こわい!

クエリをパースするのはサーバー
(3回目)

デモ: Proxy でLOAD DATA の振りをする

sequenceDiagram
    Client ->> Proxy: Query
    Proxy ->> Server: Query
    Server ->> Proxy: Status
    Proxy ->> Client: Filename
    Client ->> Proxy: Contents
    Client ->> Proxy: EOF
    Proxy ->> Client: Status

こわい!

対策

  • 信頼できないサーバーに繋がない

  • SSL接続

  • クライアント側で LOCAL INFILE を無効化

    % mysql --local-infile=false
    

おわり