Kiến Thức Chung

Sql injection và các cách tấn công phổ biến

Sql injection và các cách tấn công phổ biến

pdf – 29 trang

BÁO CÁO

SQL INJECTION VÀ CÁC

CÁCH TẤN CÔNG PHỔ

BIẾN

1

MỤC LỤC

MỞ ĐẦU ………………………………………………………………………………………………………….. 3

1.Tính cấp thiết của đề tài……………………………………………………………………………………. 3

2.Mục đích nghiên cứu ……………………………………………………………………………………….. 5

3.Đối tượng và phạm vi nghiên cứu ……………………………………………………………………… 5

4.Phương pháp nghiên cứu ………………………………………………………………………………….. 5

5.Ý nghĩa khoa học và thực tiễn của đề tài…………………………………………………………….. 5

6.Bố cục của luận văn …………………………………………………………………………………………. 6

CHƯƠNG 1: GIỚI THIỆU VỀ SQL INJECTION …………………………………………………. 7

1.1 Đặc trưng của ứng dụng sử dụng cơ sở dữ liệu …………………………………………………. 7

1.2 Tầm quan trọng của các câu lệnh sql đối với một hệ thống web …………………………. 8

1.3.Khái niệm sql injection ………………………………………………………………………………….. 8

CHƯƠNG 2: SQL INJECTION VÀ CÁC CÁCH TẤN CÔNG PHỔ BIẾN …………… 11

2.1. Dạng tấn công vượt qua kiểm tra đăng nhập ………………………………………………….. 11

2.2. Dạng tấn công sử dụng câu lệnh SELECT …………………………………………………… 13

2.3. Dạng tấn công sử dụng câu lệnh INSERT …………………………………………………… 15

2.4. Dạng tấn công sử dụng Stored-procedures ……………………………………………………. 16

2.5. Dạng tấn công sử dụng Blind SQL Injection …………………………………………………. 16

CHƯƠNG 3: PHÒNG CHỐNG SQL INJECTION …………………………………………….. 18

3.1.Kiểm soát chặt chẽ dữ liệu đầu vào ……………………………………………………………… 18

3.2. Sử dụng các lớp giao tiếp trừu tượng ……………………………………………………………. 19

2

3.3. Thiết lập các đối tượng giả làm mồi nhử ………………………………………………………. 20

3.4. Thiết lập cấu hình an toàn cho hệ quản trị cơ sở dữ liệu ………………………………… 20

KẾT LUẬN …………………………………………………………………………………………………….. 21

KẾ HOẠCH DỰ KIẾN TRIỂN KHAI ĐỀ TÀI …………………………………………………… 25

TÀI LIỆU THAM KHẢO …………………………………………………………………………………. 26

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 rất nhiều thuận lợi cho

người sử dụng cũ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 cập trang web không thể thực hiện hoặc rất khó thực hiện,chiếm quyền

điều khiển trang web… Mục tiêu của 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 những dữ liệu nhạy cảm như thông tin về thể tín dụng,mua hàng thô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.

Tháng 7 năm 2006,theo số liệu thống kê của hãng bảo mật SecureWorks cho biết

đã phát hiện tới 8.000 vụ tấn công lên các cơ sở dữ liệu mỗi ngày. Như vậy, con số này

đã tăng thêm trung bình từ 100 đến 200 vụ tấn công một ngày so với con số của 3 tháng

đầu năm 2006.Con số này được SecureWorks thống kê từ hệ thống các cơ sở dữ liệu của

3

hơn 1.300 khách hàng đang sử dụng các giải pháp dịch vụ bảo mật của hãng này.

SecureWorks cho biết tin tặc – chủ yếu sử dụng các máy tính tại Nga, Trung Quốc,

Brazill, Hungary và Hàn Quốc và đều dùng chung một phương pháp có tên SQL

Injection trong những vụ tấn công vào các cơ sở dữ liệu.Một trong những vụ tấn công

SQL Injection nổi tiếng nhất chính là vụ tấn công vào CardSystems Solutions – một

hãng chuyên lưu trữ cơ sở dữ liệu thanh toán thẻ tín dụng. Tin tặc đã sử dụng giải pháp

tấn công SQL Injection để chiếm quyền điều khiển hệ thống cơ sở dữ liệu của

CardSystems và chuyển toàn bộ cơ sở dữ liệu ra ngoài. Đã có khoảng 40 triệu thẻ tín

dụng rơi vào tay chúng gây ra thiệt hại hàng triệu USD.

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ẻ cho mỗi một vụ tấn công. 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.Âm thầm như thế nhưng

