mssql 전체 테이블 문자 검색 변경angel830514 2008.06.03 13:48 |
답변 2 조회 517 |
---|
MSSQL에 웹해킹으로 DB안에 특정 사이트로 이동하는 자바스크립트 문을 넣어놨는대요.
예를 들어 게시판이라면 제목과 본문뒤에 <script ....> 와 같은 글을 적어놨습니다.
문제는 회원 아이디부분에도 들어가 스크립트만 싹 지워야하는대
전체 테이블에서 해당 문자 검색해서 해당 문자만 변경하게 할려면 어떻게 해야하나요?
테이블 수가 많아 하나하나 노가다 하기는 너무 많습니다.
방법즘 알려주세요.
질문자인사 알려주신 내용을 기반으로 보강해서 수정했습니다. 감사합니다.
검정된 쿼리입니다.
검색 쿼리와 추가된 <script 등을 제거해주는 쿼리입니다.
아래의 쿼리를 돌리기 전에 해당 DB로 가셨어 각 DB마다 확인을 하신 후 발견되시면 제거해주면
됩니다.
* Script 삽입 공격을 당했는지 확인하는 쿼리
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 ('select ['+@C+'] from ['+@T+'] where ['+@C+'] like ''%<script%</script>''');
-- print 'select ['+@C+'] from ['+@T+'] where ['+@C+'] like ''%<script%</script>'''
FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
* 위의 공격을 당했을 때 복원하는 쿼리 (100% 다 되는 것은 아님 - 별도 확인 필요)
* 해킹 시 길이가 긴 경우에는 짤리고 들어가는 현상이 발생함 - 이 경우에는 복원을
해도 원상복구가 안됨
* 백업 받은 것을 복원하는 수 밖에는 없음
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+'] = left(
convert(varchar(8000), ['+@C+']),
len(convert(varchar(8000), ['+@C+'])) - 6 -
patindex(''%tpircs<%'',
reverse(convert(varchar(8000), ['+@C+'])))
)
where ['+@C+'] like ''%<script%</script>'''
);
FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
꼭 복구하시기 바랍니다. 홧팅.
그 외 답변들 1
re: mssql 전체 테이블 문자 검색 변경warez104
답변채택률 89.2% 2008.06.03 14:19 |
|
---|
시스템 테이블인 sysobjects테이블과 syscolumns테이블을 이용해서
스크립트를 생성해서 EXEC명령으로 실행하는 방법이 있습니다.
대충 만들어보면...
DECLARE @SQL varchar(1000), @TableName varchar(128),
@ColumnName varchar(128), @SearchText varchar(1000)SET @SearchText = '<SCRIPT>
...
...
</SCRIPT>'DECLARE cur_COLUMNS CURSOR FOR
SELECT TableName = m.name, ColumnName = d.name
FROM sysobjects m, syscolumns d
WHERE m.xtype = 'U' AND m.id = d.idOPEN cur_COLUMNS
FETCH NEXT FROM cur_COLUMNS
INTO @TableName, @ColumnNameWHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'UPDATE ' + @TableName + ' SET ' + @ColumnName +
' = REPLACE(' + @ColumnName + ', ''' + @SearchText + ''', '''' )'
EXEC @SQL
FETCH NEXT FROM cur_COLUMNS
INTO @TableName, @ColumnName
ENDCLOSE cur_COLUMNS
DEALLOCATE cur_COLUMNS
이런 식으로 녹색 부분에 찾아서 없앨 텍스트를 적고,
SQL문자열을 만들어서 실행하는 방법이 있습니다.
출처 : 직접서술