C#/VB.NET での T-SQL CAST のデコード
質問
最近、私たちのサイトは、 Asprox ボットネット SQLインジェクション 攻撃。詳細には触れませんが、この攻撃は、 T-SQL ASCII エンコードされた BINARY 文字列のコマンド。次のようになります。
DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);--
これを SQL でデコードすることはできましたが、当時は何が起こっているのか正確にわかっていなかったので、これを行うのには少し慎重でした。
このタイプのテキストを触らずにデコードできるように、簡単なデコード ツールを作成してみました。 SQLサーバー. 。デコードする必要がある主な部分は次のとおりです。
CAST(0x44004500...06F007200 AS
NVARCHAR(4000))
次のコマンドをすべて試しましたが、うまくいきませんでした。
txtDecodedText.Text =
System.Web.HttpUtility.UrlDecode(txtURLText.Text);
txtDecodedText.Text =
Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(txtURLText.Text));
txtDecodedText.Text =
Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(txtURLText.Text));
txtDecodedText.Text =
Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(txtURLText.Text));
txtDecodedText.Text =
Encoding.Unicode.GetString(Convert.FromBase64String(txtURLText.Text));
SQL Server を使用せずにこのエンコーディングを変換する適切な方法は何ですか?出来ますか?私もよく知っているので、VB.NET コードを取り上げます。
さて、ここで何かが足りないと思いますが、ここが私がいる場所です。
私の入力は基本的な文字列であるため、エンコードされた部分の一部 (4445434C41 (DECLA に変換される)) から開始し、最初の試みはこれを行うことでした...
txtDecodedText.Text = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(txtURL.Text));
...そして、各文字をバイトに変換したため、入力したものとまったく同じものを返すだけでした。
それを行うメソッドをまだ知らないため、2 文字ごとに手動でバイトに解析する必要があることに気付きました。そのため、私の小さなデコーダは次のようになります。
while (!boolIsDone)
{
bytURLChar = byte.Parse(txtURLText.Text.Substring(intParseIndex, 2));
bytURL[intURLIndex] = bytURLChar;
intParseIndex += 2;
intURLIndex++;
if (txtURLText.Text.Length - intParseIndex < 2)
{
boolIsDone = true;
}
}
txtDecodedText.Text = Encoding.UTF8.GetString(bytURL);
最初の 2 組のペアでは順調に見えますが、「4C」ペアに達するとループが失敗し、文字列の形式が間違っていると表示されます。
興味深いことに、デバッガを実行して、その時点まで解析できたバイト配列の GetString メソッドに進むと、結果として「,-+」が返されます。
何が足りないのかをどうやって見つければよいでしょうか。各バイトを解析するのではなく、「直接キャスト」する必要があるのでしょうか?
解決
私は Michael の投稿に戻り、さらに調べてみて、二重変換を行う必要があることに気づき、最終的に次の小さな要点を解決しました。
Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber)));
そこから、すべての文字を 2 つずつ処理し、それらを「16 進化」して文字列に変換するループを作成しました。
ニックや他の興味のある人には、私は先に進みました。 私の小さな申請書を投稿しました で コードプレックス. 。必要に応じて自由に使用/変更してください。
他のヒント
を削除してみてください 0x
まず電話してから Encoding.UTF8.GetString
. 。それはうまくいくかもしれないと思います。
基本的に:0x44004500
0x を削除すると、常に 2 バイトが 1 文字になります。
44 00 = D
45 00 = E
6F 00 = o
72 00 = r
したがって、これは間違いなく 2 バイト/文字の Unicode/UTF 形式です。