68

最近、私たちのサイトはAsproxボットネット SQLインジェクション攻撃の復活で大騒ぎになりました。詳細に立ち入ることなく、攻撃はT-SQLコマンドをASCIIエンコードされたBINARY文字列にエンコードすることによってSQLコードを実行しようとします。これは次のようになります。

DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);--

これをSQLでデコードすることはできましたが、その時点で何が起こっているのか正確にわからなかったため、これを行うことには少し警戒していました。

簡単なデコードツールを作成しようとしたので、 SQLServerに触れることなくこのタイプのテキストをデコードできました。デコードする必要がある主な部分は次のとおりです。

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文字ごとに手動で1バイトに解析する必要があることに気付きました。そのため、私の小さなデコーダーは次のようになります。

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);

最初の数ペアは問題ないように見えますが、「4C」ペアに到達するとループが停止し、文字列の形式が正しくないと表示されます。

興味深いことに、デバッガーをステップ実行して、その時点まで解析できたバイト配列のGetStringメソッドに移動すると、結果として「、-+」が返されます。

何が欠けているのかを理解するにはどうすればよいですか?バイトを解析するのではなく、バイトごとに「直接キャスト」を実行する必要がありますか?

4

2 に答える 2

24

私はマイケルのポストに戻り、もう少し突っついたところ、二重変換を行う必要があることに気づき、最終的にこの小さなナゲットを作成しました。

Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber)));

そこから、ループを作成してすべての文字を2 x 2で調べ、それらを「16進」してから文字列に変換します。

Nickや他の興味のある人には、先に進んで小さなアプリケーションCodePlexに投稿しました。必要に応じて自由に使用/変更してください。

于 2008-08-05T17:02:30.870 に答える
8

最初に削除して0xから、を呼び出してみてくださいEncoding.UTF8.GetString。私はそれがうまくいくかもしれないと思います。

基本的に:0x44004500

0xを削除すると、常に2バイトが1文字になります。

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

したがって、これは間違いなく2バイト/文字のUnicode/UTF形式です。

于 2008-08-02T01:38:14.077 に答える