Tại sao SQL Injection lại “thần thánh”? Những lý do sau đã tạo nên tên tuổi lừng lẫy của SQL Injection: • Cực kỳ nguy hiểm – Có thể gây ra những thiệt hại khổng lồ. Với SQL Injection, hacker có thể truy cập một phần hoặc toàn bộ dữ liệu trong hệ thống. • Rất phổ biến và dễ thực hiện – Lỗ hổng này rất nổi tiếng, từ developer đến hacker gần như ai cũng biết. Ngoài ra, còn có 1 số tool tấn công SQL Injection cho dân “ngoại đạo”, những người không biết gì về lập trình. • Rất nhiều ông lớn từng bị dính – Sony, Microsoft UK. Mọi vụ lùm xùm liên quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL Injection. Dễ tấn công, phổ biến, gây ra hậu quả nghiêm trọng, đó là lý dó Inject (Không chỉ SQL mà OS và LDAP) nằm chễm chễ ở vị trí đầu bảng trong top 10 lỗ hỗng bảo mật của OWASP. Vậy SQL Injection thực sự “Thần thánh” như thế nào? Bài báo cáo này, nhóm 05 sẽ nói rõ những đặc điểm nổi trội đó. CHƯƠNG I: GIỚI THIỆU CHUNG VỀ SQL INJECTION I. Khái niệm SQL Injection SQL (Structured Query Language) được sử dụng để truy vấn, thao tác dữ liệu trong Database. SQL Injection là một kỹ thuật tấn công vào câu lệnh cơ sở dữ liệu thông qua chèn các đoạn mã độc vào SQL để đánh lạc hướng xử lý với mục đích phá hủy dữ liệu hoặc ăn cắ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. SQL injection thường được biết đến như là một vật trung gian tấn công 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... MsAccess: thường dành cho các website tin tức quy mô nhỏ, sử dụng ngôn ngữ ASP để thiết kế. MSSQL: dùng cho website có quy mô lớn, sử dụng ngôn ngữ ASP, ASPX (ASP.Net) để thiết kế. MySQL: tất cả các website có thể dùng, sử dụng ngôn ngữ PHP để thiết kế (MySQL và PHP là 2 anh em song sinh, chúng luôn đi kèm với nhau ). Oracle: tương tự như MySQL Db2: dùng cho các hệ thông website ngân hàng các hệ thống cần chế độ bảo mật rất cao Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape, Lynx, .
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
-*** -ĐỒ ÁN MÔN HỌC 2017
ĐỀ TÀI:
TRIỂN KHAI MÔ PHỎNG TẤN CÔNG SQL
INJECTION VÀO WEBSERVER
Giảng viên hướng dẫn
Sinh viên thực hiện SV BM Mạng Máy Tính – Khóa 58
Hà Nội – 2017
Trang 2MỤC LỤC
LỜI MỞ ĐẦU 3
CHƯƠNG I: GIỚI THIỆU CHUNG VỀ SQL INJECTION 4
I Khái niệm SQL Injection 4
II Quy trình tấn công 4
III Các dạng lỗi thường gặp 5
1 Không kiểm tra ký tự thoát truy vấn 5
2 Xử lý không đúng kiểu 6
3 Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu 6
4 Blind SQL injection 7
CHƯƠNG II: MỘT SỐ DẠNG TẤN CÔNG THƯỜNG GẶP VỚI CÁC ỨNG DỤNG WEB 9
I Dạng tấn công vượt qua kiểm tra lúc đăng nhập 9
II Dạng tấn công sử dụng câu lệnh SELECT 10
III Dạng tấn công sử dụng câu lệnh INSERT 11
IV Dạng tấn công sử dụng stored-procedures 13
CHƯƠNG III: MÔ PHỎNG TẤN CÔNG WEBSERVER BẰNG SỬ DỤNG CÂU LỆNH SELECT 14
I Thực hiện SQL Injection bằng Hackbar trên FireFox 14
II Xác định số lượng cột trong mệnh đề Select 16
III Xác định thông tin, khai thác thông tin 17
CHƯƠNG IV: HẬU QUẢ CỦA SQL INJECTION VÀ CÁCH PHÒNG CHỐNG SQL 27
I Hậu quả 27
II Cách phòng chống 27
KẾT LUẬN 30
Trang 4LỜI MỞ ĐẦU
Tại sao SQL Injection lại “thần thánh”?
Những lý do sau đã tạo nên tên tuổi lừng lẫy của SQL Injection:
Cực kỳ nguy hiểm – Có thể gây ra những thiệt hại khổng lồ Với SQL
Injection, hacker có thể truy cập một phần hoặc toàn bộ dữ liệu trong hệ thống.
Rất phổ biến và dễ thực hiện – Lỗ hổng này rất nổi tiếng, từ developer đến
hacker gần như ai cũng biết Ngoài ra, còn có 1 số tool tấn công SQL Injection cho dân “ngoại đạo”, những người không biết gì về lập trình.
Rất nhiều ông lớn từng bị dính – Sony, Microsoft UK Mọi vụ lùm xùm liên
quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL Injection.
Dễ tấn công, phổ biến, gây ra hậu quả nghiêm trọng, đó là lý dó Inject (Không chỉ
SQL mà OS và LDAP) nằm chễm chễ ở vị trí đầu bảng trong top 10 lỗ hỗng bảo mật
của OWASP
Vậy SQL Injection thực sự “Thần thánh” như thế nào? Bài báo cáo này, nhóm 05 sẽ nói rõ những đặc điểm nổi trội đó.
Trang 5CHƯƠNG I: GIỚI THIỆU CHUNG VỀ SQL INJECTION
I Khái niệm SQL Injection
SQL (Structured Query Language) được sử dụng để truy vấn, thao
tác dữ liệu trong Database
SQL Injection là một kỹ thuật tấn công vào câu lệnh cơ sở dữ liệu
thông qua chèn các đoạn mã độc vào SQL để đánh lạc hướng xử lý với mụcđích phá hủy dữ liệu hoặc ăn cắ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 SQL injection thường được biết đến như làmột vật trung gian tấn công 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ư SQLServer, MySQL, Oracle, DB2, Sysbase
MsAccess: thường dành cho các website tin tức quy mô nhỏ, sử dụng ngôn
ngữ ASP để thiết kế
MSSQL: dùng cho website có quy mô lớn, sử dụng ngôn ngữ ASP, ASPX
(ASP.Net) để thiết kế
MySQL: tất cả các website có thể dùng, sử dụng ngôn ngữ PHP để thiết kế
(MySQL và PHP là 2 anh em song sinh, chúng luôn đi kèm với nhau )
Oracle: tương tự như MySQL Db2: dùng cho các hệ thông website ngân
hàng các hệ thống cần chế độ bảo mật rất cao!
Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn nhưInternet Explorer, Netscape, Lynx,
II Quy trình tấn công
1 Hacker tìm form hoặc lỗ hổng qua URL của website
2 Hacker chèn lệnh SQL vào lỗ hổng
3 Hacker lấy được thông tin mình mong muốn, ví dụ thông tin bài đăng hoặcthông tin của một User, hoặc thông tin đăng nhập của SQL
Trang 64 Hacker giải mã password của admin, hoặc thay thế mật khẩu của mình vàorồi đăng nhập bằng tài khoản Admi
5 Thay đổi nội dung website, đánh cắp dữ liệu…
III 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 đầuvà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ínhxác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câutruy 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 userNamenhư 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 truyvấ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àychỉ 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ủabiến "userName" trong câu truy vấn dưới đây sẽ gây ra việc xoá những người
Trang 7dù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ọckiể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ụngtrong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầuvà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ố haykhô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ậpvà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
Trang 8Đ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 SQLinjection 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
a 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âutruy 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ặckhô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ớinhững dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ liệu hay bảnghiện tại
b Điều kiện lỗi
Mỗ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';
Trang 9Phé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.
c 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 truyvấn SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truyvấn của SQL engine cần nhiều thời gian Tin tặc có thể sử dụng lỗi SQLinjection 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
Trang 10CHƯƠNG II: MỘT SỐ DẠNG TẤN CÔNG THƯỜNG
GẶP VỚI CÁC ỨNG DỤNG WEB
I 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ậpnhờ 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 ứngdụ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ườidùng nhập thông tin về tên đăng nhập và mật khẩu Sau khi người dùng nhậpthô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ệ haykhông để quyết định cho phép hay từ chối thực hiện tiếp Ví dụ, trong trườnghợ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ườidù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 />
Trang 11strSQL = "SELECT * FROM T_USERS " & _
"WHERE USR_NAME=' " & vUsrName & _
" ' and USR_PASSWORD=' " & vPassword & " ' "
Set objRS = Server.CreateObject("ADODB.Recordset")
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àycho 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ếungười dùng nhập chuỗi trong ngoặc sau vào trong cả hai ô 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ườidùng đăng nhập hợp lệ
II Dạng tấn công sử dụng câu lệnh SELECT
Trang 12Dạ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ấncô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áctrang tìm kiếm Các trang này cho phép người dùng nhập vào các thông tintì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ệnthê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
III Dạng tấn công sử dụng câu lệnh INSERT
Trang 13Thô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ườidùng có thể xem và hiệu chỉnh thông tin của mình SQL injection có thể đượcdù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:
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ệnthêm một lệnh nữa đó là:
SELECT TOP 1 FieldName FROM TableName
Trang 14IV 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
Trang 15CHƯƠNG III: MÔ PHỎNG TẤN CÔNG WEBSERVER
BẰNG SỬ DỤNG CÂU LỆNH SELECT
Để 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ếukhởi đầu cho việc tấn công
I Thực hiện SQL Injection bằng Hackbar trên FireFox
Tool cần chuẩn bị: Add-on FireFox Hackbar
Để tìm một trang web có khả năng dính lỗi, ta tìm kiếm Google bằng lệnh
sau:
Có rất nhiều web hiện ra, ví dụ ta truy cập trang web đầu tiên:
http://www.hoanghaidoor.vn/?frame=product_detail&id=705
Trang 16Để phát hiện một ứng dụng web có dính lỗi SQL Injection hay không, ta thêmvào câu truy vấn các meta character trong các hệ quản trị cơ sở dữ liệu, chẳnghạn như dấu nháy đơn, dấu nháy kép, dấu chấm phẩy và các ký tự comment( , ##, /**/, %)… và chờ xem ứng dụng web sẽ xứ lý câu truy vấn đó nhưthế nào
+ Dấu nháy đơn (‘): dấu này trong ngôn ngữ SQL dùng để “gói” chuỗi.
Ta thường thêm nó vào sau tham số kiểu số trên chuỗi truy vấn để kiểm tra có lỗi hay không Nguyên nhân là do không kiểm tra kiểu dữ liệu.
+ Dấu thăng (#) và dấu (): các dấu này để đánh dấu chú thích, nghĩa là
những kí tự đứng sau một trong hai dấu này trên cùng một dòng sẽ được xem là chú thích được bỏ qua khi thực hiện truy vấn.
+ Dấu ( ; ): dùng để kết thúc một truy vấn và tất nhiên sau nó là bắt đầu
một truy vấn khác Đôi khi ta dùng union để nối hai câu truy vấn.
Thêm vào cuối liên kết trên một trong các meta character đã nói ở trên, chẳng
http://www.hoanghaidoor.vn/?frame=product_detail&id=705 ’
Trang 17Thông tin của sản phẩm đã mất, như vậy trang web này đã bị dính lỗi SQL
injection.
II Xác định số lượng cột trong mệnh đề Select
Từ khóa 'order by' được dùng để sắp xếp thứ tự cho các bản ghi thu được trong mệnh đề select Sau order by có thể là tên một cột để xác định rằng kết
quả thu về sẽ được sắp xếp theo giá trị của cột đó (tăng dần hoặc giảm dần).Sau 'order by' cũng có thể là số thứ tự vị trí của cột đó Nếu giá trị sau orderlớn hơn số cột được select thì chúng ta sẽ thấy thông tin bị mất
Chèn sau url đoạn mã : order by ….– (… là giá trị số nguyên, thử cho đến khi
nào link bị lỗi thì dừng lại )
Order by được sử dụng để:
+ Làm tiết kiệm thời gian attack.
+ Tính số field ,column có trong CSDL SQL.