1
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Viện Công Nghệ Thông Tin & Truyền Thông
o0o
BÁO CÁO TIỂU LUẬN
Môn học: An toàn bảo mật thông tin
Lớp: 12BCNTT2 - Nhóm 4
Đề tài: Tấn công XSS và SQL Injection
Giảng viên: TS. Trần Đức Khánh
Nhóm học viên thực hiện:
Ngô Hoàng Thành
Phạm Tất Thành
Nguyễn Xuân Thịnh
Trần Văn Nậm
Luyện Thanh Tuấn
Trần Hữu Thảo
Hà Nội 06-2013
MỤC LỤC
1.1. Khái niệm 4
1.2. Phân loại 5
!"
#$ % &'!(
$ $ ) *+,-
Thao tác 1 : Dò m lỗ hổng XSS của trang web 8
.$ / 01
5.1. Đối với người phát triển web 9
5.2. Đối với người dùng 10
23 4+,5678
thông tin quan trọng trên máy người dùng.
Kỹ thuật này được viết tắt là XSS để tránh nhầm lẫn với CSS - Cascading Style
Sheet – (những file định dạng hiển thị cho HTML).
XSS là kỹ thuật tấn công nhằm vào phía người dùng (client side), lợi dụng sự
“ngây thơ” của những người sử dụng web chủ yếu là để đánh cắp các thông tin quan
trọng từ họ và sử dụng những thông tin đó vào mục đich xấu. Các đoạn script được
chạy trong khi người dùng không hề ý thức được việc mình đang thực hiện các thao
tác này.
4
1.2. Phân loại
Stored XSS
Phương pháp này giống như tên gọi tức là XSS được lưu trữ lại trên server. Với
phương pháp này, attacker sẽ gửi một đoạn script độc hại vào trang web của server
(qua nhiều hình thức như comment, viết bài, …) và những đoạn script này sẽ được lưu
trữ vào server. Khi người dùng xem trang web này, trình duyệt sẽ nhận về cả trang
web lẫn script độc hại và chạy đoạn script này, thực hiện các thao tác mà người dùng
không hề biết (chuyển thông tin cho attacker, thực hiện các thao tác giao dịch …)
Reflected XSS
Về cơ bản reflectd XSS được sử dụng thông qua các URL chứa đoạn script độc hại mà
người dùng không để ý vẫn click vào. Attacker gửi cho người dùng URL chứa script
độc hại (thông qua email, chat, …) và thông thường URL này được ẩn dưới dạng mà
người dùng tin tưởng (URL của các trang mà người dùng có tài khoản, những trang
5
hay truy cập). Khi người dùng click vào những đường link này thì một request mang
theo script độc hại sẽ được gửi lên server, server sẽ trả lại trang HTML có chứa script
và trình duyệt sẽ thực hiện script đó với tư cách là user đang đăng nhập, dễ dàng thực
hiện các thao tác và thao tác đơn giản nhất là gửi thông tin người dùng (chứa trong
cookie) cho attacker.
2. Mục đích chính của XSS
Mục đích chính của XSS là đánh cắp thông tin quan trọng của người dùng để
vì vậy mà ta không thể lường trước hết được những gì mà XSS có thể làm được. Tuy
nhiên do những script này được chạy trên trình duyệt của người dùng nên mục tiêu của
nó chính là những người dùng. Nó không có tác dụng thay đổi dữ liệu nguồn của web
server. Tất nhiên có những trường hợp attacker sử dụng người dùng để tấn công server
nhưng điều đó chỉ là tấn công bề ngoài của server mà thôi (do người dùng cũng chỉ có
quyền hạn nhất định trên web server).
Trên thực tế XSS không dễ nhận ra theo cách thức nhìn thấy thẻ script trên
URL mà URL có thể được encode lại dưới dạng mã Hexa. Ở dạng này trình duyệt vẫn
hiểu được URL đó là gì nhưng người dùng lại khó nhận ra được URL này chứa XSS.
Ví dụ :
7
http::/Trang_web/file_name?query=%3C%73%63%72%69%70%74%3E
%61%6C%65%72%74%28%27%58%53%53%20%61%74%74%61%63%6B
%65%64%21%27%29%3B%3C%2F%73%63%72%69%70%74%3E
thực chất là URL :
http::/Trang_web/file_name?query= <script>alert('XSS attacked!');</script>
đã được mã hóa dưới dạng Hexa. Người dùng sẽ không nhận ra URL này thực chất là
gì mà sẽ chỉ nghĩ rằng đây là các tham số của trang web mình thường sử dụng và sẽ
click vào đó.
Các đoạn script trong XSS rất đa dạng. Nó có thể đơn giản chỉ là những script
lấy thông tin cookie (thông tin về session của người dùng) gửi về cho attacker cho đến
những thao tác phức tạp như thực thi các giao dịch mua bán, giao dịch chuyển tiền…
Trong thực tế có nhiều cách tấn công XSS “tinh vi” hơn thông qua các file được
upload lên server. Điển hình là cách tấn công XSS thông qua các file flash.
Macromedia Flash cho phép thêm vào file flash những script có cú pháp đơn giản và
tương tự như Java script. Những đoạn script này có thể thực thi việc gọi đến một trang
web hay đơn giản là gọi đến một đoạn Java script khác. Attacker sẽ gửi lên trang web
những file flash có chứa mã độc trong script (những đoạn mã này người dùng hoàn
toàn không thấy được), khi người dùng xem những file flash đó thì các đoạn script sẽ
được thực thi và thực hiện những thao tác mà attacker mong muốn.
Khi nhận dữ liệu từ người dùng ta phải thực hiện việc lọc dữ liệu này hay nói
cách khác là ta phải xác minh tính hợp lệ của dữ liệu. Dữ liệu không được chứa các ký
tự đặc biệt, không được chứa các đoạn script… Tuy nhiên việc xác minh tính hợp lệ
của dữ liệu một cách liên tục sẽ ảnh hưởng đến hiệu năng của hệ thống. Thêm vào đó
các attacker có thể vượt qua bước này bằng cách mã hóa lại các script nhập vào (lưu ý
rằng phần dữ liệu này sẽ được đưa vào trang HTML bên máy người dùng nên việc mã
hóa chỉ cần sao cho trình duyệt của người dùng vẫn có thể hiểu được).
9
Mã hóa dữ liệu
Đây cũng có thể coi là một cách loại bỏ những ký tự đặc biệt, không hợp lệ.
Thông thường việc mã hóa dữ liệu sẽ là mã hóa dưới dạng các mã HTML cho các ký
tự đặc biệt. Các mã này giúp trình duyệt khi dịch trang HTML sẽ hiểu và hiển thị
chúng chứ không coi chúng như một tag của mình và thực thi chúng. Tuy nhiên việc
mã hóa dữ liệu liên tục và có khối lượng lớn cũng ảnh hưởng đến hiệu năng của hệ
thống. Do đó ta cần phải lưu ý vấn đề này để đưa ra được phương án mã hóa hợp lý.
5.2. Đối với người dùng
Cảnh giác đối với các đường link lạ
Như đã trình bày ở trên, cách tấn công thường gặp là attacker gửi cho người
dùng URL có chứa mã độc (reflected xss) và người dùng không để ý mà click vào. Do
đó người dùng cần cảnh giác với những URL lạ, nhất là những URL quá dài và có
những dấu hiệu của các thẻ HTML. Người dùng cần để ý những URL quan trọng liên
quan đến thông tin nhạy cảm của mình để tránh nhầm lẫn giữa URL bình thường và
URL đã bị tiêm mã độc.
Ngăn chặn việc chạy mã độc
Trong thực tế nhiều trường hợp mã độc không ẩn giấu dưới dạng URL mà được
tiêm trực tiếp vào nội dung mà người dùng nhận được (tiêm và các thẻ HTML của
email chẳng hạn), do đó người dùng cần cài đặt các chế độ ngăn chặn việc chạy các
mã độc trên hệ thống của mình (trình duyệt web hoặc phần mềm check email) để đảm
bảo không có đoạn mã được thực thi nằm ngoài kiểm soát của bản thân.
Kết luận :
những sở thích của người dùng, khi đó ứng dụng web sẽ sử dụng cookies để đưa ra
những gợi ý tốt nhất cho người dùng khi mua sản phẩm. Do được lưu trữ ở client nên
người dùng có thể chỉnh sửa tùy ý, vì vậy nếu ứng dụng web sử dụng những thông tin
lưu trong cookies để xây dựng các truy vấn tới cơ sở dữ liệu thì hacker hoàn toàn có
thể chèn vào cookies những script sql để thực hiện một cuộc tấn công Sql Injection.
2.3 Thông qua các biến server
Biến server có thể là một khái niệm tương đối lạ lẫm nhưng nó không hề mới.
Một số ví dụ của biến server là Http header, Network header… Không phổ biến lắm
nhưng các giá trị được lưu trong biến server có thể được ứng dụng web sử dụng như
trong việc logging truy cập hay thống kê truy cập theo user agent… Những công việc
này đều có sự tương tác với cơ sở dữ liệu nên các hacker hoàn toàn có thể sử dụng các
biến server trong việc khai thác Sql Injection
12
2.4 Second-order Injection
Đây là kỹ thuật ít được sử dụng vì rất khó để nhận biết một ứng dụng web có bị
mặc lỗi này hay không. Kỹ thuật này được mô tả như sau : Trước hết, hacker “inject”
vào cơ sở dữ liệu một đoạn mã. Đoạn mã này chưa hề gây nguy hiểm cho hệ thống
nhưng nó sẽ được sử dụng làm bàn đạp cho lần inject tiếp theo của hacker. Chúng ta
hãy xem một ví dụ cụ thể để hiểu hơn về kỹ thuật này.
Một hacker truy cập vào một ứng dụng web và cố gắng đăng ký một tài khoản có
username là “administrator’ ”. Sau đó hacker này thực hiện thao tác thay đổi mật
khẩu. Thao tác thay đổi mật khẩu được ứng dựng web xử lý như sau :
Với username đăng ký như trên, câu truy vấn sẽ trở thành
Như vậy, hacker đã thay đổi được password của tài khoản administrator và hoàn toàn
có thể đăng nhập dưới tên tài khoản administrator.
3. Các kỹ thuật khai thác
3.1 Union Query Based
Đây là phương pháp phổ biến khi khai thác Sql Injection. Cơ sở của nó là sử dụng
từ khóa union để gộp các kết quả của các mệnh đề select, qua đó lấy được thông tin từ
cơ sở dữ liệu.
15
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.
4.2 Thu thập thông tin về hệ quản trị cơ sở dữ liệu
Khi phát hiện ứng dụng bị dính lỗi Sql Injection, công việc cần làm tiếp theo là
thu thập thông tin về hệ quản trị cơ sở dữ liệu mà ứng dụng đang dùng, thông tin này
bao gồm loại cơ sở dữ liệu (mysql, mssql, oracle…) và phiên bản của nó. Tùy vào ứng
dụng sử dụng phiên bản hay loại hệ quản trị sơ sở dữ liệu nào mà chúng ta có những
kỹ thuật khai thác khác nhau. Một ví dụ đơn giản cho thấy sự khác nhau giữa các loại
hệ quản trị cơ sở dữ liệu đó là, trong khi mssql sử dụng ký tự comment là ‘ ’ thì
mysql lại sử dụng ‘##’…
Để xác định hệ loại quản trị mà ứng dụng đang sử dụng, chúng ta có thể đánh giá theo
nhiều tiêu chí. Có thể đánh giá qua thông báo lỗi :
4.3. Xác định số lượng cột trong mệnh đề Select
Khi khai thác Sql Injection, 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. Xét một ví dụ cụ thể :
16
Ở đây, trong mệnh đề select ban đầu chọn ra 3 trường là id, content và author. Do đó
mệnh đề select sau từ khóa union cũng cần phải có đúng 3 trường. 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ể
union, kiểu dữ liệu của các trường tương ứng phải thống nhất với nhau.
18
5. Một số tools khai thác
Hiện nay đã có rất nhiều công cụ quét lỗ hổng bảo mật (bao gồm SQL Injection).
Những công cụ này chủ yếu cho công việc phát hiện và đánh giá mức độ nguy hiểm
của các loại lỗ hổng chứ chưa có khả năng khai thác được xem có thể làm được gì từ
lỗ hổng đó. Một số công cụ khai thác tự động hay được sử dụng đó là :
The Mole
Sqlmap
Havij
6. Cách phòng chống
Ngay từ khái niệm, chúng ta đã có thể biết được cách phòng chống hiệu quả Sql
Injection chính là việc kiểm tra kỹ càng tham số đầu vào. Những tham số mà từ đó
người lập trình website sử dụng để build lên câu truy vấn tới cơ sở dữ liệu.
Công việc kiểm tra tham số đầu vào (áp dụng phòng tránh lỗi Sql Injection) nên
được tiến hành theo nhiều tầng :
Client: javascript (có thể bypass bằng các phần mềm tamper)
Server: C#, PHP, JSP…
Kiểm tra kiểu của dữ liệu : đối với dữ liệu kiểu số, kiểu chuỗi … chúng ta phải có
những hàm validate tương ứng:
Nếu là kiểu int
ASP.NET: Int32.Parse(/*Param*/);
PHP: is_numeric($var), is_int($var), is_integer($var)
Nếu là kiểu chuỗi
Thiết lập độ dài cần thiết
Lọc bỏ các kí tự nguy hiểm
Kiểm tra định dạng chuỗi: email, username, password, website…
Sử dụng các thư viện hỗ trợ
Phân quyền SQL
19
http://vi.wikipedia.org/wiki/SQL_Injection
http://sqlzoo.net/hack/
http://diendancnt
22