thiệt hại của những vụ tấn công này lại rất lớn. 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 rất 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 nguồn

thông tin mà tin tặc thu được còn nhiều hơn rất nhiều 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.

Mới đây nhất vào tháng 6 năm 2011,Công ty bảo mật web Armorize thông báo đã

phát hiện một kiểu tấn công mới với cách thức SQL injection hàng loạt. Kiểu tấn công

mới này lợi sử dụng hình thức đơn giản của mạng ngang hàng (peer-to-peer) để làm cho

mạng bị tổn hại khó có thể gỡ xuống. Về mặt lịch sử, các cuộc tấn công web hàng loạt

rất đơn giản: Mã được viết bằng ngôn ngữ truy vấn có cấu trúc (SQL) được gửi đến cơ

sở dữ liệu web phụ trợ (back-end) nhờ sử dụng một lỗ hổng trong mã của website. Khi

lỗ hổng bảo mật nằm trong một ứng dụng thông thường, cuộc tấn công có thể làm hại

hàng ngàn website cùng một lúc.Trong phiên bản mới nhất của kiểu tấn công, thay vì

chèn vào các website một đoạn mã lệnh tĩnh đơn nhất trỏ trình duyệt truy cập đến một số

website tải về mã độc hại, những kẻ tấn công tạo ra một đoạn mã lệnh động dẫn khách

truy cập tới máy chủ web đã bị xâm nhập từ trước. Kỹ thuật mới làm cho việc lập danh

sách đen (blacklisting) khó khăn hơn nhiều.

4

Trên thực tế do sự phát triển mạnh mẽ từng giờ,từng ngày của công nghệ thông

tin cho nên các kiểu tấn công của các hacker cũng ngày càng tinh vi,phức tạp và khó

ngăn chặn.Xuất phát từ những lý do trên,tôi chọn đề tài “ tấn công kiểu SQL injectiontác hại và phòng chống” làm đề tài nghiên cứu.

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 toàn thông tin khi chúng ta làm việc trên ứng dụng web hàng ngày, hiểu rõ hơn về

các kỹ thuật tấn công và bảo mật web.

 Xác định được nguyên nhân,nhận diện chính xác đối tượng động cơ,cách thức

của kể tấn công xâm nhập vào cơ sở dữ liệu.Xác định mục tiêu,mối nguy hiểm thường

trực về an ninh ứng dụng web của các tổ chức.

 Hiểu rõ 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.

 Biết sử dụng phương pháp và các công cụ cơ bản để kiểm tra an ninh bảo mật

trên ứng dụng web nhằm có cách phòng chống hiệu quả.

3.Đối tượng và phạm vi nghiên cứu

Tìm hiểu kỹ thuật tấn công phổ biến nhất hiện nay là sql injection.Cách bảo mật

phòng thủ kiểu tấn công này một cách tổng quan nhất.

4.Phương pháp nghiên cứu

 Tiếp cận ngôn ngữ truy vấn có cấu trúc SQL.

 Nghiên cứu các kỹ thuật tấn công sql injection thông qua các lỗ hổng bảo mật

từ đó đưa ra các giải pháp phòng chống có hiệu quả.

5.Ý nghĩa khoa học và thực tiễn của đề tài

Theo tài liệu Hacking Exposed Web 2.0 đánh giá Mức độ phổ biến của phương

Xem Thêm :  [GDDD] Chương 1 – Gió đánh cành tre

pháp tấn công kiểu sql injection là rất cao( 8/10), bởi vì nó cũng khá đơn giản để thực

5

Xem Thêm :   Kể kỉ niệm sâu sắc về tình thầy trò

hiện( 8/10), là một trong những lỗi bảo mật phổ biến nhất,xác xuất gặp lỗi bảo mật này

khá cao và các tác động của SQL Injection tới hệ thống là rất nguy hiểm( 9/10). Chính

vì thế, nên tổng thể nguy cơ này được đánh giá 9/10. Đây thật sự là một lỗ hổng về bảo

mật rất đáng được quan tâm đến.

Dựa vào lỗi SQL Injection, hacker có thể làm được những việc sau:

 Có thể lấy được rất nhiều thông tin quan trọng trong cơ sở dữ liệu của một

hệ thống web như account và password của admin của một web site, hay

các thông tin quan trọng về thẻ tín dụng của khách hàng trong một ngân

