문제

최근 우리 사이트는 아스프록스 봇넷 SQL 주입 공격.자세한 내용을 다루지 않고 공격은 다음을 인코딩하여 SQL 코드를 실행하려고 시도합니다. T-SQL ASCII로 인코딩된 BINARY 문자열의 명령입니다.다음과 같이 보입니다.

DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x44004500...06F007200%20AS%20NVARCHAR(4000));EXEC(@S);--

나는 이것을 SQL로 해독할 수 있었지만 당시 무슨 일이 일어나고 있는지 정확히 알지 못했기 때문에 이것을 하는 것이 조금 조심스러웠습니다.

이런 종류의 텍스트를 만지지 않고도 해독할 수 있도록 간단한 디코드 도구를 작성해 보았습니다. SQL 서버.디코딩해야 할 주요 부분은 다음과 같습니다.

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과 관심 있는 다른 사람들에게 나는 먼저 가서 내 작은 신청서를 게시했습니다 안으로 코드플렉스.필요에 따라 자유롭게 사용/수정하세요.

다른 팁

제거해 보세요 0x 먼저 그 다음에 전화해 Encoding.UTF8.GetString.제 생각엔 그게 효과가 있을 것 같아요.

기본적으로:0x44004500

0x를 제거하면 항상 2바이트가 1문자가 됩니다.

44 00 = D

45 00 = E

6F 00 = o

72 00 = r

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top