最近、私たちのサイトはAsproxボットネット SQLインジェクション攻撃の復活で大騒ぎになりました。詳細に立ち入ることなく、攻撃はT-SQLコマンドをASCIIエンコードされたBINARY文字列にエンコードすることによってSQLコードを実行しようとします。これは次のようになります。
DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);--
これをSQLでデコードすることはできましたが、その時点で何が起こっているのか正確にわからなかったため、これを行うことには少し警戒していました。
簡単なデコードツールを作成しようとしたので、 SQLServerに触れることなくこのタイプのテキストをデコードできました。デコードする必要がある主な部分は次のとおりです。
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));
...そして、各文字をバイトに変換したので、私が入力したものとまったく同じものを返すだけでした。
まだそれを行うメソッドがわからないため、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);
最初の数ペアは問題ないように見えますが、「4C」ペアに到達するとループが停止し、文字列の形式が正しくないと表示されます。
興味深いことに、デバッガーをステップ実行して、その時点まで解析できたバイト配列のGetStringメソッドに移動すると、結果として「、-+」が返されます。
何が欠けているのかを理解するにはどうすればよいですか?バイトを解析するのではなく、バイトごとに「直接キャスト」を実行する必要がありますか?