hàng nào đó…

 Có thể thêm, xóa, sửa cơ sở dữ liệu của đối tượng bị tấn công theo ý muốn

 Có thể tạo một backdoor cho những lần tấn công sau

 Có thể đánh sập hoàn toàn một hệ thống

 Có thể dùng như một phương pháp tấn công DoS

Các cuộc tấn công sql injection thường nhắm đến các cơ sở dữ liệu mang tính

thương mại,các website của thành phố thậm chí là các website của chính phủ,hầu hết các

website bị tấn công đều thuộc loại đáng tin cậy,hợp pháp và an toàn tuyệt đối trong mắt

người dùng.

Xuất phát từ thực tế trên việc nghiên cứu đề tài này là hoàn toàn cấp thiết.

6.Bố cục của luận văn

Mở Đầu:

Chương 1: Giới thiệu về SQL Injection

Chương 2: SQL Injection và các cách tấn công phổ biến

Chương 3: Phòng chống SQL Injection

Kết Luận:

Kế hoạch dự kiến triển khai đề tài

Tài liệu tham khảo

6

CHƯƠNG 1: GIỚI THIỆU VỀ SQL INJECTION

1.1 Đặc trưng của ứ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à những ứ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 đó, 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 toàn và bảo mật của ứng dụng Web kết nối tớ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, ngoài ra còn có một số bản cải tiến, mở rộng mô hình này nhằm những mục

đích riêng.

Mô hình ứng dụng 3-tier

Các mô hình trên luôn có một số điểm chung, đó là database server chỉ làm

nhiệm vụ lưu trữ dữ liệu, database hồi đáp những truy vấn dữ liệu được xây dựng theo

chuẩn (ví dụ như SQL). Mọi thao tác xử lý dữ liệu input, output của database server

đều được ứng dụng web ở tầng Logic xử lý. Các vấn đề an ninh phát sinh đa phần sẽ

nằm ở tầng này.

7

1.2 Tầm quan trọng của các câu lệnh sql đối với một hệ thống web

Cơ sở dữ liệu(database) được coi như là “trái tim” của hầu hết các website. Nó

chứa đựng những dữ liệu cần thiết để website có thể chạy và lưu trữ các thông tin phát

sinh trong quá trình chạy. Nó cũng lưu trữ những thông tin cá nhân , thẻ tín dụng , mật

khẩu của khách hàng , của user và thậm chí là cả của Administrator. Để lấy các thông tin

cần thiết từ cơ sở dữ liệu thì các câu lệnh SQL sẽ đảm đương 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, hay nói

cách khác, các câu lệnh SQL đóng một vai trò rất quan trọng đối với một hệ thống web.

1.3.Khái niệm sql injection

SQL Injection là một 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 một ứng dụng. Lỗ

hổng bảo mật 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 kiểu đầu vào không rõ ràng hay do

lỗi cú pháp SQL của lập trình viên khiến cho một đoạn mã ngoại lai có thể được xử lý

ngoài ý muốn. Nó là một ví dụ của sự rủi ro khi một ngôn ngữ lập trình hay ngôn ngữ

kịch bản được nhúng trong một ngôn ngữ khác. Tấn công SQL injection còn có thể hiểu

là hình thức tấn công chèn bất hợp pháp các đoạn mã SQL.

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 với 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 một 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

dùng có thể tương tác được để điều khiển nội dung (ví dụ : các form, tham số URL,

cookie, tham số referrer, user-agent, …) đều có thể được sử dụng để tiến hành chèn

truy vấn có hại.

Để hiểu rõ hơn về sql injection chúng ta cùng xem một ví dụ minh họa sau:

8

Khi người sử dụng truy cập vào một website tin tức và click vào một tin có mã số là 1

thì đường dẫn gửi tới máy chủ sẽ có nội dung như sau:

Khi đó,để cung cấp nội dung tin số 1 trả về cho người sử dụng,website sẽ truy vấn tới

cơ sở dữ liệu để lấy tin.Câu truy vấn SQL do người lập trình viết sẽ có cấu trúc như

sau:

SELECT* FROM News WHERE Newsld =”+N_ID+”

Trong trường hợp này với yêu cầu lấy tin số 1 thì biến N_ID=1.Kết quả câu truy vấn

SQL thật tới cơ sở dữ liệu sẽ là: SELECT* FROM News WHERE Newsld =1

Do sơ xuất của lập trình viên trong khi lập trình,không kiểm tra tính hợp lệ của N_ID

trước khi thực thi câu truy vấn SQL,hacker có thể lợi dụng để chèn các câu truy vấn

