在C#/ VB.NET中解码T-SQL CAST
Asprox僵尸networking SQL注入攻击的复活,最近我们的网站已经泛滥成灾 。 没有深入细节,攻击尝试通过以ASCII编码的BINARYstring编码T-SQL命令来执行SQL代码。 它看起来像这样:
DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);--
我可以在SQL中解码这个,但是由于我当时不知道到底发生了什么,所以我有点小心这样做。
我试图写一个简单的解码工具,所以我可以解码这种types的文本,甚至没有接触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代码,因为我也熟悉。
好的,我确定我在这里错过了一些东西,所以我就在这里。
由于我的input是一个基本的string,我开始只是一个编码部分 – 4445434C41(这意味着DECLA)的片段 – 第一次尝试是这样做的…
txtDecodedText.Text = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(txtURL.Text));
…它所做的只是返回与我放入的完全相同的东西,因为它将每个字符转换为字节。
我意识到我需要手动将每个两个字符parsing为一个字节,因为我不知道任何方法,那么现在我的小解码器看起来像这样:
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”对的时候,环路就会变得平缓,并且说这个string的格式不正确。
有趣的是,当我通过debugging器和字节数组上的GetString方法进行分析时,我得到了“, – +”的结果。
我怎么知道我错过了什么 – 我是否需要为每个字节做一个“直接投射”,而不是试图parsing它?
Hazzah !!!!
我回到了迈克尔的职位,做了更多的戳,并意识到我确实需要做一个双重转换,最终find了这个小块:
Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber)));
从那里我只是做了一个循环遍历所有字符2和2,让他们“己化”,然后翻译成一个string。
对Nick和其他任何感兴趣的人,我继续在CodePlex上 发布我的小应用程序 。 随意使用/修改您所需要的。
尝试先删除0x
,然后调用Encoding.UTF8.GetString
。 我认为这可能工作。
基本上:0x44004500
删除0x,然后总是两个字节是一个字符:
44 00 = D 45 00 = E 6F 00 = o 72 00 = r
所以这绝对是一个具有两个字节/字符的Unicode / UTF格式。