2008-08-01 54 views
44

最近我们的网站已经淹没了Asprox botnetSQL injection攻击的复苏。没有深入细节,攻击尝试通过以ASCII编码的BINARY字符串编码T-SQL命令来执行SQL代码。它看起来是这样的:在C#/ VB.NET中解码T-SQL CAST

DECLARE%[email protected]%20NVARCHAR(4000);SET%[email protected]=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方法进行分析时,我得到了“, - +”作为结果。

我该如何弄清楚我错过了什么 - 我是否需要为每个字节做一个“直接投射”而不是试图解析它?

+0

看到我的答案在这里:[http://stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422](http:// stackoverflow.com/questions/32412/whats-the-best-way-of-cleaning-up-after-a-sql-injection#32422) – SQLMenace 2008-09-10 18:07:10

回答

18

Hazzah !!!!

我又回到了迈克尔的职位,做了一些更多的戳,并意识到,我也要做一个双转换,并最终制定了这个小金块:

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

从那里,我只是做了一个循环,通过所有的字符2和2,让他们“己化”,然后翻译成一个字符串。

对于Nick以及其他任何感兴趣的人,我继续在CodePlex之前和posted my little application。随时根据需要使用/修改。

6

尝试先删除0x,然后致电Encoding.UTF8.GetString。我认为这可能有效。

本质:0x44004500

取出0X,然后总是两个字节是一个字:

44 00 = D 

45 00 = E 

6F 00 = o 

72 00 = r 

所以它肯定是有两个字节/字符为Unicode/UTF格式。