55


0

最近私達のサイトは Asprox botnet SQL injection攻撃の復活にあふれています。 詳細に説明することなく、攻撃は T-SQLコマンドをASCIIエンコードされたBINARY文字列でエンコードすることによって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));

…​and all it did was return the exact same thing that I put in since it 各文字を1バイトに変換します。

2文字ごとに手動で1バイトにパースする必要があることに気付きました。そのための方法がまだわかっていないので、小さなデコーダは次のようになります。

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);

最初の2組のペアには問題ないように見えますが、「4 C」ペアに到達するとループが無効になり、文字列の形式が正しくないと表示されます。

興味深いことに、それまで解析できたデバッガとバイト配列のGetStringメソッドを実行すると、結果として "、 - "が表示されます。

欠けているものをどのようにして見つけ出すのですか - それをパースするのではなく、バイトごとに "直接キャスト"をする必要がありますか?

2 Answer


21


私はマイケルのポストに戻り、もう少し突っ込んで、二重変換をする必要があることに気づき、そしてついにこの小さなナゲットを解決しました:

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

そこから私は単純に2×2の文字をすべて通過してそれらを "hexified"にしてから文字列に翻訳するためにループを作りました。

Nickに、そして他に興味を持っている人に、私は先に進み、http://en.wikipedia.org/wiki/CodePlex [CodePlex]で 私の小さなアプリケーションを投稿しました。 必要に応じて自由に使用/変更してください。


8


最初に 0x`を削除してから Encoding.UTF8.GetString`を呼び出してください。 私はそれがうまくいくと思います。

基本的に:0x44004500

0xを削除すると、常に2バイトが1文字になります。

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

したがって、これは間違いなく2バイト/文字のUnicode / UTF形式です。