TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP TĂNG CƯỜNG 1
MÔN PHÁT TRIỂN ỨNG DỤNG WEB
TÌM HIỂU CÁC VẤN ĐỀ BẢO MẬT
TRONG PHP (CÓ DEMO)
Người hướng dẫn: ThS VŨ ĐÌNH HỒNG
Người thực hiện: Lưu Đức Thông – 51303407
Trần Ngọc Quốc Phong - 51303365
Lớp
: 13050303
Khóa : 17
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2016
LỜI CẢM ƠN
Chúng em xin gửi lời cảm ơn chân thành đến ThS Vũ Đình Hồng, giảng
viên môn Phát triển Ứng dụng Web – trường Đại học Tôn Đức Thắng, người đã
tận tình hướng dẫn, chỉ bảo em trong suốt quá trình làm bài tập.
Chúng em cũng xin chân thành cảm ơn các thầy cô giáo trong trường Đại
học Tôn Đức Thắng nói chung, các thầy cô trong Bộ môn Mạng máy tính nói
riêng đã dạy dỗ cho chúng em kiến thức về các môn đại cương cũng như các môn
chuyên ngành, giúp chúng em em có được cơ sở lý thuyết vững vàng và tạo điều
kiện giúp đỡ chúng em trong suốt quá trình học tập.
Cuối cùng, chúng em xin chân thành cảm ơn gia đình và bạn bè, đã luôn
tạo điều kiện, quan tâm, giúp đỡ, động viên chúng em trong suốt quá trình học tập
và hoàn thành bài tập.
Thành phố Hồ Chí Minh, ngày 29 tháng 04 năm 2016
Sinh Viên Thực Hiện
Trần Ngọc Quốc Phong
Lưu Đức Thông
ĐỒ ÁN ĐƯỢC HOÀN THÀNH
TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi / chúng tôi và được
sự hướng dẫn của ThS Vũ Đình Hồng. Các nội dung nghiên cứu, kết quả trong
đề tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây.
Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá
được chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu
tham khảo.
Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số
liệu của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích
nguồn gốc.
Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách
nhiệm về nội dung đồ án của mình. Trường đại học Tôn Đức Thắng không liên
quan đến những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực
hiện (nếu có).
TP. Hồ Chí Minh, ngày 29 tháng 04 năm 2016
Tác giả
(ký tên và ghi rõ họ tên)
Trần Ngọc Quốc Phong
Lưu Đức Thông
PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
____________________________
Tp. Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
Phần đánh giá của GV chấm bài
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
_____________________________________________________
____________________________
Tp. Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
TÓM TẮT
Cùng với sự phát triển của công nghệ thông tin, công nghệ mạng máy tính
và sự phát triển của mạng internet ngày càng phát triển đa dạng và phong phú.
Các dịch vụ trên mạng đã thâm nhập vào hầu hết các lĩnh vực trong đời sống xã
hội. Các thông tin trên Internet cũng đa dạng về nội dung và hình thức, trong đó
có rất nhiều thông tin cần đuợc bảo mật cao hơn bởi tính kinh tế, tính chính xác
và tính tin cậy của nó.
Bên cạnh đó, các hình thức phá hoại mạng cũng trở nên tinh vi và phức tạp
hơn. Do đó đối với mỗi hệ thống, nhiệm vụ bảo mật đuợc đặt ra cho nguời quản
trị mạng là hết sức quan trọng và cần thiết. Xuất phát từ những thực tế đó, chúng
ta sẽ tim hiểu về các cách tấn công phổ biến nhất hiện nay và các phòng chống
các loại tấn công này.
Chính vì vậy, thông qua việc nghiên cứu một số phuơng pháp tấn công và
cách bảo mật các lọa tấn công này, chúng em mong muốn góp một phần nhỏ vào
việc nghiên cứu và tìm hiểu về các vấn đề an ninh mạng giúp cho việc học tập và
nghiên cứu.
Trong nội dung của bài này, chúng em sẽ trình bày những tìm hiểu về:
• SQL Injection (SQLi)
• Cross-site Scripting (XSS)
• Các phương pháp tấn công khác
Trong phần Demo, chúng em sẽ demo về tấn công SQL Injection trên thực
tế có Video chứng minh cụ thể.
Mục lục
CHƯƠNG 1: SQL INJECTION
1.1 Giới thiệu
SQL Injection là kiểu tấn công phổ biến hiện nay. Bằng cách chèn các mã
lệnh SQL vào cổng trước của website, bạn có thể đăng nhập mà không cần
username và password. Từ đó có thể điều khiển từ xa, dump dữ liệu và lấy root
của SQL server. Công cụ dùng để tấn công là một trình duyệt web bất kì. Ví dụ,
Internet Explore, Netscape, Lynx, Moxilla Firefox,Safari…
SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ
hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo
lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu
lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực
hiện các thao tác, delete, insert, update,… trên cơ sở dữ liệu của ứng dụng, thậm
chí là server mà ứng dụng đó đang chạy, lỗi này thường xảy ra trên các ứng dụng
web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server,
MySQL, Oracle, DB2, Sysbase...
1.2 Một số mệnh đề chung
1.2.1 Mệnh đề SQL
Hầu hết các kiểu tấn công SQL Injection hiện nay đều sử dụng mệnh đề
SQL. Attacker kiểm tra SQL bằng các mệnh đề WHERE hoặc kết hợp WHERE
với các mệnh đề UNION, INTERSECT, hoặc MINUS.
Qúa trình chứng thực đăng nhập trên website thường sử dụng câu lệnh:
Lợi dụng câu lệnh
trên, Attacker
sử dụng
mệnh
đề sau:username = ‘bob’ and
SELECT
* FROM
users
WHERE
PASSWORD = ‘mypassword’
Attacker lợi dụng lệnh UNION để thực thi mệnh đề SQL trong một hàng
của bảng khác. Ứng dụng web sử dụng truy vấn sau để trả về danh sách các mục
hiện có:
SELECT * FROM users WHERE username = ‘bob’ and
Attacker biến đổi truy vấn trên thành:
SELECT
all_products
WHERE
PASSWORD product_name
= ‘mypassword’FROM
or ‘a’
= ‘a’
Bạn có thể áp dụng cách tương tự để thực thi cho nhiều ứng dụng khác
product_name like ‘%Chairs%’
nhau.
SELECT
product_name
product_name
like
FROM
all_products
‘%Chairs%’
UNION
WHERE
SELECT
username FROM dba_users WHERE username like ‘%’
1.2.2 Mã Injection
Tấn công bằng mã Injection được thực hiện bằng cách thêm mệnh đề hoặc
các lệnh SQL vào đối tượng SQL đang tồn tại. Loại tấn công này được áp dụng
trên SQL Server. Mệnh đề EXECUTE thường được sử dụng cho kiểu tấn công này.
Nhiều ngôn ngữ lập trình cho phép mệnh đề SQL thực hiện. Như PL/SQL
hoặc Java, ta có thể thực hiện bằng khối nặc danh PL/SQL. Ví dụ sau sứ dụng
khối PL/SQL trên ứng dụng Web:
Attacker ứng dụng câu lệnh trên như sau:
BEGIN
ENCRYPT_PASSWORD(‘bob’,
BEGIN
DELETE
ENCRYPT_PASSWORD(‘bob’,
FROM
users
WHERE
‘mypassword’);
mypassword’)
;
upper(username)
=
upper(‘admin’); END;
1.2.3 Gọi hàm Injection
Phương pháp gọi hàm Injection thường được áp dụng trên cơ sở dữ liệu
của Oracle. Một số hàm của nó thường chứa những mệnh đề có điểm yếu rất cao.
Nó có thể được gọi để sử dụng bằng lời gọi hệ thống hoặc các mệnh đề trên dữ
liệu.
Các hàm được thực hiện là một phần của mệnh đề SELECT, nó không thể
tự thay đổi cơ sở dữ liệu trừ khi có hàm “PRAGMA TRANSACTION" được sử
dụng. Ngoài ra, để kiểm tra dữ liệu, bạn có thể sử dụng mệnh đề INSERT,
UPDATE hoặc DELETE.
Ví dụ:
SELECT TRANSLATE (‘user inout’,
Mệnh đề SQL trên không
có điểm yếu để dẫn tới những kiểu tấn công
‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,
Injection khác, nhưng nó dễ dàng
được thực hiện
thông
qua kiểu tấn công gọi
‘0123456789’)
FROM
dual;
hàm Injection. Attacker biến đổi mệnh đề SQL thành:
SELECT TRANSLATE
(‘’||
UTL_HTTP.REQUEST(‘http://192.168.1.1/’)
||
‘’,‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,‘01234
56789’) FROM dual;
Mệnh đề SQL được thay đổi, nó yêu cầu một website từ Web Server,
Attacker thực hiện trên URL và những hàm khác để tìm thông tin từ server cơ sở
dữ liệu.
Ví dụ,một ứng dụng có tên MYAPPADMIN, gọi hàm “PRAGMA
TRANSACTION" để ghi thông tin vào cơ sở dữ liệu ngay trong mệnh đề
SELECT.
SELECT
TRANSLATE
(‘’
||
myappadmin.
Thực hiện mệnh đề SQL trên,Attacker có thể tạo ra một ứng dụng người
adduser(‘admin’,
‘newpass’)
||
‘’,
dùng mới.
‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’,
1.3 Phương pháp phòng tránh
1.3.1 Kết buộc biến
‘0123456789’) FROM dual;
Cách tốt nhất để loại bỏ SQL Injection là sử dụng sự kết buộc giữa các
biến, nó được thực hiện trong việc lập trình ứng dụng. Mã ứng dụng chuẩn sẽ yêu
cầu sự kết buộc giữa tất cả các biến trong mệnh đề SQL. Không được sử dụng
mệnh đề SQL khi mà nó chỉ được tạo ra bằng việc ghép nối giữa các chuỗi và các
tham số.
Kết buộc giữa các biến được sử dụng cho mỗi mệnh đề SQL ở bất kỳ khi
nào và nơi nào mệnh đề SQL được gọi. Một cuộc tấn công SQL Injection phức
tạp sẽ có thể khai thác ứng dụng bằng việc lưu trữ một chuỗi tấn công trong cơ sở
dữ liệu mà nó sẽ được thực hiện sau mệnh đề SQL động.
1.3.2 Thông qua cổng đăng nhập
Tại mỗi cổng đăng nhập, lập trình viên phải luôn tạo ra các bẫy lỗi để ngăn
chặn những đăng nhập không hợp lệ. Loại bỏ những trích dẫn đơn. Các biến phải
được kết buộc chặt chẽ.
1.3.3 Hàm bảo mật
Các hàm cơ sở dữ liệu chuẩn có thể bị lợi dụng để tấn công SQL Injection.
Oracle có nhiều hàm chuẩn, được cung cấp mặc định trong thư viện PUBLIC, các
ứng dụng có thể thêm vào những hàm để thay đổi password hoặc tạo ra các users
phục vụ cho hình thức xâm nhập và tấn công. Ngoài ra, tất cả những chức năng
không cần thiết phải được hạn chế trong ứng dụng.
1.3.4 Các thông điệp báo lỗi
Nếu một Attacker không xem được mã nguồn của ứng dụng thì những
thông báo lỗi sẽ trở nên nguy hiểm và tạo cơ hội cho Attacker tấn công hệ thống.
Chính vì vậy hầu hết các ứng dụng Java không đưa ra chi tiết những thông báo
lỗi.
1.3.5 Lọc các ký tự đặc biệt
Sử dụng hàm sau để lọc các ký tự đặc biệt để xử lý đầu vào.
Function RemoveBad(strTemp){
strTemp=
strTemp.replace
(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\
+|\-/g,"");
return strTemp;
1.3.6 Ngăn chặn MySQL Injection trong PHP
Đặc biệt đối với MySQL và PHP, chúng ta có thể xây dựng một hàm riêng
để truyền an toàn hơn các câu truy vấn SQL.
Lưu ý: File này đã được đính kèm trong thư mục
SourceCode/sqlsafe.php
function sql_safe($value,$allow_wildcards = true,
$detect_numeric = true)
{
$return_value = clone $value;
if(get_magic_quotes_gpc())
{
if(ini_get('magic_quotes_sybase'))
{
$return_value = str_replace("''","'",
$return_value);
}else{
$return_value =
stripslashes($return_value);
}
}
if(!$allow_wildcards)
{
$return_value = str_replace('%','\%',
$return_value);
$return_value = str_replace('_','\_',
$return_value);
}
if($detect_numeric)
{
if(!is_numeric($return_value))
CHƯƠNG 2: Cross-site Scripting (XSS)
2.1 Giới thiệu
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 (theo thống kê OWASP TOP 10 2013), đồ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 nguời sử dụng web. Bất kì một website nào cho phép nguờ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.
Mã Cross – Site (Cross –Site Scripting) được viết tắt XSS (thay vì viết tắt
là CSS để tránh nhằm lẫn với CSS-Cascading Style Sheet của HTML) là một kỹ
thuật tấn công bằng cách chèn vào Website động (ASP, PHP, CGI, JSP…) các thẻ
HTML hay những đoạn mã script nguy hiểm có thể gậy hại cho người sử dụng
khác. Trong đó, những đoạn mã nguy hiểm được viết bằng các ngôn ngữ như:
JavaScript, JScript, DHTML và cũng có thể là cả các thẻ HTML.
XSS cho phép Attacker chèn các đoạn mã vào liên kết của đường dẫn, để
thực thi trên trình duyệt của người dùng, dẫn đến việc mất cookie, mật khẩu,
session hay fishing lừa đảo hay chèn virus,…
Xuất hiện khi Attacker sử dụng ứng dụng Web để gửi các mã nguy hiểm,
phương thức thường được sử dụng là JavaScript. Các cuộc tấn công được bắt
nguồn ở những nơi mà các đoạn mã được chèn vào, ví dụ như: Cơ sở dữ liệu của
Server mục tiêu hay thông điệp mail.
Từ việc thu thập các thông tin ở Cookie của người dùng, Attacker có thể sẽ
lấy được thông tin tài khoản hay phân tích những tập tin được Trojan gửi về từ
những người dùng bị theo dõi. Attacker sẽ sửa đổi nội dung của các tập tin này và
sử dụng cho mục đích xâm nhập.
Kiểu tấn công này thường nhằm vào: Web Server, Server ứng dụng và các
ứng dụng Web.
2.2 Phân tích một kịch bản (scenario) tấn công XSS
1. Hacker nhận thấy Website xsecurity nào đó đang chứa các lỗi về mã cross
– site.
2. Hacker gửi một email và yêu cầu người dùng nhấp vào một liên kết nào đó
để nhận giải thưởng hay một thông tin nào đó đang được quan tâm (sử
dụng mồi nhử bằng cách gửi thư rác).
3. Một URL từ xsecurity có thể như sau:
4. Khi người dùng nhấp vào liên kết này Website sẽ rất thân thiện chào đón,
xxx.xsecurity.com/default.php?
nhưng thay vì hiển thị thông tin, Website hiển thị thông báo “Chào mừng
name=<script>evilScript()</script>
bạn quay lại!”.
5. Chuyện gì đã xảy ra với tên của bạn? Bằng cách nhấp vào liên kết trong
mail, bạn đã nói cho Website xsecurity rằng tên của bạn là
6. Web Server“<script>evilScript()</script>”.
đã sinh ra HTML với “tên của bạn” được đính kèm và gửi
đến trình duyệt.
7. Trình duyệt biên dịch đúng nội dung của đoạn mã và chạy nó.
8. Nếu đoạn mã này bảo trình duyệt gửi những thông tin lưu trong Cookie
của người dùng đến máy tính của hacker thì nó cũng thực hiện một cách
nhanh chóng.
9. Sau cùng,thông tin về Cookie của nạn nhân sẽ được xsecurity sở hữu.
2.3 Phương pháp phòng tránh
− Bạn phải luôn xác nhận tính hợp lệ của tất cả các headers, cookies, các
chuỗi truy vấn,các trường form, các trường ẩn. Tuyệt đối không duyệt
bất kỳ một thông báo nào nếu không biết rõ nguồn gốc.
− Áp dụng các chính sách bảo mật nghiêm ngặt.
− Lọc các Scripts ở đầu ra hay ngăn chặn trực tiếp các XSS truyền tải đến
người dùng.
CHƯƠNG 3: CÁC HÌNH THỨC TẤN CÔNG KHÁC
3.1 Khai thác Cookie
3.1.1 Giới thiệu
Khi Cookie bị nhiễm một đoạn mã nguy hiểm hay một chương trình gián
điệp nào đó thì Attacker có thể khai thác các thông tin được gửi về và sử dụng
những thông tin này để thâm nhập hay tấn công mục tiêu một cách hợp lệ.
3.1.2 Phương pháp phòng tránh
Có một số cách để hạn chế những thông tin bị mất do Cookie bị khai thác
như sau:
− Không lưu trữ dữ liệu dưới dạng rõ ràng, tức là Password hay
những thông tin nhạy cảm phải được mã hóa trong Cookie.
− Loại bỏ Cookie khi không còn dùng đến nữa.
− Cookie phải được ủy nhiệm cho địa chỉ IP thích hợp.
3.2 Duyệt thư mục (Local File Disclosure)
3.2.1 Giới thiệu
Là kiểu tấn công xuất hiện khi Attacker có khả năng duyệt các thư mục và
tập tin hơn mức truy cập ứng dụng thông thường. Tấn công sẽ để lộ ra cấu trúc
thư mục của ứng dụng và thường xảy ra ở Web Server và hệ điều hành.
Attacker có thể thống kê nội dung truy cập các trang nhạy cảm và lấy
những thông tin bảo mật, xác định mã nguồn, chỉnh sửa nội dung Website,…
3.2.2 Phương pháp phòng tránh
− Định nghĩa các nguồn truy cập để các vùng trên Website được bảo
vệ.
− Nhanh chóng vá các lỗi Unicode về duyệt thư mục.
− Web Server luôn phải cập nhật kịp thời để vá các lỗi mới được phát
hiện
TÀI LIỆU THAM KHẢO
1. Từng bước khám phá an ninh mạng (2) – Vũ Đình Cường – trang 121
2. Cách thức tấn công và bảo mật website
3. XSS Cơ Bản – Mark - NBTA