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

问题描述 投票:56回答:2

最近我们的网站已被淹没与Asprox botnet SQL injection攻击死灰复燃。如果没有进入细节,攻击试图通过以ASCII编码的二进制字符串编码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方法步骤,我得到“ - +”作为结果。

我如何找出我错过了什么 - 做我需要做一个“直接铸造的”为每个字节,而不是试图解析它?

c# sql vb.net ascii hex
2个回答
22
投票

我又回到了迈克尔的职位,做了一些更多的戳,并意识到,我也要做一个双转换,并最终制定了这个小金块:

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

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

尼克,和任何人有兴趣,我继续在posted my little application CodePlex过来。随意使用/修改,因为你需要。


7
投票

尝试首先去除0x,然后调用Encoding.UTF8.GetString。我认为这可能工作。

本质:0x44004500

取出0X,然后总是两个字节是一个字:

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

所以,这绝对是有两个字节/字符为Unicode / UTF格式。

© www.soinside.com 2019 - 2024. All rights reserved.