在C#/ VB.NET中解码T-SQL CAST

最近,随着 Asprox僵尸网络的复苏,我们的网站一片混乱。 SQL注入攻击。没有深入细节,攻击尝试通过编码 T-SQL 命令来执行SQL代码以ASCII编码的BINARY字符串。它看起来像这样:

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

我能够在SQL中对此进行解码,但由于我当时不知道到底发生了什么,所以我对此有点谨慎。

I tried to write a simple decode tool, so I could decode this type of text without even touching SQL Server. The main part I need decoded is:

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

...它所做的只是返回与我放入的完全相同的东西,因为它将每个字符转换为字节。

我意识到我需要手动将每两个字符解析为一个字节,因为我不知道任何方法,但现在我的小解码器看起来像这样:

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方法时,我能够解析到这一点,因此我得到了“, - +”。

我怎么知道我错过了什么 - 我是否需要为每个字节做一个“直接投射”而不是试图解析它?

0
额外 编辑
意见: 1
是的,如果你还没有,我肯定会开始使用SQL参数。
额外 作者 EndangeredMassa,
我尽了最大努力去尝试和排列一些'答案',但是其中大部分都不是答案。因此,将其他非答案转换为非答案评论是不可能的,因此这些转换为评论。如果我有任何不正确的地方,请告诉我。
额外 作者 Tim Post,

2 答案

Hazzah !!!!

我回到了迈克尔的职位,做了更多的戳动,并意识到我确实需要做一个双重转换,并最终找出了这个小块:

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

从那里我简单地做了一个循环遍历所有的字符2和2,让他们“hexified”,然后翻译成一个字符串。

对于尼克和其他任何感兴趣的人,我继续发布我的小应用程序CodePlex 。随时根据需要使用/修改。

0
额外

尝试先删除 0x ,然后调用 Encoding.UTF8.GetString 。我认为这可能有效。

基本上:0x44004500

删除0x,然后总是两个字节是一个字符:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

所以它绝对是一个具有两个字节/字符的Unicode / UTF格式。

0
额外