Tn công SQL injection ấ

Một phần của tài liệu các phương thức tấn công & phòng thủ web server (Trang 37 - 55)

T NG QUA NV WEBSIE, CÁ CD C HV CA WEBSIE VÀ LI BO M HÔNG Ậ

2.3.1. Tn công SQL injection ấ

2.3.1.1. SQL Injection là gì?

- Khi tri n khai các ng d ng web trên Internet, nhi u ngể ứ ụ ề ườ ẫi v n nghĩ r ng vi cằ ệ đ m b o an toàn, b o m t nh m gi m thi u t i đa kh năng b t n công t các tinả ả ả ậ ằ ả ể ố ả ị ấ ừ t c ch đ n thu n t p trung vào các v n đ nh ch n h đi u hành, h qu n tr c sặ ỉ ơ ầ ậ ấ ề ư ọ ệ ề ệ ả ị ơ ở

d ng ch y trên đó cũng ti m n m t l h ng b o m t r t l n. M t trong s các lụ ạ ề ẩ ộ ỗ ổ ả ậ ấ ớ ộ ố ỗ h ng này đó là SQL injection. T i Vi t Nam, đã qua th i kì các qu n tr website l làổ ạ ệ ờ ả ị ơ vi c quét virus, c p nh t các b n vá l i t các ph n m m h th ng, nh ng vi cệ ậ ậ ả ỗ ừ ầ ề ệ ố ư ệ chăm sóc các l i c a các ng d ng l i r t ít đỗ ủ ứ ụ ạ ấ ược quan tâm. Đó là lí do t i sao trongạ th i gian v a qua, không ít website t i Vi t Nam b t n công và đa s đ u là l i SQLờ ừ ạ ệ ị ấ ố ề ỗ injection. V y SQL injection là gì ?ậ

- SQL injection là m t kĩ thu t cho phép nh ng k t n công l i d ng l h ng trongộ ậ ữ ẻ ấ ợ ụ ỗ ổ vi c ki m tra d li u nh p trong các ng d ng web và các thông báo l i c a h qu nệ ể ữ ệ ậ ứ ụ ỗ ủ ệ ả tr c s d li u đ "tiêm vào" (inject) và thi hành các câu l nh SQL b t h p phápị ơ ở ữ ệ ể ệ ấ ợ (không được người phát tri n ng d ng lể ứ ụ ường trước). H u qu c a nó r t tai h i vìậ ả ủ ấ ạ nó cho phép nh ng k t n công có th th c hi n các thao tác xóa, hi u ch nh, … doữ ẻ ấ ể ự ệ ệ ỉ có toàn quy n trên c s d li u c a ng d ng, th m chí là server mà ng d ng đóề ơ ở ữ ệ ủ ứ ụ ậ ứ ụ đang ch y. L i này thạ ỗ ường x y ra trên các ng d ng web có d li u đả ứ ụ ữ ệ ược qu n líả b ng các h qu n tr c s d li u nh SQL Server, MySQL, Oracle, DB2, Sysbase.ằ ệ ả ị ơ ở ữ ệ ư

2.3.1.2. Các D ng T n Công SQL Injection

- Có b n d ng thông thố ạ ường bao g m: vồ ượt qua ki m tra lúc đăng nh pể ậ (authorization bypass), s d ng câu l n SELECT, s d ng câu l nh INSERT, s d ngử ụ ệ ử ụ ệ ử ụ các stored-procedures.

- Đ bi t các website bán hàng s d ng CSDL SQL ta s d ng các soft ho c cácể ế ử ụ ử ụ ặ công c tìm l i.Ho c các công c tìm ki m nh Google.Và dùng các Dork tìm ki mụ ỗ ặ ụ ế ư ế nh :ư inurl : product.php?id=

Hình 11. M t tools tìm site l i Onlineộ

- Đ bi t website nào dính l i SQL Injection ta thêm d u “ ’ ” vào sau thanh đ a ch .ể ế ỗ ấ ị ỉ Ví d : ụ http://www.doanchuyenganh.com/product.php?id=123’

Hình 12. M t site b l i SQL Injectionộ ị ỗ

i. D ng t n công vạ ượt qua ki m tra đăng nh pể

