Tải bản đầy đủ (.docx) (18 trang)

TÌM HIỂU về SQL INJECTION

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 (466.19 KB, 18 trang )

TÌM HIỂU
INJECTION

VỀ

TẤN

CÔNG

SQL

TÌM HIỂU VỀ SQL INJECTION
1.
1.1.

SQL Injection là gì?
Khái niệm SQL Injection
Việc thiết kế và đưa website vào hoạt động luôn đòi hỏi các nhà phát triển

phải quan tâm đến vấn đề về an toàn, bảo mật nhằm giảm thiểu tối đa khả năng bị
tin tặc tấn công. Thường các nhà phát triển tập trung vào các vấn đề an toàn của hệ
điều hành, hệ quản trị CSDL, webserver… Chẳng hạn như hổng bảo mật trên IIS.
Tuy nhiên, có một nguy cơ tiềm ẩn ít được quan tâm đó là các đoạn mã của ứng
dụng. Một trong số đó là tấn công bằng SQL Injection.

SQL Injection là cách thức tấn công vào lỗ hổng của website nhằm vào được cơ sở
dữ liệu, bằng cách chèn thêm một đoạn query của SQL để làm sai lệch câu lệnh
truy vấn, từ đó có thể phá hủy website hoặc lấy cơ sở dữ liệu.
Hình thái chính của SQL Injection bao gồm việc chèn trực tiếp mã vào các
tham số mà sẽ được ghép vào các câu lệnh SQL (quá trình này gọi là sinh truy vấn



SQL động) để tạo thành truy vấn của ứng dụng gửi tới máy chủ database. Một cách
tấn công khác ít trực tiếp hơn, đó là chèn mã độc vào các xâu mà đích đến là việc
lưu trữ trong các bảng hoặc từ điển dữ liệu (metadata). Khi các chuỗi đó được ghép
vào các câu lệnh SQL thì đoạn mã đó sẽ được chạy.
Khi ứng dụng Web thất bại trong việc lọc các tham số đầu vào (được dùng
làm nguyên liệu cho quá trình sinh SQL động), ngay cả khi dùng hình thức tham số
hóa (parameterize) thì kẻ tấn công có thể dễ dàng điều chỉnh quá trình xây dựng
truy vấn SQL. Một khi kẻ tấn công có thể sửa câu truy vấn SQL, thì những truy
vấn SQL anh ta muốn sẽ được thực thi với quyền của người sở hữu ứng dụng, và
thiệt hại anh ta cỏ thể gây ra sẽ tùy theo quyền hạn được cấp.
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 vi đơ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.
Hậu quả của nó rất tai hại vì nó cho phép những kẻ tấn công có thể thực hiện
các thao tác xóa, hiệu chỉnh, … do có toàn quyền 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…

2


Mục đích của tấn công SQL Injection


1.2.

Mục đích chính của SQL injection là truy cập vào cơ sở dữ liệu bất hợp pháp
hoặc

khai

thác

thông

tin

từ

các



sở

dữ

liệu

đó.

Dựa trên cách sử dụng và xử lý dữ liệu người dùng cung cấp, SQL injection
có thể được sử dụng để thực hiện các kiểu tấn công sau:
• Authentication Bypass: hacker có thể đăng nhập vào ứng dụng mà không


1.3.



cần cung cấp username và password, thậm chí có thể chiếm quyền quản trị.
Information Disclosure: người tấn công lấy các thông tin nhạy cảm được lưu



giữ trên cơ sở dữ liệu.
Compromised Data Integrity: thực hiện deface trang web, chèn nội dung độc



hại lên trang web, hoặc thay đổi nội dung cơ sở dữ liệu.
Compromised Availability of Data: người tấn công xóa thông tin trên cơ sở



dữ liệu, xóa log, hoặc thông tin kiểm chứng trên cơ sở dữ liệu.
Remote Code Execution: cho phép người tấn công làm hại hệ thống của
host.
SQL Injection và vấn đề an ninh cơ sở dữ liệu
a. Các thống kê về an ninh

3


Chúng ta xem xét các báo cáo an ninh của các ứng dụng Web gần đây của

Whitehat, một tổ chức có uy tín trong việc nghiên cứu và hỗ trợ các vấn đề an ninh
mạng.


Thống kê 10 lỗi bảo mật nghiêm trọng nhất
Trích từ nguồn:
http://community. whitehatsec.com/home/resource/stats. html
Kết quả thống kê trình bày tháng 3/2008:

10 điểm yếu phổ biến nhất năm 2008

Kết quả thống kê trình bày tháng 2/2009:

4




Thống kê thời gian trung bình cần để khắc phục các lỗi bảo mật trên

Kết quả thống kê trình bày tháng 8/2008:

Kết quả thống kê trình bày tháng 2/2009:

5




Thống kê tỉ lệ điểm yếu thường xuyên bị khai thác

Thống kê được trích trong một bài báo đãng trên tạp chí computerworld
tháng 2/2010

b.

Đánh giá các kết quả thống kê
Dựa vào các thống kê trên cỗ thể rút ra vài nhận xét sau về lỗi SQL
Injection:
• Là một trong số những lỗi bảo mật phổ biến nhất
• Xác suất gặp phải lỗ hổng bảo mật loại này trong một trang web là khá cao
• Được sử dụng nhiều, lý do một phần 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 các điểm yếu này thường khá lâu, do đó hậu quả

thường nặng nề hơn.
Trên thực tế, 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, ví dụ các Trang web thương mại điện tử. Thông
thường, các cuộc tấn công này thường sẽ tiến hành việc sửa đổi nội dung của
database đối tượng và chèn các đoạn mã JavaScript độc. 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
6


SQL Injection cũng chậm được khắc phục triệt để.
Với tính nghiêm trọng của các cuộc tấn công, tính dễ thực hiện một cuộc tấn
công đã khiến cho SQL Injection một thời từng là hiểm họa nghiêm trọng đối với
các giao dịch thương mại điện tử trên các ứng dụng Web được phát triển thiếu an
toàn. Hiện nay, việc nghiên cứu SQL Injection đã có hệ thống và toàn diện hơn,

mối nguy hiểm này đã giảm đi, nhưng số liệu thống kê vẫn cho thấy vấn đề này
còn chưa được giải quyết triệt để.
2.
2.1.

Các dạng tấn công SQL Injection phổ biến
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ậ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. 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.
Dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu và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 bằng cách truyền vào
một input hợp lệ, các truy vấn này luôn trả về kết quả đúng (true) hoặc có điều kiện
luôn đúng, vì thế kẻ tấn công dễ dàng vượt qua module đăng nhập để truy cập trái
phép vào hệ thống thông tin.
Ví dụ, trong trường hợ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ười dùng như sau:

7


-


Trang nhập liệu: login.htm

<formaction="ExecLogin.asp" method="post">
Username:

<input type="text" name="fUSRNAME">


Password:

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


<input type="submit">
</form>

-

Trang xử lý nhập liệu: 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 %>

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ày cho
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ếu người
dùng nhập chuỗi trong ngoặc sau vào trong cả 2 ô nhập liệu username/password
của trang login.htm là:(‘’ OR ‘1’=’1’). Lúc này, câu truy vấn sẽ được gọi thực hiện
là:

8


SELECT * FROM T_USERS WHERE USR_NAME =’’ OR ‘1’=’1’ and USR_PASSWORD= ’’ OR
‘1’= ’1’

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ệ.
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. 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 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ị:
9


' 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ện thê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.
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
Xét ví dụ sau: mẫu form dùng để đăng kí tài khoản như sau:

10


Khi đó 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, 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


Vậy 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. 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ư:
11


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

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.
Nếu cài SQL Server ở chế độ mặc định thì SQL Server chạy trên nền
SYSTEM,

tương

đương

mức

truy


cập



Windows.



thể

dùng

master..xp_cmdshell để thi hành lệnh từ xa:
;exec master..xp_cmdshell ‘ping 10.10.1.2’—
Thử dùng nháy đôi (“) nếu nháy đơn (‘) không làm việc.
Dưới đây là một số extended stored procedure mà hacker thường sử dụng để
thực thi những câu lệnh xem nội dung thông tin trong máy nạn nhân:
• Xp_availablemedia: Hiển thị những ổ đĩa hiện hành trên máy
• Xp_dirtree: Hiển thị tất cả thư mục kể cả thư mục con
• Xp_loginconfig: Lấy thông tin về chế độ bảo mật trên Server
• Xp_makecad: Cho phép người sử dụng tạo các tập tin lưu trữ trên


Server (hay bất cứ tập tin nào mà Server có thể truy xuất)
Xp_ntsec_enumdomain: liệt kê những domain mà Server có thể truy
xuất

3.
3.1.


Kỹ thuật tấn công SQL Injection
Tìm kiếm mục tiêu
Hiện nay thì hầu như việc lập trình website không dựa vào việc viết từng

dòng code mà đều sử dụng các framework, bản thân các framework này đều đã tích
hợp bảo mật ở mức cơ bản nên SQL Injection hầu như không còn đất sống nếu
website được xây dựng dựa trên các framework này.

