Bài giảng An ninh mạng - Bài 6: An toàn dịch vụ web SQL Injection - Bùi Trọng Tùng

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  
•
• Quản lý phiên  
2
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  
• Đ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
Giao thức HTTP  
• Sử dụng TCP, cổng 80  
Web clients  
IE  
• Trao đổi thông điệp HTTP  
(giao thức ứng dụng)  
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  
User-agent: Mozilla/4.0  
HEAD commands)  
Accept-language:en-us  
CR, LF  
(extra carriage return, line feed)  
indicates end  
of message  
6
3
Thông điệp HTTP Response  
status line  
(protocol  
HTTP/1.1 200 OK  
Connection close  
Date: Tue, 16 Mar 2008 12:00:15 GMT  
status code  
status phrase)  
Server: Apache/1.3.0 (Unix)  
Last-Modified: Mon, 15 Mar 2008 …...  
Content-Length: 8990  
header  
lines  
Content-Type: text/html  
data, e.g.,  
requested  
HTML file  
data data data data data ...  
7
Tương tác với web server  
• Địa chỉ URL  
//c/t
Giao thức  
Tên miền(sẽ được phân  
giải thành địa chỉ IP)  
dung tĩnh, thường là file HTML)  
8
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)  
Đường dẫn tới servlet, cho phép  
server sinh nội dung trang web tùy  
thuộc các tham số:  
Các tham số cho quá  
trình sinh nội dung  
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  
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  
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  
56  
60  
50  
47  
40  
29  
26  
24  
30  
20  
16  
15  
5
14  
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  
A-3  
…
Authentication  
and Session  
Management  
Đánh cắp mật khẩu, khóa, thẻ phiên, hoặc khai  
thác lỗ hổng để giả mạo người dùng  
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ình triển khai  
trọng, phân quyền truy cập không hợp lý…  
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  
Viện Công nghệ thông tin và Truyền thông,  
Đại học Bách khoa Hà Nội  
16  
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()  
…
$in = $_GET[‘exp'];  
Nội dung biểu thức được truyền  
qua đối số exp. Ví dụ:  
eval('$ans = ' . $in . ';');  
…
• Servlet thực thi như thế nào nếu truyền đối số như sau:  
17  
Command Injection – Ví dụ khác  
Client  
Server  
2. Send page  
<h2>Ping for FREE</h2>  
<p>Enter an IP address below:</p>  
<form name="ping" action="#" method="post">  
<input type="text" size="30">  
<input type="submit" value="submit" name="submit”>  
</form>  
Ô nhập dữ  
liệu  
18  
9
Command Injection – Ví dụ khác  
Client  
Server  
Send output  
…
$t = $_REQUEST[‘ip'];  
$o = shell_exec(‘ping –C 3’ . $t);  
echo $o  
…
PHP exec program  
<h2>Ping for FREE</h2>  
<p>Enter an IP address below:</p>  
<form name="ping" action="#" method="post">  
<input type="text" size="30">  
<input type="submit" value="submit" name="submit”>  
</form>  
19  
Command Injection – Ví dụ khác  
Client  
Server  
2. Send page  
…
$t = $_REQUEST[‘ip'];  
$o = shell_exec(‘ping –C 3’ . $t);  
PHP exec program  
20  
10  
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  
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ố:  
subject=foo < /usr/passwd; ls  
• Hoặc  
[email protected]&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  
• 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  
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
n  
vấn nằm  
ngoài dự  
kiến  
ngoài dự kiến  
Attacker  
Victim SQL DB  
26  
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  
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
ạn  
• 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  
15  
Cây cú pháp  
SELECT/ FROM/ WHERE  
AcctNum  
Customer  
OR  
AND  
=
<
=
1
1
Balance  
Username  
100  
‘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  
Thông báo lỗi có thể để lộ thông tin về CSDL!!!  
32  
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  
MySQL  
ASP  
No  
ASP.NET PHP  
es  
Yes  
Yes  
No  
PostgreSQL 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  
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=‘anyo--’  
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  
•
thường sử dụng các công cụ hỗ trợ (Ví dụ: sqlmap)  
36  
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ự  
đ
$user = 0x bf 27  
addslashes($user)  
Đầu ra: 0x bf 5c 27   
′
• Hàm tốt hơn: mysql_real_escape_string()  
38  
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  
d: tham số kiểu số thực  
• Sử dụng ORM framework  
39  
Cây cú pháp truy vấn SQL  
SELECT/ FROM/ WHERE  
Acc
<
=
Balance  
100  
Username  
?
40  
20  
Tải về để xem bản đầy đủ
pdf 21 trang baolam 18121 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng An ninh mạng - Bài 6: An toàn dịch vụ web SQL Injection - Bùi Trọng Tùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_an_ninh_mang_bai_6_an_toan_dich_vu_web_sql_injecti.pdf