- V i d ng t n công này, tin t c có th d dàng vớ ạ ấ ặ ể ễ ượt qua các trang đăng nh p nhậ ờ vào l i khi dùng các câu l nh SQL thao tác trên c s d li u c a ng d ng web.ỗ ệ ơ ở ữ ệ ủ ứ ụ Xét m t ví d đi n hình, thông thộ ụ ể ường đ cho phép ngể ười dùng truy c p vào cácậ trang web được b o m t, h th ng thả ậ ệ ố ường xây d ng trang đăng nh p đ yêu c uự ậ ể ầ người dùng nh p thông tin v tên đăng nh p và m t kh u. Sau khi ngậ ề ậ ậ ẩ ười dùng nh pậ thông tin vào, h th ng s ki m tra tên đăng nh p và m t kh u có h p l hay khôngệ ố ẽ ể ậ ậ ẩ ợ ệ đ quy t đ nh cho phép hay t ch i th c hi n ti p. Trong trể ế ị ừ ố ự ệ ế ường h p này, ngợ ười ta có th dùng hai trang, m t trang HTML đ hi n th form nh p li u và m t trang ASPể ộ ể ể ị ậ ệ ộ dùng đ x lí thông tin nh p t phía ngể ử ậ ừ ười dùng. Ví d : login.htmụ

<form action="ExecLogin.asp" method="post">

Username: <input type="text" name="fUSRNAME"><br>

Password: <input type="password" name="fPASSWORD"><br> <input type="submit">

execlogin.asp <%

Dim vUsrName, vPassword, objRS, strSQL vUsrName = Request.Form("fUSRNAME") vPassword = Request.Form("fPASSWORD") strSQL = "SELECT * FROM T_USERS " & _ "WHERE USR_NAME=' " & vUsrName & _ " ' and USR_PASSWORD=' " & vPassword & " ' " Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..."

If (objRS.EOF) Then

Response.Write "Invalid login." Else

Response.Write "You are logged in as " & objRS("USR_NAME") End If

Set objRS = Nothing %>

- Tho t nhìn, đo n mã trong trang execlogin.asp dạ ạ ường nh không ch a b t c m tư ứ ấ ứ ộ l h ng v an toàn nào. Ngỗ ổ ề ười dùng không th đăng nh p mà không có tên đăng nh pể ậ ậ và m t kh u h p l . Tuy nhiên, đo n mã này th c s không an toàn và là ti n đ choậ ẩ ợ ệ ạ ự ự ề ề m t l i SQL injection. Đ c bi t, ch s h n m ch d li u nh p vào t ngộ ỗ ặ ệ ỗ ơ ở ằ ở ỗ ữ ệ ậ ừ ười dùng được dùng đ xây d ng tr c ti p câu l nh SQL. Chính đi u này cho phép nh ngể ự ự ế ệ ề ữ

dùng nh p chu i sau vào trong c 2 ô nh p li u username/password c a trangậ ỗ ả ậ ệ ủ login.htm là: ' OR ' ' = ' '. Lúc này, câu truy v n s đấ ẽ ược g i th c hi n là:ọ ự ệ

SELECT * FROM T_USERS WHERE USR_NAME ='' OR ''='' and USR_PASSWORD= '' OR ''=''

- Câu truy v n này là h p l và s tr v t t c các b n ghi c a T_USERS và đo nấ ợ ệ ẽ ả ề ấ ả ả ủ ạ mã ti p theo x lí ngế ử ười dùng đăng nh p b t h p pháp này nh là ngậ ấ ợ ư ười dùng đăng nh p h p l .ậ ợ ệ

ii. D ng t n công s d ng câu l nh SELECTạ ử ụ

- D ng t n công này ph c t p h n. Đ th c hi n đạ ấ ứ ạ ơ ể ự ệ ược ki u t n công này, k t nể ấ ẻ ấ công ph i có kh năng hi u và l i d ng các s h trong các thông báo l i t h th ngả ả ể ợ ụ ơ ở ỗ ừ ệ ố đ dò tìm các đi m y u kh i đ u cho vi c t n công. Xét m t ví d r t thể ể ế ở ầ ệ ấ ộ ụ ấ ường g pặ trong các website v tin t c. Thông thề ứ ường, s có m t trang nh n ID c a tin c nẽ ộ ậ ủ ầ hi n th r i sau đó truy v n n i dung c a tin có ID này. ể ị ồ ấ ộ ủ

Ví d : ụ http://www.doanchuyennganh.com/product.asp?ID=123 . Mã ngu n choồ ch c năng này thứ ường được vi t khá đ n gi n theo d ngế ơ ả ạ

<%

Dim vNewsID, objRS, strSQL vNewsID = Request("ID")

strSQL = "SELECT * FROM T_NEWS WHERE NEWS_ID =" & vNewsID Set objRS = Server.CreateObject("ADODB.Recordset")

objRS.Open strSQL, "DSN=..." Set objRS = Nothing

%>

- Trong các tình hu ng thông thố ường, đo n mã này hi n th n i dung c a tin có IDạ ể ị ộ ủ trùng v i ID đã ch đ nh và h u nh không th y có l i. Tuy nhiên, gi ng nh ví dớ ỉ ị ầ ư ấ ỗ ố ư ụ

