最近我们的网站因Asprox僵尸网络 SQL注入攻击的复苏而黯然失色 。 攻击试图通过在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方法时,我能够解析到那一点,我得到“, - +”作为结果。
我如何弄清楚我错过了什么 - 我是否需要为每个字节进行“直接转换”而不是尝试解析它?