1. Trang chủ
  2. » Công Nghệ Thông Tin

TRIỂN KHAI MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEBSERVER

31 735 6

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 31
Dung lượng 1,95 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

KHOA 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 2

MỤ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 4

LỜ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 5

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ư 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 6

4 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 7

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ọ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 9

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.

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 10

CHƯƠ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 11

strSQL = "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 12

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ấ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 13

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ườ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 14

IV 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 15

CHƯƠ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 17

Thô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.

Ngày đăng: 27/10/2017, 17:35

TỪ KHÓA LIÊN QUAN

w