어느순간 홈페이지를 보면 이상한 문자들이 잔뜩 보여지며 홈페이지가 정상 동작을 하지 않음을 발견하게 됩니다.
DB에서 쿼리를 날려보면 이런 문자열이 잔뜩 들어가있습니다.
SQL Injection공격에 당한 상황입니다.
SQL Injection에 당하는 이유는 주로 웹프로그램 개발을 안일한 생각으로 동적쿼리를 사용하여 개발하였기 때문입니다.
동적쿼리라 함은 쿼리를 날릴때 스토어드 프로시저나 정적쿼리(Parameter)가 아닌 문자열을 연결하여 쿼리를 완성하는 쉽지만 위험한 개발 방식으로 다음과 같습니다.
strSqr = "select * from member_tbl where userid = '" & testid & "'"
SQL Injection 해킹(사실 해킹 수준급도 아님)을 받게 되면 첫째로 복구할 데이터를 확인해야 합니다.
그러기 위해선 어떤 테이블이 해킹 당했는지 알아내야 하므로 이때 사용되는 쿼리입니다.
단순 확인과 함께 임시 테이블에 넣어 보다 편리하게 확인이 가능합니다.
먼저 테이블부터 생성합니다.
CREATE TABLE [dbo].[totallog_table](
[db_name] [varchar](50) NOT NULL,
[table_name] [varchar](1000) NOT NULL,
[field_name] [varchar](1000) NOT NULL,
[log_data] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
그럼 아래와 같은 테이블이 생성됩니다.
log_data만 널 허용필드입니다.
다음은 해킹된 테이블을 찾는 스크립트입니다.
sysobject와 syscolumns테이블을 이용해 해당 데이터베이스에 존재하는 모든 필드들을 검사하는 스크릅트입니다.
dbname만 자신이 사용중인 db의 이름으로 바꿔주면 됩니다.
DECLARE @TABLENAME varchar(255), @COLUMNNAME 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 @TABLENAME, @COLUMNNAME;
WHILE (@@FETCH_STATUS = 0) BEGIN
print 'insert into dbo.INJECTIONLOG_TABLE (db_name, table_name, column_name, log_data) values (''dbname'', ''dbname.'+ @TABLENAME +''', '''+ @COLUMNNAME +''', (select top 1 ['+@COLUMNNAME+'] from '+'dbname.dbo.'+@TABLENAME+' where ['+@COLUMNNAME+'] like ''%<div style="display"%''))'
FETCH NEXT FROM Table_Cursor INTO @TABLENAME, @COLUMNNAME;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
'SoSo한 생각' 카테고리의 다른 글
직장인 건강검진 인터넷 조회 (0) | 2015.10.26 |
---|---|
COC(크래시오브클랜) : 불량 유저 신고하는 방법 (0) | 2015.10.25 |
나만의 이미지로 만드는 롯데체크카드 : 스타일 롯데카드는 연회비, SMS무료 (0) | 2015.10.14 |
코리아 블랙프라이데이 : Black Friday (0) | 2015.10.09 |
얼척 없는 헬로모바일 (0) | 2014.12.08 |