最近,我们的网站被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方法时,我得到了",-+"作为结果.
我该如何找出我遗漏了什么?我是否需要对每个字节进行"直接转换",而不是试图解析它?