đăng nh p trậ ở ước, đo n mã này đ l s h cho m t l i SQL injection khác. K t nạ ể ộ ơ ở ộ ỗ ẻ ấ công có th thay th m t ID h p l b ng cách gán ID cho m t giá tr khác, và t đó,ể ế ộ ợ ệ ằ ộ ị ừ kh i đ u cho m t cu c t n công b t h p pháp, ví d nh : 0ở ầ ộ ộ ấ ấ ợ ụ ư

OR 1=1 (nghĩa là, http://www.doanchuyennganh.com/product.asp?ID=0 or 1=1).

- Câu truy v n SQL lúc này s tr v t t c các article t b ng d li u vì nó sấ ẽ ả ề ấ ả ừ ả ữ ệ ẽ th c hi n câu l nh:ự ệ ệ

SELECT * FROM T_NEWS WHERE NEWS_ID=0 or 1=1

- M t trộ ường h p khác, ví d nh trang tìm ki m. Trang này cho phép ngợ ụ ư ế ười dùng nh p vào các thông tin tìm ki m nh H , Tên, … Đo n mã thậ ế ư ọ ạ ường g p là:ặ

<%

Dim vAuthorName, objRS, strSQL

vAuthorName = Request("fAUTHOR_NAME")

strSQL = "SELECT * FROM T_AUTHORS WHERE AUTHOR_NAME =' " & _ vAuthorName & " ' "

Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..."

Set objRS = Nothing %>

- Tương t nh trên, tin t c có th l i d ng s h trong câu truy v n SQL đ nh pự ư ặ ể ợ ụ ơ ở ấ ể ậ vào trường tên tác gi b ng chu i giá tr :ả ằ ỗ ị

- Lúc này, ngoài câu truy v n đ u không thành công, chấ ầ ương trình s th c hi nẽ ự ệ thêm l nh ti p theo sau t khóa UNION n a.ệ ế ừ ữ

- T t nhiên các ví d nói trên, dấ ụ ường nh không có gì nguy hi m, nh ng hãy thư ể ư ử tưởng tượng k t n công có th xóa toàn b c s d li u b ng cách chèn vào cácẻ ấ ể ộ ơ ở ữ ệ ằ đo n l nh nguy hi m nh l nh DROP TABLE.ạ ệ ể ư ệ

Ví d nh :ụ ư ' DROP TABLE T_AUTHORS --

- Ch c các b n s th c m c là làm sao bi t đắ ạ ẽ ắ ắ ế ượ ức ng d ng web b l i d ng nàyụ ị ỗ ạ được. R t đ n gi n, hãy nh p vào chu i (*) nh trên, n u h th ng báo l i v cúấ ơ ả ậ ỗ ư ế ệ ố ỗ ề pháp d ng: Invalid object name “OtherTable”; ta có th bi t ch c là h th ng đã th cạ ể ế ắ ệ ố ự hi n câu SELECT sau t khóa UNION, vì nh v y m i có th tr v l i mà ta đã cệ ừ ư ậ ớ ể ả ề ỗ ố tình t o ra trong câu l nh SELECT.ạ ệ

- Cũng s có th c m c là làm th nào có th bi t đẽ ắ ắ ế ể ế ược tên c a các b ng d li u màủ ả ữ ệ th c hi n các thao tác phá ho i khi ng d ng web b l i SQL injection. Cũng r t đ nự ệ ạ ứ ụ ị ỗ ấ ơ gi n, b i vì trong SQL Server, có hai đ i tả ở ố ượng là sysobjects và syscolumns cho phép li t kê t t c các tên b ng và c t có trong h th ng. Ta ch c n ch nh l i câu l nhệ ấ ả ả ộ ệ ố ỉ ầ ỉ ạ ệ SELECT, ví d nh :ụ ư

' UNION SELECT name FROM sysobjects WHERE xtype = 'U' là có th li t kê để ệ ược tên t t c các ấ ả b ng d li u.ả ữ ệ

iii. D ng t n công s d ng câu l nh INSERTạ ử ụ

- Thông thường các ng d ng web cho phép ngứ ụ ười dùng đăng kí m t tài kho n độ ả ể tham gia. Ch c năng không th thi u là sau khi đăng kí thành công, ngứ ể ế ười dùng có thể xem và hi u ch nh thông tin c a mình. SQL injection có th đệ ỉ ủ ể ược dùng khi h th ngệ ố không ki m tra tính h p l c a thông tin nh p vào.ể ợ ệ ủ ậ

Ví d , m t câu l nh INSERT có th có cú pháp d ng: ụ ộ ệ ể ạ

INSERT INTO TableName VALUES('Value One', 'Value Two', 'Value Three').

<%

strSQL = "INSERT INTO TableName VALUES(' " & strValueOne & " ', ' " _ & strValueTwo & " ', ' " & strValueThree & " ') "

Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..."

Set objRS = Nothing %>

- Thì ch c ch n s b l i SQL injection, b i vì n u ta nh p vào trắ ắ ẽ ị ỗ ở ế ậ ường th nh t víứ ấ d nh : ụ ư ' + (SELECT TOP 1 FieldName FROM TableName) + '. Lúc này câu truy v n

s là: ẽ INSERT INTO TableName VALUES(' ' + (SELECT TOP 1 FieldName FROM

TableName) + ' ', 'abc', 'def'). Khi đó, lúc th c hi n l nh xem thông tin, xem nh b nự ệ ệ ư ạ đã yêu c u th c hi n thêm m t l nh n a đó là: SELECT TOP 1 FieldName FROMầ ự ệ ộ ệ ữ TableName

iiii. D ng t n công s d ng stored-proceduresạ ử ụ

- Vi c t n công b ng stored-procedures s gây tác h i r t l n n u ng d ng đệ ấ ằ ẽ ạ ấ ớ ế ứ ụ ược th c thi v i quy n qu n tr h th ng 'sa'. ự ớ ề ả ị ệ ố

- Ví d : n u ta thay đo n mã tiêm vào d ng: ' ; EXEC xp_cmdshell ‘cmd.exe dir C: '.ụ ế ạ ạ - Lúc này h th ng s th c hi n l nh li t kê th m c trên đĩa C:\ cài đ t server.ệ ố ẽ ự ệ ệ ệ ư ụ ổ ặ - Vi c phá ho i ki u nào tuỳ thu c vào câu l nh đ ng sau cmd.exe. N u cài SQLệ ạ ể ộ ệ ằ ế Server ch đ m c đ nh thì SQL Server ch y trên n n SYSTEM, tở ế ộ ặ ị ạ ề ương đương m c truy c p Windows. Có th dùng master..xp_cmdshell đ thi hành l nh t xa:ứ ậ ở ể ể ệ ừ

function escape( input )

input = replace(input, "'", "''") escape = input

Dưới đây là m t s extended stored procedure mà hacker thộ ố ường hay s d ng đử ụ ể th c thi nh ng câu l nh xem n i dung thông tin trong máy n n nhân:ự ữ ệ ộ ạ

Xp_availablemedia: Hi n th nh ng đĩa hi n hành trên máyể ị ữ ổ ệ Xp_dirtree: Hi n th t t c các th m c k c th m c conể ị ấ ả ư ụ ể ả ư ụ Xp_loginconfig: L y thông tin v ch đ b o m t trên serverấ ề ế ộ ả ậ

Xp_makecab: Cho phép ngườ ử ụi s d ng t o các t p tin l u tr trên Server (hay b t cạ ậ ư ữ ấ ứ t p tin nào mà server có th truy xu tậ ể ấ

Xp_ntsec_enumdomain: li t kê nh ng domain mà server có th truy v n.ệ ữ ể ấ Xp_terminate_process: ch m d t m t ti n trình v i tham s PID c a nó.ấ ứ ộ ế ớ ố ủ

iiiii. T n công SQL Injection ấ nâng cao.

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 a.1 :ụ

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:ụ

INSERT into User VALUES(666, char(0x63) +char(0x68) +char(0x72) char(0x69) +char(0x73) ,char(0x63) +char(0x68)

Ví dụ a.2:

Ví dụ a.2 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 a.3:ụ

INSERT into User VALUES( 667,123,123,0xffff)

SQL server s t đ ng chuy n t s sang chu i.ẽ ự ộ ể ừ ố ỗ • 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 b.1: Đ đăng kí account trong ng d ng, nh p username nh sau:ụ ể ứ ụ ậ ư

Username: admin'— Password: passofadmin

- 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’--“)ở ữ ệ ẽ ư

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 );

- 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:ậ ậ ẩ ớ ạ ư

- 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’-- Câu truy v n lúc này nh sau:ấ ư

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 chi 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 b.2: ụ

Gi s c username và password đ u b gi ih n t i đa là 16 kí t .Nh p:ả ử ả ề ị ớ ạ ố ự ậ

Username: aaaaaaaaaaaaaaa’ Password :‘; shutdown--

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

Một phần của tài liệu các phương thức tấn công & phòng thủ web server (Trang 37 - 55)

Tải bản đầy đủ (PDF)

(67 trang)