programing

C#/VB.NET에서 T-SQL CAST 디코딩

oldcodes 2023. 5. 29. 11:09
반응형

C#/VB.NET에서 T-SQL CAST 디코딩

최근 우리 사이트는 Asprox 봇넷 SQL 주입 공격의 부활로 넘쳐나고 있습니다.이 공격은 자세히 설명하지 않고 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));

...그리고 그것은 각각의 문자를 바이트로 변환한 이후로 내가 입력한 것과 정확히 같은 것을 반환했습니다.

아직 그렇게 할 수 있는 방법을 모르기 때문에 두 문자를 하나의 바이트로 수동으로 구문 분석해야 한다는 것을 깨달았습니다. 그래서 이제 제 작은 디코더는 다음과 같습니다.

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 메서드를 단계적으로 실행하면 결과적으로 ",-+"가 표시됩니다.

누락된 내용을 파악하려면 어떻게 해야 합니까? 각 바이트에 대해 구문 분석을 시도하는 대신 "직접 캐스트"를 수행해야 합니까?

저는 마이클의 게시물로 돌아가서 좀 더 캐물었고, 이중 변환을 해야 한다는 것을 깨달았고, 결국 이 작은 덩어리를 해결했습니다.

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

거기서 저는 모든 문자를 2개씩 차례로 반복해서 "헥시파이드"한 다음 문자열로 변환하기만 하면 됩니다.

닉과 다른 관심있는 사람들에게 는 제 작은 애플리케이션을 코드플렉스올렸습니다.필요에 따라 자유롭게 사용/수정할 수 있습니다.

제해보오시십을 제거해 .0x먼저 부른 다음에Encoding.UTF8.GetString그게 효과가 있을 것 같아요.

기본: 0x44004500

0x를 제거한 다음 항상 두 바이트는 한 문자입니다.

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

따라서 문자당 2바이트의 유니코드/UTF 형식입니다.

언급URL : https://stackoverflow.com/questions/109/decoding-t-sql-cast-in-c-vb-net

반응형