これは単に学習を目的としています。 「マジッククオート」が無効になっているMySQLサーバーのテーブルからすべてのユーザー名とパスワードを取得したいのですが。ユーザー名の入力で:私は次のようなものを置きます:
username'; SELECT * FROM users;
しかし、どうすれば注入クエリの入力を取得できますか?調べてみたところ、sp_makewebtask
Microsoft SQLサーバーでは、.htmlファイルを共有フォルダーに出力できます。 MySQLではどうすればよいですか?それとももっと良い方法がありますか?どうもありがとう。
あなたのアプローチの問題は、PHPがに行かないことです)(さて、以下のコメントで指摘されているように、可能ですが、そうではありません) 複数のクエリを同時に実行し、最初のクエリをセミコロンで閉じてから、SELECT
の先頭に新しいクエリを作成しようとします。それらをUNION
または_UNION ALL
_する必要があります。
_
username'; SELECT * FROM users;
_
次のようになります。
username='admin' UNION ALL SELECT CONCAT(username, 0x3A, password) AS details FROM users LIMIT 0,1;
MySQLのUNION構文については、このリンクを参照してください http://dev.mysql.com/doc/refman/5.0/en/union.html
SQLインジェクションには2つの主要なタイプがあり、それらはブラインドとエラーベースです。
ブラインドは、指定されたクエリから出力を取得しない場所です。テキストや画像の一部、またはページから欠落しているものに気付く場合があります。目的の結果を得るには、さまざまなオプションを列挙する必要があります。
エラーベースは、名前が示すように、スクリプトがエラーをスローする場所であり、必要な処理を正確に確認できます。インジェクションの結果は、ページのどこか、または少なくともページのソースコードに表示されます。
すべての場合において、MySQLの_INTO OUTFILE
_構文を使用して、クエリの結果をファイルに出力できるはずです。ただし、適切な権限がある場合に限ります。
http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
これは、MySQLインジェクションのほとんどの場合に当てはまりますが、SQLiには2種類以上ありますが、この会話では、これらが知っておく必要のある主要なものです。
これはSQLインジェクションに関する優れたチュートリアルです: http://www.exploit-db.com/papers/13045/
まあ SQLMap のようなツールがあります。残念ながら、私は彼らがデータをどのように取得しているかを正確に知るのに十分なほど賢くはありません。 SQLMapを使用すると、データベース名、テーブル名、テーブル列、テーブルデータなど、さまざまなものを出力できます。
ただし、非常に具体的なシナリオでデータを出力する方法の例を示すことができます。 SQLインジェクション攻撃のコンテキストについてはあまり話さないので、これが自分の状況に当てはまるかどうかはわかりません。
たとえば、次のような小さなテーブルを出力するWebページがあるとします。
Product Name | Price
----------------------
Door knobs | $5.00
Hammers | $10.00
Saws | $12.00
基になるクエリとプログラミングの設定に応じて、そのテーブルに表示される他のデータを返すことができます。以下のURLにsearch
クエリ文字列パラメーターが挿入可能であると判断したとします。
http://mysite.com/store.php?search=hardware
以下のようなクエリを作成できる場合(デモ目的で攻撃をプレーンテキストで残す):
http://mysite.com/store.php?search=blah';SELECT username, password FROM USERS where '1'='1
サイトは、返された2つの列を取得してテーブルに吐き出すようにプログラムされている場合があります。
繰り返しますが、これは非常に具体的な例です。 SQLMapメソッドは関係なく動作するようですので、誰かが何をしているのか知っている人がいるかどうか知りたいと思います。
通常、SQLからフェッチされた値がページに表示されますどこか。したがって、たとえば、クエリが名前(_Select name from users where id=%s
_)をフェッチしている場合は、1;select top 1 columnname from (your query here);--
のようなものを挿入します。データベースと実装によっては、単一のコマンドでテーブル全体をダンプする方法がある場合とない場合があります(そうでない場合は、常にテーブルの行を列挙できます)。
他の場合では、SQLエラーを表示するようにアプリを誘導できます。その場合、クエリ(1x1出力を返す)を列名として使用することができます(例:select (your query here) from somerandomtable;
)。通常、これはエラーを返します(列が存在しないため)。提案された列名が公開されます。
あなたはそれをどこかにドロップすることでそれを行うことができます:例えばSELECT ... INTO OUTFILE。 ( http://dev.mysql.com/doc/refman/5.0/en/select-into.html )
その後、ファイルを単一の文字列として返すload_file()を使用してフィールドを上書きし、アプリケーションによって読み取られ表示される単一の行に既知のフィールドを入力することができます。
(例: "UPDATEアカウントSET bio = load_file( '/ etc/passwd')WHERE UserName = 'prettypinkponi3s';"
そのステップをスキップして、元のインジェクションで直接更新を使用することもできます。そして、それはちょっと要点です。
ブラインドを注入する場合は、アプリケーションに入力検証がないfromデータベースをレンダリング言語に利用することができます。そして、抽出しようとしているデータを保持できるいくつかの値を見つける必要があります。 (プロフィール写真、経歴、説明フィールドなど)