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 c?a vi?c ki?m tra d? li?u �?u v�o 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 tr? v? �? inject (ti�m v�o) v� thi h�nh c�c c�u l?nh SQL b?t h?p ph�p. SQL injection c� th? cho ph�p nh?ng k? t?n c�ng th?c hi?n c�c thao t�c, delete, insert, update,� 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...
I. C�c d?ng l?i th�?ng g?p
1. Kh�ng ki?m tra k? t? tho�t truy v?n
��y l� d?ng l?i SQL injection x?y ra khi thi?u �o?n m? ki?m tra d? li?u �?u v�o trong c�u truy v?n SQL. K?t qu? l� ng�?i d�ng cu?i c� th? th?c hi?n m?t s? truy v?n kh�ng mong mu?n �?i v?i c� s? d? li?u c?a ?ng d?ng. D?ng m? sau s? minh h?a l?i n�y:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
C�u l?nh n�y ��?c thi?t k? �? tr? v? c�c b?n ghi t�n ng�?i d�ng c? th? t? b?ng nh?ng ng�?i d�ng. Tuy nhi�n, n?u bi?n "userName" ��?c nh?p ch�nh x�c theo m?t c�ch n�o �� b?i ng�?i d�ng �c ?, n� c� th? tr? th�nh m?t c�u truy v?n SQL v?i m?c ��ch kh�c h?n so v?i mong mu?n c?a t�c gi? �o?n m? tr�n. V� d?, ta nh?p v�o gi� tr? c?a bi?n userName nh� sau:
a' or 't'='t
Khi?n c�u truy v?n c� th? ��?c hi?u nh� sau:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
N?u �o?n m? tr�n ��?c s? d?ng trong m?t th? t?c x�c th?c th? v� d? tr�n c� th? ��?c s? d?ng �? b?t bu?c l?a ch?n m?t t�n ng�?i d�ng h?p l? b?i 't'='t' lu�n ��ng. Trong khi h?u h?t c�c SQL server cho ph�p th?c hi?n nhi?u truy v?n c�ng l�c ch? v?i m?t l?n g?i, tuy nhi�n m?t s? SQL API nh� mysql_query c?a php l?i kh�ng cho ph�p �i?u �� v? l? do b?o m?t. �i?u n�y ch? ng�n c?n tin t?c t?n c�ng b?ng c�ch s? d?ng c�c c�u l?nh ri�ng r? m� kh�ng ng�n c?n tin t?c thay �?i c�c t? trong c� ph�p truy v?n. C�c gi� tr? c?a bi?n "userName" trong c�u truy v?n d�?i ��y s? g�y ra vi?c xo� nh?ng ng�?i d�ng t? b?ng ng�?i d�ng c?ng t��ng t? nh� vi?c x�a t?t c? c�c d? li?u ��?c t? b?ng d? li?u (v? b?n ch?t l� ti?t l? c�c th�ng tin c?a m?i ng�?i d�ng), v� d? n�y minh h?a b?ng m?t API cho ph�p th?c hi?n nhi?u truy v?n c�ng l�c:
a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't
�i?u n�y ��a t?i c� ph�p cu?i c�ng c?a c�u truy v?n tr�n nh� sau:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM DATA WHERE 't' = 't';2. X? l? kh�ng ��ng ki?u
L?i SQL injection d?ng n�y th�?ng x?y ra do l?p tr?nh vi�n hay ng�?i d�ng �?nh ngh?a �?u v�o d? li?u kh�ng r? r�ng ho?c thi?u b�?c ki?m tra v� l?c ki?u d? li?u �?u v�o. �i?u n�y c� th? x?y ra khi m?t tr�?ng s? ��?c s? d?ng trong truy v?n SQL nh�ng l?p tr?nh vi�n l?i thi?u b�?c ki?m tra d? li?u �?u v�o �? x�c minh ki?u c?a d? li?u m� ng�?i d�ng nh?p v�o c� ph?i l� s? hay kh�ng. V� d? nh� sau:
statement:= "SELECT * FROM data WHERE id = " + a_variable + ";"
Ta c� th? nh?n th?y m?t c�ch r? r�ng ? �?nh c?a t�c gi? �o?n m? tr�n l� nh?p v�o m?t s? t��ng ?ng v?i tr�?ng id - tr�?ng s?. Tuy nhi�n, ng�?i d�ng cu?i, thay v? nh?p v�o m?t s?, h? c� th? nh?p v�o m?t chu?i k? t?, v� do v?y c� th? tr? th�nh m?t c�u truy v?n SQL ho�n ch?nh m?i m� b? qua k? t? tho�t. V� d?, ta thi?t l?p gi� tr? c?a bi?n a_variable l�:
1;DROP TABLE users
khi ��, n� s? th?c hi?n thao t�c x�a ng�?i d�ng c� id t��ng ?ng kh?i c� s? d? li?u, v? c�u truy v?n ho�n ch?nh �? ��?c hi?u l�:
SELECT * FROM DATA WHERE id=1;DROP TABLE users;3. L?i b?o m?t b�n trong m�y ch? c� s? d? li?u
��i khi l? h?ng c� th? t?n t?i ch�nh trong ph?n m?m m�y ch? c� s? d? li?u, nh� l� tr�?ng h?p h�m mysql_real_escape_string() c?a c�c m�y ch? MySQL. �i?u n�y s? cho ph�p k? t?n c�ng c� th? th?c hi?n m?t cu?c t?n c�ng SQL injection th�nh c�ng d?a tr�n nh?ng k? t? Unicode kh�ng th�ng th�?ng ngay c? khi �?u nh?p v�o �ang ��?c tho�t.
4. Blind SQL injection
L?i SQL injection d?ng n�y l� d?ng l?i t?n t?i ngay trong ?ng d?ng web nh�ng h?u qu? c?a ch�ng l?i kh�ng hi?n th? tr?c quan cho nh?ng k? t?n c�ng. N� c� th? g�y ra s? sai kh�c khi hi?n th? n?i dung c?a m?t trang ch?a l?i b?o m?t n�y, h?u qu? c?a s? t?n c�ng SQL injection d?ng n�y khi?n cho l?p tr?nh vi�n hay ng�?i d�ng ph?i m?t r?t nhi?u th?i gian �? ph?c h?i ch�nh x�c t?ng bit d? li?u. Nh?ng k? t?n c�ng c?n c� th? s? d?ng m?t s? c�ng c? �? d? t?m l?i d?ng n�y v� t?n c�ng v?i nh?ng th�ng tin �? ��?c thi?t l?p s?n.
5. Thay �?i gi� tr? �i?u ki?n truy v?n
D?ng l?i n�y khi?n cho k? t?n c�ng c� th? thay �?i gi� tr? �i?u ki?n trong c�u truy v?n, l�m sai l?ch s? hi?n th? c?a m?t ?ng d?ng ch?a l?i n�y.
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1;
S? hi?n th? m?t trang m?t c�ch b?nh th�?ng, trong khi:
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2;
s? hi?n th? m?t n?i dung kh�c, ho?c kh�ng hi?n th? g? n?u ?ng d?ng web c� ch?a l?i SQL injection d?ng n�y. L? h?ng d?ng n�y c?n cho ph�p tin t?c kh�ng ch? g�y ?nh h�?ng t?i b?ng hay d? li?u hi?n t?i m� c?n ?nh h�?ng t?i nh?ng d? li?u hay b?ng kh�c ph? thu?c v�o n?i dung c?a d? li?u hay b?ng hi?n t?i.
6. �i?u ki?n l?i
L?i SQL injection d?ng n�y d?n t?i vi?c bu?c c� s? d? li?u ch? ��?c ph�p ��nh gi� khi m� gi� tr? c?a c�u l?nh WHERE l� ��ng. V� d?:
SELECT 1/0 FROM users WHERE username='Ralph';
Ph�p chia cho 0 ch? ��?c ��nh gi� l� l?i khi m� ng�?i d�ng c� t�n "Ralph" t?n t?i trong c� s? d? li?u.
7. Th?i gian tr?
L?i SQL injection d?ng n�y t?n t?i khi th?i gian x? l? c?a m?t hay nhi?u truy v?n SQL ph? thu?c v�o d? li?u logic ��?c nh?p v�o ho?c qu� tr?nh x? l? truy v?n c?a SQL engine c?n nhi?u th?i gian. Tin t?c c� th? s? d?ng l?i SQL injection d?ng n�y �? x�c �?nh th?i gian ch�nh x�c m� trang c?n t?i khi gi� tr? nh?p v�o l� ��ng.
II. M?t s? d?ng t?n c�ng th�?ng g?p v?i c�c ?ng d?ng web
C� b?n d?ng t?n c�ng th�?ng g?p bao g?m: v�?t qua ki?m tra l�c ��ng nh?p, s? d?ng c�u l?nh SELECT, s? d?ng c�u l?nh INSERT, s? d?ng c�c stored-procedures
1. D?ng t?n c�ng v�?t qua ki?m tra l�c ��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. 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. V� d?, trong tr�?ng h?p s? d?ng ASP, ng�?i ta c� th? d�ng 2 trang: 1 trang HTML �? hi?n th? Form nh?p li?u v� 1 trang ASP �? x? l? th�ng tin nh?p v�o t? ph�a ng�?i d�ng nh� sau:
- Trang nh?p li?u: 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">
</form>
- Trang x? l? nh?p li?u: 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 %>
Ch? s� h? trong �o?n m? x? l? nh?p li?u tr�n 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 tin t?c c� th? �i?u khi?n c�u truy v?n s? ��?c th?c hi?n. V� d?, n?u ng�?i d�ng nh?p chu?i trong ngo?c 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?.
2. 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. V� d?, trong c�c trang t?m ki?m. C�c 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?:
' UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '=' (*)
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. Gi? s? �o?n m? nh?p v�o l�:
' DROP TABLE T_AUTHORS --
C�u truy v?n s? th?c hi?n vi?c x�a b?ng.
3. 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')
N?u �o?n m? x�y d?ng c�u l?nh SQL c� d?ng:
<%
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 SQLi, 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
4. 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 �cmdd.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.
Theo wikipedia
Chap 18 - Nh?ng ki?n th?c c� b?n �? tr? th�nh hacker : Kh�i ni?m c� b?n SQL Injection
4/
5
Oleh
Unknown