programing

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

nasanasas 2020. 12. 13. 09:43
반응형

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


최근 우리 사이트는 Asprox 봇넷 SQL 인젝션 공격 의 부활로 인해 피해를 입었습니다 . 자세한 내용을 다루지 않고 공격 은 ASCII로 인코딩 된 BINARY 문자열로 T-SQL 명령 을 인코딩하여 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 메서드를 실행하면 결과로 ",-+"가 표시됩니다.

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


나는 Michael의 포스트로 돌아가서 좀 더 찌르고 이중 변환이 필요하다는 것을 깨달았고 결국이 작은 너겟을 해결했습니다.

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

거기에서 나는 2x2의 모든 문자를 통과하는 루프를 만들고 "16 진수"를 얻은 다음 문자열로 번역했습니다.

Nick과 다른 관심있는 사람에게 저는 CodePlex 에 제 작은 애플리케이션게시했습니다 . 필요에 따라 자유롭게 사용 / 수정하십시오.


0x첫 번째를 제거한 다음을 호출하십시오 Encoding.UTF8.GetString. 그게 효과가 있다고 생각합니다.

기본적으로 : 0x44004500

0x를 제거하고 항상 2 바이트는 한 문자입니다.

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

반응형