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

时间:2008-08-01 15:23:05

标签: c# sql vb.net ascii hex

最近,我们的网站因Asprox botnet SQL injection攻击重新抬头而淹没。攻击试图通过在ASCII编码的BINARY字符串中编码T-SQL命令来执行SQL代码,而无需详细说明。它看起来像这样:

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

我能够在SQL中对此进行解码,但由于我当时并不确切知道发生了什么,所以我有点担心这样做。

我尝试编写一个简单的解码工具,因此我可以在不触及SQL  Server的情况下解码此类文本。我需要解码的主要部分是:

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方法时,我能够解析到那一点,我得到“, - +”作为结果。

如何弄清楚我缺少的是什么?我是否需要为每个字节执行“直接转换”而不是尝试解析它?

2 个答案:

答案 0 :(得分:21)

我回到迈克尔的帖子,做了一些更多的戳,并意识到我确实需要进行双重转换,并最终解决了这个小金块:

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

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

对Nick和其他感兴趣的人,我继续posted my little applicationCodePlex。随意使用/修改。

答案 1 :(得分:7)

首先尝试删除0x,然后致电Encoding.UTF8.GetString。我认为这可行。

基本上:0x44004500

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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