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

标签 c# sql vb.net ascii hex

最近我们的网站被 Asprox botnet 的卷土重来所淹没SQL injection攻击。无需详细说明,攻击会尝试通过对 T-SQL 进行编码来执行 SQL 代码。 ASCII 编码的二进制字符串中的命令。它看起来像这样:

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

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

最佳答案

我回到 Michael 的帖子,做了更多的探索,意识到我确实需要进行双重转换,并最终得出了这个小金 block :

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

从那里我简单地做了一个循环,以 2 乘 2 遍历所有字符并将它们“hexified”,然后转换为字符串。

对于 Nick 和任何其他感兴趣的人,我继续并 posted my little applicationCodePlex .根据需要随意使用/修改。

关于c# - 在 C#/VB.NET 中解码 T-SQL CAST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/109/

相关文章:

c# - 使用C#更新SQL中的数据时发生 fatal error

SQL Server : copy a table into another table in reverse order

c# - 如何打开 RadWindow

c# - 提示用户下载文本文件 - API Controller C#

mysql - 获取日期或 NOW() Sql 并转换为 int...然后执行 where

sql - Postgres : UPDATE multiple rows WHERE columnName has int in given range

mysql - 使用单选按钮搜索整数值

vb.net - 已定义变量上令人困惑的 System.NullReferenceException 错误 - VB

c# - 在 .NET TextBox 上设置光标的当前行

c# - Epplus 获取正确的单元格背景 rgb 颜色