(1) Value đƣợc lấy ra khỏi stack
(2) ESP=ESP++ kích thƣớc của giá trị
8.2.3. Cách làm việc của hàm
Một chƣơng trình đƣợc chia thành nhiều đoạn mã gọi là thủ tục (procedure). Mỗi thủ tục chịu trách nhiệm về một hành động nào đó của chƣơng trình. Mỗi thủ tục sau khi hoàn thành nhiệm vụ sẽ gọi thủ tục kế tiếp. Sau lời gọi một thủ tục, địa chỉ kế tiếp sau địa chỉ gọi thủ tục sẽ đƣợc lƣu vào trong STACK.
Nhƣ vậy địa chỉ sau địa chỉ gọi thủ tục đƣợc đƣa vào trong STACK. Khi thủ tục Q chuẩn bị hồn thành nhiệm vụ của mình và sẵn sàng quay trở về thì tiến trình nhận lại địa chỉ đã lƣu trƣớc đó ở STACK và khơi phục lại việc thực thi. Địa chỉ này đƣợc gọi là “saved return address”.
0x0012FF00 0x0012FF01 0x0012FF02 0x0012FF03 0x0012FF04----------------------------đỉnh Stack 0x0012FF05 0x0012FF06 0x0012FF07 0x0012FF08----------------------------đáy Stack …
0x401F2034 gọi thủ tục Q -> thủ tục Q đƣợc gọi để thực thi 0x401F2035
…
0x40209876 thủ tục Q …
0xFFFFFFFF
Khi lệnh tại địa chỉ 0x401F2034 đƣợc thực thi thì khơng gian địa chỉ nhƣ sau: 0x0012FF00----------------------------đỉnh Stack 0x0012FF01 40 0x0012FF02 1F 0x0012FF03 20 0x0012FF04 35 0x0012FF05 0x0012FF06 0x0012FF07 0x0012FF08----------------------------đáy Stack …. …
Ghi chú:
Thanh ghi EIP luôn trỏ đến địa chỉ của câu lệnh tiếp theo cần thi hành Ví dụ:
Thì return address sẽ trỏ tới vị trí của lệnh gọi tới hàm printf trong bộ nhớ, và khi hàm strcpy kết thúc thì con trỏ lệnh sẽ chỉ tới đó.
8.2.4. Shell code
Cần phải thay đổi địa chỉ trở về trỏ đến shellcode để đổ một shell. Có thể hình dung ra cách đặt shellcode trên stack nhƣ sau:
- Trƣớc khi tràn bộ đệm:
- Khi tràn bộ đệm:
Lắp tràn bộ đệm (đến return addr) bằng địa chỉ của buffer Đặt shellcode vào buffer
strcpy(one,two); printf("Okie\n");
Đáy của bộ nhớ Đỉnh của bộ nhớ
<----- FFFFF BBBBBBBBBBBBBBBBBBBBB EEEE RRRR FFFFFFFFFF
Đỉnh của stack Đáy của stack
B = buffer
E = stack frame pointer R = return address F = các data khác
Đáy của bộ nhớ Đỉnh của bộ nhớ
<----- FFFFF SSSSSSSSSSSSSSSSSSSSSSSSSAAAAAAAAFFFFFFFFF
Đỉnh của stack Đáy của stack
S = shellcode
A = con trỏ đến shellcode F = các data khác
Nhƣ vậy địa chỉ trở về sẽ trỏ đến shellcode, shellcode sẽ đổ một root shell. Tuy nhiên, thật khó để làm cho ret addr trỏ đến đúng shellcode. Một cách có thể thực hiện đƣợc cơng việc khó khăn đó, là đặt vào đầu của buffer một dãy lệnh NOP(NO oPeration - khơng xử lí), tiếp theo đẩy shellcode vào sau NOPs. Nhƣ vậy khi thay đổi ret addr trỏ đến một nơi này đó ở đầu buffer, các lệnh NOP sẽ đƣợc thi hành, chúng khơng làm gì cả. Đến khi gặp các lệnh shellcode, shellcode sẽ làm nhiệm vụ đổ root shell. Stack có dạng nhƣ sau:
8.3. Một số cách gây tràn bộ đệm qua ứng dụng web
Các bƣớc cơ bản của kỹ thuật tràn bộ đệm là: chuẩn bị bộ đệm dùng để làm tràn, xác định địa chỉ trả về (RET), xác định địa chỉ của bộ đệm chứa shellcode, cuối cùng gọi thực thi chƣơng trình bị tràn bộ đệm.
Thơng qua những ô nhập dữ liệu hacker có thể sử dụng một chuỗi string nhị phân có khả năng thực thi đoạn lệnh trên máy đích hoặc phá vỡ hệ thống do phải xử lí dữ liệu quá dài, vƣợt khả năng cho phép của hệ thống ( có thể nói cách này cũng là cách tấn công DoS). Thông thƣờng đoạn mã rất đơn giản, ví dụ nhƣ exec(“sh”) để tạo ra một root shell.
Một ví dụ về cách tấn cơng buffer overflow qua Web là Code Red Worm.
8.4. Các cách phòng chống
Ngƣời thiết kế Web cần phải kiểm tra kĩ kích thƣớc dữ liệu trƣớc khi sử dụng.
Đáy của bộ nhớ Đỉnh của bộ nhớ
<----- FFFFF
NNNNNNNNNNNSSSSSSSSSSSSSSAAAAAAAAFFFFFFFFF
Đỉnh của stack Đáy của stack
N = NOP S = shellcode
A = con trỏ đến shellcode F = các data khác
Dùng Referer trong HTTP Header để kiểm tra yêu cầu có phải xuất phát từ máy ngƣời dùng
Nhận xét:
Đây là kĩ thuật tấn công đi sâu vào phần hệ thống nhất, đòi hỏi hacker là ngƣời hiểu sâu về tổ chức bộ nhớ cũng nhƣ về ngơn ngữ lập trình Assembly. Tuy nhiên, điều này chỉ đòi hỏi nếu hacker muốn điều khiển hệ thống. Nếu chỉ sửa đổi nội dung kích thƣớc ơ nhập để từ đó đƣa lên trình chủ một khối dữ liệu lớn để hệ thống có thể bị phá hủy vì khơng đủ dung lƣợng đáp ứng việc yêu cầu xử lí khối dữ liệu đó.
CHƢƠNG IV: XÂY DỰNG ỨNG DỤNG ĐÁNH GIÁ AN TỒN WEBSITE
1. ĐẶC TẢ CHƢƠNG TRÌNH 1.1. Tổng quan
Chƣơng trình “Đánh giá an tồn website” là một ứng dụng dùng để đánh giá bảo mật của website, nhằm hỗ trợ cho các nhà quản trị web và các lập trình viên phát triển web có thể kiểm tra và phát hiện các lỗ hổng bảo mật mà tin tặc có thể khai thác tấn cơng.
Từ ý tƣởng đó, chƣơng trình sẽ có khả năng kiểm tra ứng dụng web có mắc phải các lỗi bảo mật hay không. Bằng cách, ứng dụng sẽ nhận địa chỉ trang web cần kiểm tra từ ngƣời dùng, rồi tự động tìm thơng tin của trang Web và tạo ra các yêu cầu gửi đến máy chủ. Sau đó nhận, phân tích kết quả trả về để đánh giá, kiểm tra và thông báo cho ngƣời sử dụng, đồng thời đƣa ra những lời khuyên cho ngƣời sử dụng sửa chữa website của mình.
1.2. Yêu cầu
Từ những ý tƣởng trên, ứng dụng có những yêu cầu sau:
1.2.1. Yêu cầu chức năng
- Chức năng quét toàn bộ nội dung của của website - Kiểm tra, phát hiện các lỗ hổng bảo mật của website
- Phân loại các lỗ hổng tìm đƣợc và thơng báo kết quả kiểm tra
- Đối với các lỗ hổng phát hiện đƣợc, đƣa ra lời khuyên để khắc phục - Cho phép mở file bị lỗi, nếu ngƣời dùng cung cấp source code.
1.2.2. Yêu cầu phi chức năng
chƣơng trình cho phép quét tự động toàn bộ nội dung của website. - Úng dụng phải cung cấp một giao diện trực quan, rõ ràng, dễ sử dụng.
2. KIẾN TRÚC CHƢƠNG TRÌNH 2.1. Kiến trúc
Chƣơng trình đƣợc chia làm hai tầng: - Tầng 1(giao diện): Có nhiệm vụ
+ Quét nội dung website: Có chức năng là thu nhận địa chỉ trang web và quét tất cả các page của website.
+ Hiển thị kết quả kiểm tra: Khi có kết quả xử lý thì hiển thị lên giao diện chính cho ngƣời dùng xem kết quả.
- Tầng 2 (xử lý): Có nhiệm vụ
+ Phân tích thơng tin nhận đƣợc.
+ Tạo các mẫu thử (lấy dữ liệu kiểm tra kết hợp với thông tin từ trang web, đóng gói thành http request) gửi đến máy chủ.