12


Tuy vậy, vẫn còn hàng triệu website ngoài kia có thể bị lỗi này nên việc đầu tiên
chúng ta phải làm là tìm một website tiềm năng để thực hành Việc tìm kiếm khá
đơn giản, các bạn hãy vào Google và gõ dòng lệnh sau:
inurl:"product.php?id="
Lệnh này sẽ trả về các kết quả tìm kiếm là các website bán hàng được viết bằng
PHP, nhiều khả năng vẫn còn dính lỗi SQL Injection. Hoặc bạn có thể gõ:
inurl:"product.php?id=" site:vn
Để tìm kiếm chỉ những trang web có nguồn gốc từ Việt Nam.
Ví dụ chúng ta tìm được một trang như sau:
/>Để biết trang này có bị lỗi hay không, tôi thêm một dấu nháy đơn vào cuối địa chỉ
trang web:
/>Nếu không thấy thông báo lỗi này và trang web vẫn load lại bình thường chứng tỏ
nó đã miễn nhiễm với SQL Injection, các bạn hãy tìm trang khác, còn nếu giao
diện trang web bị lỗi bất thường như sau, chứng tỏ chúng ta đã tìm được "con
mồi":

13



3.2.

Phát hiện
Một cách thông thường, để phát hiện một ứng dụng web có dính lỗi SQL

Injection hay không là thêm vào câu truy vấn các meta character trong các hệ quản
trị cơ sở dữ liệu, chẳng hạn như dấu nháy đơn (single quote), dấu nháy kép (double
quote), dấu chấm phẩy (semi colon) 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.
Ví dụ khi muốn xem item có id =2 ta request tới liên kết
http://site/item.php?id=2 . Để xem liên kết này có dính lỗi SQL Injection hay
không ta thêm vào cuối liên kết một trong các meta character đã nói ở trên, chẳng
hạn ta thêm vào dấu nháy đơn http://site/item.php?id=2’. Nếu như ứng dụng web
vẫn trả về cho chúng ta nội dung của item có id=2 hoặc đưa ra một thông báo về
việc không tìm được item hoặc đưa chúng ta tới một trang khác (một trang thông
báo lỗi mặc định hay trang chủ chẳng hạn), như vậy ta có thể kết luận rằng ứng
dụng đã xứ lý tốt tham số đầu vào trước khi thao tác cơ sở dữ liệu. Ngược lại, nếu
thấy xuất hiện một thông báo lỗi (exception) từ MySQL, MSSQL… thì ứng dụng

-

web đã dính lỗi SQL Injection.
3.3.
Thu thập các dữ liệu quan trọng
Xác định số lượng cột trong mệnh đề select
Khi khai thác SQLInjection, chúng ta thường sử dụng một hay nhiều mệnh đề
select phụ(subselect), điều này được thực hiện thông qua từ khóa union. Union là
từ khóa dùng để gộp kết quả của nhiều mệnh đề select do đó trong mỗi mệnh đề
select đòi hỏi số lượng các trường đều phải bằng nhau và đều bằng số lượng các
trường được select trong mệnh đề select ban đầu.

Nếu số trường select ở mệnh đề select sau union không bằng số lượng các trường
được select trong mệnh đề select đầu tiên, chúng ta sẽ nhận được thông báo lỗi.
Vậy làm sao để biết để biết được chính xác mệnh đề select đầu tiền chọn ra bao
nhiêu trường. Chúng ta có thể thực hiện thử dần bằng cách tăng dần số lượng cột

14


