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

Web clients

• Sử dụng TCP, cổng 80 • Trao đổi thông điệp HTTP

IE

Web

(giao thức ứng dụng) HTTP Request 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, HEAD commands)

header lines GET /dccn/index.html HTTP/1.1 Host: www.it-hut.edu.vn User-agent: Mozilla/4.0 Connection: close 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 status phrase)

header lines

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 ...

data, e.g., 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

Các tham số cho quá trình sinh nội dung

Đường dẫn tới servlet, 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)

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)

70

56

47

29 26 24

16 15 11

8

6

6

6

5

80 70 60 50 40 30 20 10 0

14

CuuDuongThanCong.com

https://fb.com/tailieudientucntt

7

2013 OWASP Top10 Project

Tên

Mô tả

Injection

A-1

Cho phép chèn dữ liệu ác tính vào câu lệnh hoặc truy vấn

A-2

Đá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

Authentication and Session 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

Để lộ file, thư mục chứa thông tin cấu hình quan trọng, phân quyền truy cập không hợp lý…

Các lỗ hổng xuất hiện trong quá 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 ; “

• Ví dụ: Website chứa servlet cung cấp tính năng tính toán

‘...) trong giá trị của đối số và trong câu lệnh

biểu thức bất kỳ qua hàm eval() http://site.com/calc.php Nội dung biểu thức được truyền 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 *.*’)”

… $in = $_GET[‘exp']; eval('$ans = ' . $in . ';'); …

17

Command Injection – Ví dụ khác

1. http://site.com/exec/

Client

Server

2. Send page

Ping for FREE

Ô nhập dữ liệu

Enter an IP address below:

>/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

• 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

hay của giá trị truyền cho đối số

25

Kịch bản tấn công SQL Injection

Victim Server

1

2

3 Trả lại dữ liệu nằm ngoài dự kiến Attacker

Thực hiện câu truy 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

< =

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

Balance 100 Username '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;#’

• 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

Dấu # báo hiệu đoạn chú thích bỏ qua

30

CuuDuongThanCong.com

https://fb.com/tailieudientucntt

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

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!!!

công

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

Thông báo lỗi có thể để lộ thông tin về CSDL!!!

bảng, đoán tên cột

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ề

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)

True/False

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 -- ”

0x 5c  \

Hạn chế: tấn công dựa vào mã Unicode của một số ký tự đặc biệt $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ử dụng ORM framework

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

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

Cây cú pháp truy vấn SQL

?recipient=anyone’ OR 1 = 1 --

$stmt->bind_param(“s”, $recipient);

SELECT / FROM / WHERE

AcctNum Customer AND

< =

Balance 100 Username ? anyone’ OR 1 = 1 --

41

Bài giảng sử dụng một số hình vẽ và ví dụ từ các bài giảng: • Computer and Network Security, Stanford University • Computer Security, Berkeley University • Introduction to Computer Security, Carnegie Mellon

University

42

CuuDuongThanCong.com

https://fb.com/tailieudientucntt

21