最近,我们的网站被Asprox botnet SQL injection攻击的死灰复燃淹没.在没有详细说明的情况下,该攻击试图通过将T-SQL条命令编码为ASCII编码的二进制字符串来执行SQL代码.它看起来像这样:

DECLARE%20@S%20NVARCHAR(4000);SET%20@S=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 to be decoded is:

CAST(0x44004500...06F007200 AS
NVARCHAR(4000))

我try 了以下所有命令,但没有成功:

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)——第一次try 就是这样做...

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方法时,我得到了",-+"作为结果.

我该如何找出我遗漏了什么?我是否需要对每个字节进行"直接转换",而不是试图解析它?

推荐答案

我回到迈克尔的帖子,做了一些进一步的探索,意识到我确实需要进行双重转换,最终找到了这个小金块:

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

从那里,我简单地做了一个循环,以2乘2遍历所有字符,并将它们"hexified",然后翻译成字符串.

对尼克和其他感兴趣的人来说,我在CodePlex中获得了posted my little application分.可以根据需要随意使用/修改.

Sql相关问答推荐

重复ID消除跨越两列

PostgreSQL集群不间断的数据系列

如何转换和汇总行数

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

我希望以正确的升序获取SQL结果.怎样才能得到它们?

每年独特口味的冰淇淋数量

如何隐藏聚合JSON数组元素的键

找到最新的连线

为什么我的SQL标量函数有时会抛出";子查询返回多个值.这是不允许的.

仅在日期相隔时递增(Oracle SQL)

SQL:查询作为子查询或CTE写入的最大和数失败

如何将不同层次的产品组和规格组合到最深一层?

不存在记录的国外关键点

聚合内部的条件在哪里?

计算不同模式的时间跨度

如何从postgresql中的项目映射(关联数组)设置值?

SQL Server - 复杂场景 - 比较状态并填充值到后续行

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

在 SQL 中使用循环遍历按时间顺序排列的数据

在给定列中具有特定值的行与 SQL 中的总行数的比率