trong mệnh đề select sau union (bắt đầu từ 1). Khi nào không thấy thông báo lỗi
xuất hiện thì đó chính là số lượng cột cần tìm.
Một cách khác để làm điều này, nhanh chóng hơn đó là sử dụng ‘order by’. Trong
các hệ quản trị cơ sở dữ liệu từ khóa ‘order by’ được sử dụng để sắp xếp thứ tự cho
các bản ghi thu được trong mệnh để select. Sau order bycó 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 đó (có thể tăng
dần hay 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 order lớn hơn số cột được select thì chúng ta sẽ thấy thông báo lỗi.
- Xác định thông tin
Để khai thác được SQL Injection, chúng ta cần biết một số thông tin về cơ sở dữ
liệu như tên bảng, tên cột, các kiểu dữ liệu của từng cột… Giai đoạn này đòi hỏi
khá nhiều thời gian.
Tên bảng và cột
Chúng ta có nhiều cách để làm được công việc này, một trong những cách đó



là “đoán” vì nó nhanh chóng và trong những trường hợp cụ thể, đây là cách rất
hữu ích. Ví dụ khi tên bảng là một tên quen thuộc như : user, users, admin,
administrator, staff, account… (chú ý tiền tố tbl_ rất hay được các lập trình
viên sử dụng để đặt cho tên bảng).
• Kiểu dữ liệu

Khi khai thác SQL Injection với hệ quản trị Microsoft SQL Server thường gặp
phải những bó buộc với kiểu dữ liệu của các trường. Trong các mệnh đề select
trước và sau union, kiểu dữ liệu của các trường tương ứng phải thống nhất với
3.4.

nhau.
Xử lý thông tin thu được
Sau khi thu thập được các dữ liệu quan trọng, chúng ta tiến hành tấn công thay

đổi dữ liệu của trang web tuỳ theo mục đích tấn công.


Khi có tên của tất cả các column trong table, có thể UPDATE hoặc
INSERT một record mới trong table đó.
15




Thực hiện thay đổi password của user hoặc login trực tiếp và thực hiện



các thao tác dưới quyền user đó.
Thực hiện thay đổi giao diện trang web(deface) theo mục đích khi có
được tài khoản admin.

4.
4.1.


Các biện pháp phòng chống tấn công SQL Injection
Kiểm soát chặt chẽ dữ liệu nhập 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 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.
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 đ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.
4.2.
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 để tránh các nguy cơ từ SQL Injection attack, nên chú ý loại bỏ
bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển xuống cho người dùng
khi ứng dụng có lỗi. Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có
thể cho phép kẻ tấn công biết được điểm yếu của hệ thống
4.3.

Chuẩn hóa dữ liệu
Chúng ta đã đề cập đến một số các thao tác qua mặt các bộ lọc, phương thức

phổ biến đó là mã hỏa input dưới định dạng nào đỏ rồi gửi cho ứng dụng mà sau đó
16



input đỏ có thể được giải mã theo định dạng hacker mong muốn. Ví dụ, ta có một
số cách mã hóa dấu nháy đơn như sau:
Biểu diễn

Hình thức mã hóa

%27

Mã hóa URL (URL encoding)

%2527

Mã hóa kép URL (trường hợp này dấu % trong
%27 cũng được mã hóa )

%u0027

Biểu diễn dạng ký tự Unicode

%u02b9

Biểu diễn dạng ký tự Unicode

%ca%b9

Biểu diễn dạng ký tự Unicode

'


Thuộc tính HTML

'

Thuộc tính HTML dạng hexa

'

Thuộc tính HTML dạng decimal

Không phải tất cả các hình thức biểu diễn trên có thể được thông dịch ra
thành dấu nháy đơn như mong muốn mà tùy thuộc vào từng điều kiện cụ thể (ví dụ
giải mã ở mức ứng dụng, giải mã ở WAF hay ở Web server, ...). Nói chung là khó
dự đoán được kết quả việc thông dịch dạng mã hóa trên.
Chính vì những lý do như trên, để thuận lợi cho quá trình kiểm tra dữ liệu
đầu vào và đầu ra, chúng ta cần xây dựng các mô hình chuẩn hóa dữ liệu dưới một
dạng đơn giản. Một mô hình có thể xem xét như, ban đầu giải mã dưới dạng URL,
sau đó giải mã dưới dạng HTML, có thể thực hiên vài lần. Tuy nhiên có thể sẽ tin
cậy hơn nếu chúng ta chỉ thực hiện giải mã theo định dạng phổ biến nhất nào đó
đúng 1 lần, nếu phát hiện dấu hiệu nghi vấn, lập tức từ chối dữ liệu đó.
4.4.

Sử dụng giải pháp Database Firewall
Database firewall dựa trên việc phân tích ngữ pháp, cấu trúc chính xác ngôn

ngữ SQL (Highly accurate SQL grammar), sẽ giúp giám sát và ngăn chặn được các
luồng SQL nguy hại, trước khi nó kết nối tới được CSDL (SQL injection là được

17



loại bỏ). Việc triển khai mô hình database firewall không ảnh hưởng tới cấu trúc và
mô hình hiện tại.

4.5.

Một số phương pháp khác
• Rewrite URL: nhằm mục đích che giấu các biến GET trên thanh URL,

khiến cho kẻ tấn công khó xác định phương hướng tấn công.


Thông báo lỗi: không đưa ra các thông báo lỗi rõ rang trên trang web khi

người dùng nhập sai dữ liệu. Tránh bị các hacker phán đoán được cấu trúc câu
lệnh.

18



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×