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

riure 发布于 2018-02-02 ascii 最后更新 2018-02-02 15:40 610 浏览

最近我们的网站已经被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方法进行分析时,我得到了“, - +”的结果。 我怎么知道我错过了什么 - 我是否需要为每个字节做一个“直接投射”,而不是试图解析它?
已邀请:

mid

赞同来自:

先尝试移除0x,然后调用Encoding.UTF8.GetString。我认为这可能工作。 基本上:0x44004500 删除0x,然后总是两个字节是一个字符:

44 00 = D
45 00 = E
6F 00 = o
72 00 = r
所以这绝对是一个具有两个字节/字符的Unicode/UTF格式。

riure

赞同来自:

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

Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber)));
从那里我只是做了一个循环遍历所有字符2和2,让他们“己化”,然后翻译成一个字符串。 对于Nick以及其他任何感兴趣的人,我继续在CodePlexposted my little application。随意使用/修改您所需要的。