nguy hiểm tới cơ sở dữ liệu.

Chúng ta có thể thấy phần bôi đậm trong hình minh họa trên là một câu truy vấn độc

hại do hacker chèn vào.Câu truy vấn này cũng sẽ được thực thi cùng với câu truy vấn

của người lập trình viết và sẽ khiến thông tin trong cơ sở dữ liệu bị xóa.

SELECT * FROM News WHERE NewsId = 1; DELETE FROM NEWS WHERE NewsId=2

Dưới đây là các sơ đồ kết nối trong ví dụ trên:

Minh họa cho một truy vấn thông thường tới website.

9

Minh họa cho hệ thống tồn tại lỗ hổng SQL Injection

Minh họa cho hệ thống không tồn tại lỗ hổng SQL Injection

Như vậy có thể thấy,lỗi SQL Injection xẩy ra khi 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, do chính thời gian bảo trì mã nguồn thường kéo

dài nên các lỗi sql injection cũng chậm được khắc phục triệt để.

10

CHƯƠNG 2: SQL INJECTION VÀ CÁC CÁCH TẤN CÔNG PHỔ BIẾN

Các cuộc tấn công nhắm tới lớp database của ứng dụng web xét theo mục đích

được chia làm hai loại chính: thứ nhất là nhắm tới dữ liệu chứa trong database, thứ hai là

nhắm tới chính bản thân database.Trường hợp thứ nhất thường là kẻ tấn công nhắm tới

các thông tin có giá trị như thông tin cá nhân,thông tin tài chính… trường hợp thứ hai thì

kẻ tấn công muốn biến database thành cửa ngõ để thâm nhập sâu hơn vào trong mạng

Xem Thêm :  Cách đọc giờ trong tiếng anh

lưới của tổ chức sở hữu ứng dụng web đang tấn công.Chúng ta xét một số phương pháp

tấn công thông thường nhằm phục vụ hai mục đích trên bao gồm: vượt qua kiểm tra lúc

đăng nhập (authorization bypass), sử câu lệnh SELECT, sử dụng câu lệnh INSERT, sử

dụng các Stored-Procedures,sử dụng Blind SQL Injection…

2.1. 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

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ệ hay 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ể dùng hai trang, một trang HTML để

hiển thị form nhập liệu và một trang ASP dùng để xử lí thông tin nhập từ phía người

dùng.

Ví dụ:

login.htm

Xem Thêm :   Trình bày định luật Jun Lenxơ Lớp 9

Username:

Password:

11

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.” 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 toà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. Đặc biệt, chỗ sơ hở 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ày cho phép

những kẻ tấn công có thể điều khiển câu truy vấn sẽ được thực hiện. Ví dụ, nếu người

dùng nhập chuỗi sau vào trong cả 2 ô 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ười dùng

đăng nhập hợp lệ.

12

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

Ví dụ: http://www.myhost.com/shownews.asp?ID=123. Mã nguồn cho chức năng này

thường được viết khá đơn giản theo dạng:

Dim vNewsID, objRS, strSQL

vNewsID = Request(“ID”)

strSQL = “SELECT * FROM T_NEWS WHERE NEWS_ID =” & vNewsID

Set objRS = Server.CreateObject(“ADODB.Recordset”)

objRS.Open strSQL, “DSN=…”

Set objRS = Nothing

%>

Trong các tình huống thông thường, đoạn mã này hiển thị nội dung của tin có

ID trùng với ID đã chỉ định và hầu như không thấy có lỗi. Tuy nhiên, giống như ví dụ

đăng nhập ở trước, đoạn mã này để lộ sơ hở cho một lỗi SQL injection khác. Kẻ tấn

công có thể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, và từ đó,

