20/04/2014
BÀI 7.
AN TOÀN DỊCH VỤ WEB
Bùi Trọng Tùng,
Viện Công nghệ thông tin và Truyền thông,
Đại học Bách khoa Hà Nội
1
Nội dung
• Tổng quan về hoạt động của dịch vụ Web
• Giao thức HTTPS và các lỗ hổng
• Tấn công dạng Command Injection
• Tấn công Cross Site Scripting
• Tấn công Cross Site Request Forgery
2
1
20/04/2014
1. TỔNG QUAN VỀ DỊCH VỤ WEB
Bùi Trọng Tùng,
Viện Công nghệ thông tin và Truyền thông,
Đại học Bách khoa Hà Nội
3
Word Wide Web
• Ra đời năm 1990
• Hệ thống các siêu văn bản trình bày bằng ngôn ngữ
•
•
•
•
HTML được liên kết với nhau
Cho phép truy cập đến nhiều dạng tài nguyên thông tin
khác nhau (văn bản, hình ảnh, âm thanh, video...) qua
URL (Uniform Resource Location) và URI (Uniform
Resource Identifier)
Đang được điều hành bởi W3C
Các công nghệ liên quan: CSS, XML, JavaScrips, Adobe
Flash, Silverlight...
Hiện tại đã trở thành nền tảng (Web-based service)
4
2
20/04/2014
Giao thức HTTP
• Sử dụng TCP, cổng 80
Web clients
• Trao đổi thông điệp HTTP
(giao thức ứng dụng)
IE
HTTP Request
Web
server
HTTP Response
Firefox
Navigator
5
Thông điệp HTTP Request
• Mã ASCII (dễ dàng đọc được dưới dạng văn bản)
request line
(GET, POST,
HEAD commands)
GET /dccn/index.html HTTP/1.1
Host: www.it-hut.edu.vn
User-agent: Mozilla/4.0
header Connection: close
lines Accept-language:en-us
CR, LF
(extra carriage return, line feed)
indicates end
of message
6
3
20/04/2014
Thông điệp HTTP Response
status line
(protocol
status code
status phrase)
header
lines
data, e.g.,
requested
HTML file
HTTP/1.1 200 OK
Connection close
Date: Tue, 16 Mar 2008 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Mon, 15 Mar 2008 …...
Content-Length: 8990
Content-Type: text/html
data data data data data ...
7
Tương tác với web server
• Địa chỉ URL
/>Giao thức
Tên miền(sẽ được phân
giải thành địa chỉ IP)
Đường dẫn tới tài nguyên (nội
dung tĩnh, thường là file HTML)
8
4
20/04/2014
Tương tác với web server (tiếp)
• Tương tác với các kịch bản được thực thi trên server
(servlet)
/>Đường dẫn tới serlet, cho phép server
sinh nội dung trang web tùy thuộc các
tham số:
CGI: Common Gateway Interface
PHP, JSP, ASP: ngôn ngữ kịch bản
(scrips)
Các tham số cho quá
trình sinh nội dung
9
Kiến trúc chung của các dịch vụ web
URL/Form
Browser
Người dùng có thể
tương tác với các tài
nguyên khác thông
qua dịch vụ web
command.php?
arg1=x&arg2=y
Trang web có
nội dung
tương ứng với
các tham số đã
truyền qua
URL
Thực thi kịch
bản (servlet)
Web server
Kết quả
truy vấn
Truy vấn
CSDL
theo
tham số
Database
server
10
5
20/04/2014
HTTP Cookie
• Đoạn dữ liệu được chuyển từ Web server cho trình duyệt
• Chứa một số thông tin về phiên truy cập
• Cookie được trình duyệt sử dụng lại trong các phiên truy
cập sau
• Cũng áp dụng chính sách same-origin
GET …
Browser
Server
HTTP Header:
Set-cookie: NAME=VALUE ;
domain = ;
scope
path = ;
secure = ; //chỉ sử dụng cho HTTPS?
expires = ;…
11
Javascript
• Ngôn ngữ cho phép xây dựng các script để trình duyệt
thực thi
• Được nhúng vào các trang web mà server trả về cho
client
• Khi được thực thi, Javascrip có thể:
Thay đổi nội dung trang web
Theo dõi các sự kiện trên trang web (bao gồm cả hành vi của
người dùng: rê chuột, nhấp chuột, gõ phím)
Đọc, thiết lập cookie
Sinh các HTTP Request khác và đọc HTTP Response trả về
• Khả năng truy cập các đối tượng DOM của Javascript
được giới hạn bởi chính sách cùng nguồn (Same Origin
Policy – SOP)
12
6
20/04/2014
Chính sách cùng nguồn (SOP)
• DOM: Document Object
Window Obj
Model
Tổ chức các đối tượng, sự kiện
của trang HTML thành kiến trúc
cây
Cung cấp các hàm cho phép
tương tác với các đối tượng, sự
kiện
• SOP: các DOM có cùng (URI
scheme, domain, port) có thể
truy cập lẫn nhau.
URI_scheme://domain:port/path
• Lưu ý: SOP là chính sách cho
trình duyệt Web, không phải
cho server
Document Obj
Event
Frame
History
Location
Navigator
Screen
13
SOP – Ví dụ
Kiểm tra khả năng truy cập từ
/>Compared URL
Outcome
httpː//www.example.com/dir/page2.html
Success
httpː//www.example.com/dir2/other.html
Success
httpː//username:/dir2/other.html
Success
httpː//www.example.com:81/dir/other.html
Failure
/>
Failure
/>
Failure
/>
Failure
/>
Failure
httpː//www.example.com:80/dir/other.html
Depends
14
7
20/04/2014
Các nguy cơ đối với dịch vụ web
• Nghe lén, đánh cắp thông tin
• Thay đổi nội dung thông điệp
• Giả mạo (người dùng với dịch vụ và ngược lại)
• Tấn công chèn mã thực thi (Command Injection)
• Tấn công qua lỗ hổng của cơ chế thực thi kịch bản
• Phát tán mã độc, phần mềm độc hại
• Tấn công từ chối dịch vụ
15
1. GIAO THỨC HTTPS
Bùi Trọng Tùng,
Viện Công nghệ thông tin và Truyền thông,
Đại học Bách khoa Hà Nội
16
8
20/04/2014
Giới thiệu chung về HTTPS
• Hạn chế của HTTP:
Không có cơ chế để người dùng kiểm tra tính tin cậy của Web
server lỗ hổng để kẻ tấn công giả mạo dịch vụ hoặc chèn mã
độc vào trang web HTML
Không có cơ chế mã mật lỗ hổng để kẻ tấn công nghe lén đánh
cắp thông tin nhạy cảm
• Secure HTTP: Kết hợp HTTP và SSL/TLS:
Xác thực
Bảo mật
17
Thiết lập liên kết SSL/TLS
Chứng thư số
server
browser
client-hello
cert
Xác minh server-hello + server-cert (chứa khóa KUS)
servercert
Private
key
Thỏa thuận thông số trao đổi khóa
Sinh
khóa bí
mật KS
Trao đổi khóa: E(KUS, KS)
KS
Thiết lập xong kết nối TLS
Thông điệp HTTP được mã hóa với KS
18
9
20/04/2014
HTTP trên trình duyệt Web
Truy cập dịch vụ Web với HTTP
Khi click vào liên kết...
19
HTTPS trên trình duyệt Web
Truy cập Web với HTTPS
- Toàn bộ nội dung website (bao gồm
hình ảnh, CSS, Flash, scripts...) đã
được trình duyệt thẩm tra tính toàn vẹn
và nguồn gốc tin cậy.
- Mọi thông tin trao đổi giữa trình duyệt
và Amazon được giữ bí mật.
20
10
20/04/2014
Tại sao HTTPS an toàn?
• Chặn bắt dữ liệu
• Chèn mã độc vào nội dung website khi truyền từ server
tới trình duyệt web
• Tấn công DNS cache poisioning
Client truy cập vào Web server của kẻ tấn công
• Tấn công DHCP Spoofing
Client truy cập vào Web server của kẻ tấn công
• Tấn công định tuyến để chuyển hướng truy cập
• Tấn công man-in-the-middle
• Tấn công phát lại
21
Quá trình xác minh chứng thư số
• Bước 1: Trình duyệt so sánh tên miền trong chứng thư số
và tên miền trên địa chỉ URL
• Bước 2: Trình duyệt kiểm tra thời gian hiệu lực của chứng
thư số
• Bước 3: Trình duyệt kiểm tra chứng thư số gốc của CA
chứng thực cho server
Để xem các chứng thư số gốc trên trình duyệt Firefox
OptionsAdvancedView CertificatesAuthorities
• Bước 4: Trình duyệt sử dụng chứng thư số gốc của CA
để thẩm tra chữ ký số trên chứng thư của server
22
11
20/04/2014
Không tìm thấy chứng thư số gốc
Còn an toàn
không khi người
dùng chấp nhận
cảnh báo?
23
Tấn công vào HTTPS
• Tấn công sslstrip: lợi dụng lỗ hổng chuyển từ truy cập
qua HTTP sang truy cập qua HTTPS (như thế nào?)
Truy cập dịch vụ Web với HTTP
Khi click vào liên kết để chuyển
sang trang truy cập bằng HHTPS
24
12
20/04/2014
Tấn công sslstrip
HTTP
SSL
attacker
web
server
<a href=https://…>
<a href=http://…>
Location: https://...
Location: http://... (redirect)
<form action=https://… > <form action=http://…>
• Các trang có lỗ hổng này: amazon.com, ebay.com, 8/10 ngân
hàng lớn nhất Việt Nam (Agribank, Vietinbank, Vietcombank,
BiDV, ACB bank...)
25
Tấn công sslstrip
• Thậm chí, trên các website hỗ trợ đầy đủ HTTPS, nhưng
có thể lợi dụng người dùng không cập nhật trình duyệt
phiên bản mới
• Xóa cookie bằng cách chèn header “set-cookie” người
dùng bắt buộc đăng nhập lại
Phần lớn không phát hiện HTTPS HTTP
26
13
20/04/2014
Tấn công vào HTTPS
• Tấn công lợi dụng website không được chứng thực đầy
đủ: trong nội dung trang web truy cập qua HTTPS chứa
nội dung có thể truy cập qua HTTP. Ví dụ:
<script src=“http://.../script.js>
<img src=“http://.../script.gif>
• Sửa như thế nào?
27
Tấn công lợi dụng website không được
chứng thực đầy đủ-Ví dụ
28
14
20/04/2014
Tấn công vào HTTPS
• Người dùng sử dụng phiên bản trình duyệt không an toàn
chứng thư gốc bị thay thế
• Sử dụng CA giả mạo để phát hành chứng thư giả mạo
GET
BadguyCert
ClientHello
attacker
BankCert
ClientHello
bank
ServerCert (Bank)
ServerCert (rogue)
(cert for Bank by a valid CA)
SSL key exchange
k1
SSL key exchange
k1
HTTP data enc with k1
k2
k2
HTTP data enc with k2
29
Phòng chống chứng thư số giả mạo
• Sử dụng hệ thống công bố chứng thư số gốc tin cậy:
Google lưu trữ trên DNS Google
• Giao thức “Certificate Transparency” cho phép CA công
bố toàn bộ bản ghi nhật ký (log) về các chứng thư đã phát
hành
• Giao thức OCSP (Online Certificate Status Protocol)
30
15
20/04/2014
Tấn công phishing
• Homograph attack: Lợi dụng hình dáng giống nhau của
một số ký tự. Ví dụ: vvesternbank, paypai, paypail,
paypa1...
• Semantic attack: lợi dụng các trình duyệt cũ không phân
biệt các dấu đặc biệt trên tên miền. Ví dụ: Kẻ tấn công có
thể mua tên miền badguy.cn và sử dụng tên miền con
www.bank.com/accounts/login.php?q=me.badguy.cn
• Phòng chống: sử dụng chứng thư hỗ trợ chứng thực mở
rộng (Extended validation certificate)
31
Semantic attack (ví dụ)
32
16
20/04/2014
Tấn công phishing (tiếp)
• Picture-in-picture attack: dựng một frame chứa cửa sổ
giao diện của một website đã được chứng thực lợi
dụng người dùng bất cẩn không quan sát khi duyệt web
33
3. TẤN CÔNG DẠNG COMMAND
INJECTION
Bùi Trọng Tùng,
Viện Công nghệ thông tin và Truyền thông,
Đại học Bách khoa Hà Nội
34
17
20/04/2014
Command Injection
• Lợi dụng lỗ hổng không kiểm soát giá trị các đối số khi
thực thi kịch bản (servlet) trên web server
Không phân biệt các ký hiệu điều khiển (ký hiệu phép toán, dấu ; “
‘...) trong giá trị của đối số và trong câu lệnh
• Ví dụ: Website chứa servlet cung cấp tính năng tính toán
biểu thức bất kỳ qua hàm eval()
…
/>$in = $_GET[‘exp'];
Nội dung biểu thức được truyền eval('$ans = ' . $in . ';');
qua đối số exp. Ví dụ:
…
/>• Servlet thực thi như thế nào nếu truyền đối số như sau:
; system(‘rm *.*’)”
35
Command Injection – Ví dụ khác
• Mã PHP để gửi email:
$email = $_POST[“email”]
$subject = $_POST[“subject”]
system(“mail $email –s $subject < /tmp/joinmynetwork”)
• Chèn mã thực thi khi truyền giá trị cho đối số:
/>email= &
subject=foo < /usr/passwd; ls
• Hoặc
/>email=&subject=foo;
echo “evil::0:0:root:/:/bin/sh">>/etc/passwd; ls
36
18
20/04/2014
Phòng chống
• Kiểm tra, chỉ chấp nhận giá trị chứa các ký tự hợp lệ
Ký tự nào là hợp lệ?Phụ thuộc ngữ cảnh
• Sử dụng dấu ‘\’ đặt trước các ký tự đặc biệt
Nếu kẻ tấn công chèn trước ký tự ‘\’ ?
• Bỏ qua các ký tự đặc biệt
Nếu kẻ tấn công dùng mã ASCII?
Luôn có cách vượt qua kiểm tra
• Cách tốt hơn: không sử dụng các hàm có quá nhiều
quyền thực thi.
Không hiệu quả với SQL Injection
37
SQL Injection
• Mục tiêu: các website sử dụng CSDL ở back-end
• Lỗ hổng SQL Injection: không kiểm soát giá trị đối số
truyền cho các servlet khi thực hiện các truy vấn CSDL
Web server không phân biệt được các ký tự là của câu truy vấn
hay của giá trị truyền cho đối số
• Mục đích: sửa đổi hoặc chèn truy vấn con vào các truy
vấn thông thường để đọc trái phép hoặc thay thế thông
tin trên trang web
• Lỗ hổng phổ biến nhất trên các website
38
19
20/04/2014
SQL Injection – Ví dụ
• Xem xét đoạn mã PHP sau:
$recipient = $_GET[‘recipient’];
$sql = "SELECT AcctNum FROM Customer WHERE
Balance < 100 AND Username='$recipient'";
$rs = $db->executeQuery($sql);
• Giả sử đối số được truyền như sau “?recipient=Bob” câu
truy vấn được web server chuyển cho DBMS để thực thi
như sau:
SELECT AcctNum FROM Customer WHERE Balance < 100
AND Username=‘Bob’
• Kết quả nào được trả về với truy vấn sau:
SELECT AcctNum FROM Customer WHERE True
39
Phân tích truy vấn trên cây cú pháp
SELECT / FROM / WHERE
AcctNum
Customer
AND
<
Balance
=
100
Username
'Bob'
Kết quả truy vấn: Số tài khoản của tất cả khách hàng có
số dư dưới 100$ và tên khách hàng là Bob
40
20
20/04/2014
SQL Injection – Ví dụ (tiếp)
• Xem xét đoạn mã PHP sau:
$recipient = $_GET[‘recipient’];
$sql = "SELECT AcctNum FROM Customer WHERE
Balance < 100 AND Username='$recipient'";
$rs = $db->executeQuery($sql);
• Điều gì xảy ra nếu đối số được truyền giá trị làm thay đổi
ý nghĩa của câu truy vấn
Ví dụ truyền vào một giá trị đặc biệt ‘recipient’ để đọc toàn bộ
danh sách khách hàng
41
SQL Injection – Ví dụ (tiếp)
• Truyền đối số như sau:
?recipient=foo’ OR 1 = 1 -• Câu truy vấn được thực thi:
SELECT AcctNum FROM Customer WHERE Balance < 100
AND Username=‘foo’ OR 1 = 1 --’
Dấu -- báo hiệu đoạn
chú thích bỏ qua
• Biểu thức điều kiện trở thành
WHERE Balance < 100 AND Username=‘foo’ OR 1 = 1
luôn trả về giá trị TRUE
42
21
20/04/2014
Cây cú pháp
SELECT / FROM / WHERE
AcctNum
Customer
OR
AND
<
Balance
100
=
=
Username
1
1
‘foo’
43
SQL Injection – Ví dụ (tiếp)
• Truyền đối số như sau:
?recipient=foo’; DROP TABLE Customer -• Câu truy vấn được thực thi:
SELECT AcctNum FROM Customer WHERE Balance < 100
AND Username=‘foo’; DROP TABLE Customer --’
Chèn câu lệnh SQL khác để
can thiệp sửa đổi CSDL
Thậm chí có thể chèn vào một đoạn mã thực thi
kịch bản hệ thống (shell code)
44
22
20/04/2014
Phòng chống SQL Injection
• Thêm ký tự ‘\’ vào trước dấu nháy ‘...’ hoặc “...”
• PHP: addslashes( “ ’ or 1 = 1 --
Đầu ra:
”)
“ \’ or 1=1 -- ”
Hạn chế: tấn công dựa vào mã Unicode của một số ký tự
đặc biệt
0x 5c \
$user = 0x bf 27
addslashes($user)
0x bf 27 ¿′
Đầu ra: 0x bf 5c 27
′
0x bf 5c
• Hàm tốt hơn: mysql_real_escape_string()
45
Phòng chống SQL Injection
• Hầu hết các ngôn ngữ lập trình, DBMS hỗ trợ kiểm soát
các tham số trong câu truy vấn không hiểu lầm giá trị
tham số và mã thực thi.
• Ví dụ: PHP và MySQL
$dbh = new mysqli(…);
$stmt = $dbh->prepare(“SELECT AcctNum FROM Customer WHERE
Balance < 100 AND Username= ?”);
$recipient = $_GET[‘recipient’];
$stmt->bind_param(“s”, $recipient);
$stmt->execute();
s: tham số kiểu xâu ký tự
i: tham số kiểu số nguyên
d: tham số kiểu số thực
46
23
20/04/2014
Cây cú pháp truy vấn SQL
SELECT / FROM / WHERE
AcctNum
Customer
AND
<
Balance
=
100
Username
?
47
Cây cú pháp truy vấn SQL
?recipient=foo’ OR 1 = 1 -$stmt->bind_param(“s”, $recipient);
SELECT / FROM / WHERE
AcctNum
Customer
AND
<
Balance
=
100
Username
? 1 = 1 -foo’ OR
48
24
20/04/2014
3. TẤN CÔNG VÀO CƠ CHẾ
DÙNG COOKIE
Bùi Trọng Tùng,
Viện Công nghệ thông tin và Truyền thông,
Đại học Bách khoa Hà Nội
49
Nhắc lại về cookie
• Đoạn dữ liệu được chuyển từ Web server cho trình duyệt
• Chứa một số thông tin về phiên truy cập
• Cookie được trình duyệt sử dụng lại trong các phiên truy
cập sau
• Cũng áp dụng chính sách same-origin
GET …
Browser
Server
HTTP Header:
Set-cookie: NAME=VALUE ;
domain = ;
scope
path = ;
secure = ; //chỉ sử dụng cho HTTPS?
expires = ;…
50
25