【覚書】ロリポップ付属のphpmyadminにsshから接続するため悪魔の力を手に入れた話
スポンサードリンク
こんにちは。ふぁんたです。
前回の記事で、このWebページが有るサーバー「ロリポップ」付属のデータベースに無理やりつなげようとして全滅した、という話をしました。
今回は、悪魔に魂を売り、データベース接続に成功しましたので、そのやり方を書こうと思います。
Contents
前回もやったSSHポートフォワーディング
1.SSH接続する
2.MySQLでログインする
3.すっごーい!
という方法は、前回試しましたが、だめでした。
MySQL接続をするためのstring _conというコネクション情報を色々に弄り倒してみたんですけど、びくともしませんでした。
手入力で成功
しかしながら、手入力すると成功してしまいました。解せぬ。
まず、コマンドプロンプトで
ssh ユーザー名@サーバーのホスト -p 2222
とすると、パスワードを聞かれるので、入れます。
そしたら、mysqlのCUIが出てくるので、
mysql -u データベースにおけるユーザー名 -h データベースがあるサーバー -p
とすると、パスワードを聞かれるので、今度はデータベースのパスワードを入れます。
なんと、接続できてしまいます。(ポートフォワーディングとは違うのかも?)
で、どのデータベースを使いたいかを指定するために、
use データベースの名前
;
すると、SQL文でテーブルが操作できるようになります。
手作業の勝利。 プログラムの敗北。
そして知る絶望
モロ書いてあったわ…。https://t.co/iPVjSN5Lgv
>スタンダードプラン以上であればSSHを利用可能ですが、ポートフォワードによるデータベースへの接続は許可されていません。
— うどん提督 (@_udon) July 21, 2019
できないんだそうです。なんてこった…
悪魔との契約
手入力では、できた。
プログラムでは、できなかった。
…「コマンドプロンプトにコマンドを入力するプログラム」にしてしまえばいいんじゃないか…?
闇営業簡易版
C#のコードで、キーボードを叩くことを考えました。
これができれば、手入力と変わりない。
VBA(Excelのマクロとかのやつ)のdllを参照から読み込んで、キーボードを操作できるようにします。
それによって使える、SendKeysステートメント、というのがあります。
これは、引数にとったstringをキーボードで打ち込んだのと同じとみなせるような、そんな効果があります。
…それでも、パスワードを求められたときの入力ではうまくいきませんでした。
Sendkeysの力では、乗り越えられない困難があるようです。
闇営業複雑版
もっと難しいのがありました。
keybd_eventというものです。
(キーをどのタイミングで押して、どのタイミングで離すか、というレベルまで指定することができる代わりに、めっちゃくちゃ操作が難解なやつです。)
これに手を出すことにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
class KeyBoardHandle { [DllImport("user32.dll", SetLastError = true)] static extern void keybd_event(byte bVK, byte bScan, byte dwFlags, int dsExtraiInfo); public byte KeyDown = 0x0; public byte KeyUp = 0x2; public byte keyextend = 0x1; public byte VK_LEFT = 0x25; public byte VK_UP = 0x26; public byte VK_RIGHT = 0x27; public byte VK_DOWN = 0x28; public byte VK_0 = 0x30; public byte VK_1 = 0x31; public byte VK_2 = 0x32; public byte VK_3 = 0x33; public byte VK_4 = 0x34; public byte VK_5 = 0x35; public byte VK_6 = 0x36; public byte VK_7 = 0x37; public byte VK_8 = 0x38; public byte VK_9 = 0x39; public byte VK_A = 0x41; public byte VK_B = 0x42; public byte VK_C = 0x43; public byte VK_D = 0x44; public byte VK_E = 0x45; public byte VK_F = 0x46; public byte VK_G = 0x47; public byte VK_H = 0x48; public byte VK_I = 0x49; public byte VK_J = 0x4A; public byte VK_K = 0x4B; public byte VK_L = 0x4C; public byte VK_M = 0x4D; public byte VK_N = 0x4E; public byte VK_O = 0x4F; public byte VK_P = 0x50; public byte VK_Q = 0x51; public byte VK_R = 0x52; public byte VK_S = 0x53; public byte VK_T = 0x54; public byte VK_U = 0x55; public byte VK_V = 0x56; public byte VK_W = 0x57; public byte VK_X = 0x58; public byte VK_Y = 0x59; public byte VK_Z = 0x5A; public byte VK_CONTROL = 0x11; public byte VK_BACK = 0x8; public byte VK_TAB = 0x9; public byte VK_RETURN = 0xD; public byte VK_PRINT = 0x2C; public byte VK_Esc = 0x1B; public byte VK_COLON = 0xBA; public byte VK_MINUS = 0x6D; public byte VK_DOT = 0x6E; public byte VK_ATMARK = 0xC0; public byte VK_SHIFT = 0x10; public byte VK_SEMICOLON = 0xBB; public void input(string s) { for (int i = 0; i < s.Length; i++) { inputOneChar(s[i]); } push(VK_RETURN); } public void inputOneChar(char c) { string s = c.ToString(); if (char.IsNumber(c)) { push((byte)c); } else if (c >= 'A' && c <= 'Z') { pushcombi(VK_SHIFT, (byte)c); } else if (c >= 'a' && c <= 'z') { c = char.ToUpper(c); push((byte)c); } else if (c == ' ') { push((byte)32); ;//space } else if (c == '@') { push(VK_ATMARK) ;//atmark } else if (c == '-') { push(VK_MINUS); ;//minus } else if (c == ';') { push(VK_SEMICOLON); } else if (c == '.') { push(VK_DOT); } else if (c == '`') { pushcombi(VK_SHIFT, VK_ATMARK); } else if (c == '*') { pushcombi(VK_SHIFT, VK_COLON); } else { ; } } public void push(byte key) { keybd_event(key, 0, KeyDown, 0); keybd_event(key, 0, KeyUp, 0); Thread.Sleep(72); } public void pushcombi(byte meta, byte key) { keybd_event(meta, 0, (byte)(KeyDown | keyextend), 0); keybd_event(key, 0, (byte)(KeyDown | keyextend), 0); keybd_event(key, 0, (byte)(KeyUp | keyextend), 0); keybd_event(meta, 0, (byte)(KeyUp | keyextend), 0); Thread.Sleep(72); } } |
(必要に応じて、プロジェクトを右クリック→追加→参照、として、必要なdllを参照してください)
使い方としては、KeyboardHandleクラスのインスタンスを作って、(new)
そのインスタンスを keyboardとすると、keyboard.input()の引数に、入力したい文字列を入れておくと、文字列の各文字に対して、キーボードをバーチャルで叩いて72ミリ秒待つ、というような使い方を想定しています。
今回、このコードに実装されてるのは、MySQLのCRUDで使いそうな文字だけとなってますので、例えば { とか、<とかを入力されると動きません。
普通はできないはずのところを、キーボードをシミュレートする という邪道な方法で、どうにか接続、SELECT * FROM table;を実行することができました。
あとは、tableの属性を変更して、それに合うようなInsert文をキーボードで入力させ、必要に応じてメニューから貼り付け機能を使えば、
「今日買うべき銘柄を毎日自動更新して教えてくれる」
ぜかましプロジェクトの集大成が出来上がると思うんです。
苦節1年2ヶ月、到達すべき点が見えてきました。
ラストスパート、がんばります。
スポンサードリンク
ディスカッション
コメント一覧
まだ、コメントがありません