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

Translate

最近,我们的网站被重新兴起的网站所困扰Asprox僵尸网络 SQL注入攻击。无需详细说明,攻击尝试通过对T-SQLASCII编码的BINARY字符串中的命令。看起来像这样:

DECLARE%[email protected]%20NVARCHAR(4000);SET%[email protected]=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));

...它所做的只是返回我输入的完全一样的东西,因为它将每个字符转换成一个字节。

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

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方法时,得到的结果是“,-+”。

我如何找出丢失的内容-是否需要对每个字节进行“直接转换”而不是尝试解析它?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

我回到了Michael的职位,做了一些戳戳,意识到我确实需要进行两次转换,最终算出了这个小块:

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

从那里,我简单地进行了一个循环,以2到2的方式遍历所有字符,并将它们“十六进制化”,然后转换为字符串。

对于尼克和其他感兴趣的人,我继续发布了我的小申请超过CodePlex。随时根据需要使用/修改。

来源
Translate

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

本质上:0x44004500

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

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

因此,它绝对是具有两个字节/字符的Unicode / UTF格式。

来源
下一个问题:
sql -ASP.NET站点地图