khởi đầu cho một cuộc tấn công bất hợp pháp, ví dụ như: 0 OR 1=1 (nghĩa là

http://www.myhost.com/shownews.asp?ID=0 or 1=1)

Câu truy vấn SQL lúc này sẽ trả về tất cả các article từ bảng dữ liệu vì nó sẽ

thực hiện câu lệnh:

SELECT * FROM T_NEWS WHERE NEWS_ID=0 or 1=1

13

Một trường hợp khác, ví dụ như trang tìm kiếm. Trang này cho phép người

dùng nhập vào các thông tin tì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 câu truy vấn đầu không thành công, chương trình sẽ thực hiện thêm lệnh tiếp

theo sau từ khóa UNION nữa.

Tất nhiên những ví dụ nói trên,dường như không có gì nguy hiểm,nhưng hãy thử tương

tự kẻ tấn công có thể xóa toàn bộ cơ sở dữ liệu bằng cách chèn vào các đoạn lệnh nguy

hiểm như lệnh DROP TABLE. Ví dụ như: ‘ DROP TABLE T_AUTHORS –

Chắc các bạn sẽ thắc mắc là làm sao biết được ứng dụng web bị lỗi dạng này được.

Rất đơn giản, hãy nhập vào chuỗi (*) như trên, nếu hệ thống báo lỗi về cú

pháp dạng: Invalid object name “OtherTable”; ta có thể biết chắc là hệ thống đã thực

hiện câu SELECT sau từ khóa UNION, vì như vậy mới có thể trả về lỗi mà ta đã cố

tình tạo ra trong câu lệnh SELECT.

14

Cũng sẽ có thắc mắc là làm thế nào có thể biết được tên của các bảng dữ liệu mà thực

hiện các thao tác phá hoại khi ứng dụng web bị lỗi SQL injection. Cũng rất đơn giản,

bởi vì trong SQL Server, có hai đối tượng là sysobjects và syscolumns cho phép liệt

kê tất cả các tên bảng và cột có trong hệ thống. Ta chỉ cần chỉnh lại câu lệnh

SELECT, ví dụ như:

” UNION SELECT name FROM sysobjects WHERE xtype = ‘U’ là có thể liệt kê được tên

tất cả các bảng dữ liệu.

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

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 SQL injection, 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ện

thêm một lệnh nữa đó là: SELECT TOP 1 FieldName FROM TableName

15

2.4. Dạng tấn công sử dụng Stored-procedures

Stored Procedure đượ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ể 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 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ụ: stored procedure sp_login gồm hai 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:

Xem Thêm :  Phim Truy tìm ký ức

Exec sp_login ‘thanhcong’,‘’;shutdown- -’

Lệnh shutdown thực hiện dừng sql server ngay lập tức

2.5. Dạng tấn công sử dụng Blind SQL Injection

Một số ứng dụng Web đã được thiết kế xử lý lỗi khá tốt và về cơ bản kẻ tấn

công không thể thấy được các thông báo lỗi chứa các thông tin nhạy cảm. Do vậy việc

tấn công bằng cách sử dụng từ khoá UNION hay tấn công dựa vào thông báo lỗi

không thể thực hiện. Trong trường hợp này thì kẻ tấn công sẽ sử dụng kỹ thuật Blind

SQL Injection. Có hai dạng Blind SQL Injection:

 Normal Blind: Không thấy phản hồi từ trang Web nhưng kẻ tấn công

có thể thấy được kết quả thông qua mã trạng thái HTTP hoặc kết quả

của câu truy vấn. Cách tấn công Normal Blind thường được thực hiện

bằng cách sử dụng câu điều kiện If hoặc tấn công vào mệnh đề Where

 Totally Blind: Hoàn toàn không thấy bất cứ phản hồi nào từ trang Web.

Khi đó kẻ tấn công sẽ sử dụng một số hàm hệ thống và phân tích sự trả

lời từ trang Web để tìm ra lỗ hổng.

Ví dụ: Kẻ tấn công có thể sử dụng câu truy vấn sau:

16

Xem Thêm :   Top 10 những quyển sách hay nhất thế giới nhất định phải đọc một lần trong đời

ProductID = 1;waitfor delay ‘0:0:10’—

Nếu thời gian phản hồi từ trang web trể hơn bình thường 10 giây thì có nghĩa rằng trang web

có lỗ hổng.

Mặc dù SQL là một chuẩn do ANSI và ISO đưa ra, tuy nhiên, có rất nhiều phiên

bản khác nhau của ngôn ngữ SQL. Và phần lớn các chương trình cơ sở dữ liệu cũng có

những phần mở rộng thêm vào riêng của họ, so với chuẩn SQL. Do đó, khi tấn công các

cơ sở dữ liệu khác nhau hoặc các website viết trên các ngôn ngữ lập trình khác nhau, thì

có thể sẽ phải sử dụng nhiều phương pháp tấn công khác nhau. Tuy nhiên, các câu lệnh

cơ bản của các chương trình cơ sở dữ liệu thì phần lớn đều phải theo chuẩn đã được đưa

ra.Chính vì thế các dạng tấn công nêu trên về cơ bản được các hacker sử dụng khá phổ

biến và hiệu quả đối với hầu hết các cơ sở dữ liệu .

17

CHƯƠNG 3: 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. Nếu ứng dụng sử dụng quyền dbo (quyền của người sở hữu cơ sở dữ liệu owner) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng dữ

liệu mới, … Nếu ứng dụng sử dụng quyền ‘sa’ (quyền quản trị hệ thống), nó có thể

điều khiển toàn bộ hệ quản trị cơ sở dữ liệu và với quyền hạn rộng lớn như vậy nó có

thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của bạn.Để

phòng chống có một số biện pháp sau:

3.1.Kiểm soát chặt chẽ dữ liệu đầu vào

Điểm yếu sql injection bắt nguồn từ việc xử lý dữ liệu từ người dùng không

tốt,do đó vấn đề xây dựng mã nguồn đảm bảo an ninh là cốt lõi của việc phòng chống

sql injection

Để 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 là 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

(Request,

Request.QueryString,

Request.Form,

Request.Cookies,

and

Request.ServerVariables). 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 như:

Function EscapeQuotes(sInput)

sInput = replace(sInput, ” ‘ “, ” ‘ ‘ “)

EscapeQuotes = sInput

End Function

%>

Trong trường hợp dữ liệu nhập 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

18

đ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().

Ngoà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:

Function KillChars(sInput)

dim badChars dim newChars

badChars = array(“select”, “drop”, “;”, “–“, “insert”, “delete”, “xp_”)

newChars = strInput

for i = 0 to uBound(badChars)

newChars = replace(newChars, badChars(i), “”)

next

KillChars = newChars

End Function

%>

3.2. Sử dụng các lớp giao tiếp trừu tượng

Khi thiết kế một ứng dụng doanh nghiệp thì thường có một yêu cầu đặt ra đó

là định nghĩa các lớp (layer) như mô hình n-tier, ví dụ các lớp trình diễn

(presentation), lớp nghiệp vụ (business), lớp truy cập dữ liệu (data access) sao cho

một lớp luôn trừu tượng với lớp ở trên nó. Trong phạm vi nội dung chúng ta đang

xét, đó là các lớp trừu tượng phục vụ truy cập dữ liệu. Tùy theo từng công nghệ

được sử dụng mà ta có những lớp chuyên biệt như Hibernate trên Java, hay các

framework

truy cập database

(database

driver)

như ADO.NET, JDBC, PDO.

Các lớp giao tiếp này cho phép truy cập dữ liệu an toàn mà không làm lộ kiến trúc

chi tiết bên dưới của ứng dụng.

19

Một ví dụ về một lớp truy cập dữ liệu được thiết kế có tính toán, đó là tất cả

mọi câu lệnh thao tác với database có sử dụng dữ liệu bên ngoài đều phải thông qua

các câu lệnh tham số hóa. Đảm bảo điều kiện là ứng dụng chỉ truy cập tới database

thông qua lớp truy cập dữ liệu này, và ứng dụng không sử dụng các thông tin được cung

cấp để xây dựng truy vấn SQL động tại database. Một điều kiện đảm bảo hơn khi

kết hợp các phương thức truy cập database với việc sử dụng các stored procedure trên

database. Những điều kiện như vậy sẽ giúp cho database được an toàn hơn trước những

cuộc tấn công.

3.3. Thiết lập các đối tượng giả làm mồi nhử

Chiến thuật này được đưa ra nhằm cảnh báo cho quản trị 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 nhạy cảm như

password. 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ó đoá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ễ

đoán, ví dụ như password, credit_no, 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 này được truy cập, sẽ có một thông báo gửi về cho quản

trị viên.

3.4. Thiết lập cấu hình an toàn cho hệ quản trị cơ sở dữ liệu

Cần có cơ chế kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu đến tài khoản

người dùng mà ứng dụng web đang sử dụng. Các ứng dụng thông thường nên tránh

dùng đến các quyền như ‘dbo’ hay ‘sa’. Quyền càng bị hạn chế, thiệt hại càng ít.

Ngoài ra cần tắt tất cả các thông báo lỗi không cần thiết của web server. Hacker

có thể lợi dụng chính các thông báo lỗi này để khai thác thông tin của hệ thống, phục vụ

cho một cuộc tấn công SQL Injection.

Tóm lại để ứng dụng thật sự tránh được tấn công SQL Injection cần triển khai một số

việc sau:

 Không trả về những 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 ứ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.

20

Xem thêm bài viết thuộc chuyên mục: Giáo Dục

Xem thêm bài viết thuộc chuyên mục: Kiến Thức Chung

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai.

Back to top button