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
'programing' 카테고리의 다른 글
콘솔 응용 프로그램의 안정적인 타이머 (0) | 2023.05.29 |
---|---|
다른 리포지토리 내의 깃 리포지토리로 작업하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
새 프로젝트를 만들 때마다 이클립스가 앱compat v7 라이브러리 지원을 자동으로 추가하는 이유는 무엇입니까? (0) | 2023.05.29 |
Python/postgres/psycopg2: 방금 삽입된 행의 ID 가져오기 (0) | 2023.05.29 |
Express 기능에서 "res" 및 "req" 매개 변수는 무엇입니까? (0) | 2023.05.29 |