Trong các phương pháp kiểm thử bảo mật, Fuzzing là một kỹ thuật quan trọng giúp phát hiện lỗ hổng phần mềm bằng cách tự động cung cấp các dữ liệu đầu vào bất thường hoặc không hợp lệ
Trang 1HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA AN TOÀN THÔNG TIN
-
BÁO CÁO MÔN HỌC KỸ THUẬT LẬP TRÌNH
ĐỀ TÀI KIỂM THỬ FUZZING ÁP DỤNG TRONG KIỂM TRA LỖ HỔNG BẢO MẬT WEB
Nhóm thực hiện: NHÓM 7 Sinh viên thực hiện: CÀ THỊ ÁI LINH – AT190129
PHAN ĐỨC BA – AT190306 NGUYỄN VŨ HÀ – AT190318 NGUYỄN MINH NHẬT – AT190338
Hà Nội - 2025
Trang 2MỤC LỤC
DANH MỤC KÍ HIỆU VÀ TỪ VIẾT TẮT 3
DANH MỤC HÌNH VẼ 4
MỞ ĐẦU 7
CHƯƠNG 1 TỔNG QUAN LỖ HỔNG BẢO MẬT WEB VÀ KỸ THUẬT KIỂM THỬ FUZZING 10
1.1 Các tổng quan cơ bản 10
1.1.1 Ứng dụng web 10
1.1.2 Lỗ hổng bảo mật 14
1.1.3 Lỗ hổng bảo mật website 14
1.1.4 Kiểm thử phần mềm 15
1.1.5 Kiểm thử website 17
1.2 Kỹ thuật Fuzzing trong việc kiểm thử phần mềm 18
1.2.1 Khái niệm về Fuzzing 18
1.2.2 Lịch sử phát triển của kiểm thử Fuzzing 18
1.2.3 Các loại kiểm thử Fuzzing 18
1.2.4 Ưu - nhược điểm của kiểm thử Fuzzing 19
1.2.5 Các lỗ hổng được phát hiện bởi Fuzzing 20
1.2.6 Công cụ hỗ trợ kiểm thử Fuzzing 21
1.2.7 Ứng dụng thực tế của Fuzzing trong bảo mật thông tin 21
1.2.8 Kiểm thử ứng dụng website bằng Fuzzing 22
1.3 Lựa chọn Fuzzing cho kiểm tra lỗ hổng ứng dụng web 23
1.4 Tổng kết chương 1 23
Trang 3CHƯƠNG 2: NGHIÊN CỨU KỸ THUẬT FUZZING TRONG KIỂM THỬ ỨNG
DỤNG WEB 24
2.1 Mô hình Fuzzing cho ứng dụng website 24
2.1.1 Mô hình Fuzzing 24
2.1.2 Quy trình Fuzzing trong kiểm thử lỗ hổng bảo mật website 25
2.2 Một số kịch bản thực nghiệm với Fuzzing 28
2.2.1 Kiểm thử lỗ hổng Cross-site Scripting (XSS) 28
2.2.2 Kiểm thử lỗ hổng SQL Injection 29
2.3 Tổng kết chương 2 31
CHƯƠNG 3: THỰC NGHIỆM VỀ QUÁ TRÌNH FUZZING TRONG KIỂM THỬ ỨNG DỤNG WEB 32
3.1 Xây dựng chương trình 32
3.2 Triển khai thực nghiệm 38
3.2.1 Kiểm thử lỗ hổng SQL Injection sử dụng kỹ thuật Fuzzing 38
3.2.2 Kiểm thử lỗ hổng Cross-site Scripting (XSS) sử dụng kỹ thuật Fuzzing 59
3.3 Đánh giá thực nghiệm 92
3.4 Tổng kết chương 3 92
KẾT LUẬN 94
TÀI LIỆU THAM KHẢO 96
BẢNG PHÂN CÔNG CÔNG VIỆC 98
Trang 4DANH MỤC KÍ HIỆU VÀ TỪ VIẾT TẮT
Từ viết tắt Nghĩa Tiếng Anh Nghĩa Tiếng Việt
HTTP Hypertext Transfer Protocol Giao thức truyền siêu văn bản TCP Transmission Control Protocol Giao thức truyền TCP
HTML Hypertext Markup Language Ngôn ngữ đánh dấu siêu văn bản XML Extensible Markup Language Ngôn ngữ đánh dấu mở rộng SSL Secure Sockets Layer Lớp bảo mật socket
XSS Cross Script Site Lỗ hổng XSS
CSRF Cross - Site Request Forgery Lỗ hổng CSRF
URL Uniform Resource Locator Địa chỉ tài nguyên
RFI Remote File Inclusion Lỗ hổng RFI
LFI Local File Inclusion Lỗ hổng LFI
OWASP The Open Web Application
Security Project
Dự án nghiên cứu bảo mật ứng dụng web
GUI Graphical User Interface Giao diện đồ họa người dùng
Trang 5DANH MỤC HÌNH VẼ
Hình 1: Mô hình hoạt động của ứng dụng web 12
Hình 2: Kiểm thử hộp đen 16
Hình 3: Kiểm thử hộp trắng 16
Hình 4: Kiểm thử hộp xám 17
Hình 5: Mô hình Fuzzing cho ứng dụng web tổng quát 24
Hình 6: Quy trình Fuzzing 25
Hình 7: Cấu hình DVWA 34
Hình 8: Trạng thái của MySQL 34
Hình 9: Đăng nhập vào MySQL với quyền root 35
Hình 10: Trạng thái của Apache2 36
Hình 11: Truy vấn danh sách người dùng MySQL 37
Hình 12: Chỉnh sửa file cấu hình DVWA 37
Hình 13: Giao diện trang đăng nhập web DVWA 37
Hình 14: DVWA Security 38
Hình 15: Ô nhập User ID của trang web có mức độ bảo mật thấp 39
Hình 16: Các Request được thực hiện 39
Hình 17: Nơi có thể truyền payload của Burp Suite 39
Hình 18: Trạng thái của trang web 40
Hình 19: Hiển thị tên database và phiên bản của database 40
Hình 20: Ô chọn User ID của trang web có mức độ bảo mật trung bình 41
Hình 21: Burp Suite Repeater kiểm tra yêu cầu và phản hồi 41
Trang 6Hình 22: Burp Suite gửi payload SQL Injection trên trang web có mức bảo mật
trung bình 42
Hình 23: Giao diện trang web được bảo mật ở mức độ thấp 42
Hình 24: Giao diện web được bảo mật ở mức độ trung bình 43
Hình 25: Kết quả kiểm thử SQLi ở mức độ bảo mật thấp (1) 53
Hình 26: Kết quả kiểm thử SQLi ở mức độ bảo mật thấp (2) 54
Hình 27: Kết quả kiểm thử SQLi ở mức độ bảo mật trung bình (1) 55
Hình 28: Kết quả kiểm thử SQLi ở mức độ bảo mật trung bình (2) 55
Hình 29: Kết quả kiểm thử SQLi ở mức độ bảo mật trung bình (3) 56
Hình 30: Kết quả kiểm thử SQLi ở mức độ bảo mật trung bình (4) 56
Hình 31: Các bảng trong CSDL 57
Hình 32: Các thuộc tính trong bảng users 57
Hình 33: Các dữ liệu trong bảng users 58
Hình 34: Giải mã mật khẩu 58
Hình 35: Giao diện trang web có chứa lỗ hổng Reflected XSS 59
Hình 36: Ô nhập dữ liệu trong trang web có chứa lỗ hổng Reflected XSS 60
Hình 37: Kết quả khi chạy đoạn code Fuzzer 70
Hình 38: Kiểm tra lỗ hổng Reflected XSS với mức độ bảo mật thấp (1) 71
Hình 39: Kiểm tra lỗ hổng Reflected XSS với mức độ bảo mật thấp (2) 72
Hình 40: Kiểm tra lỗ hổng Reflected XSS với mức độ bảo mật trung bình (1) 73
Hình 41: Kiểm tra lỗ hổng Reflected XSS với mức độ bảo mật trung bình (2) 73
Hình 42: Kiểm tra lỗ hổng Reflected XSS với mức độ bảo mật cao (1) 74
Hình 43: Kiểm tra lỗ hổng Reflected XSS với mức độ bảo mật cao (2) 74
Trang 7Hình 44: Sử dụng hàm alert 75
Hình 45: Sử dụng thẻ button 75
Hình 46: Sử dụng onmouseover là một HTML Attribute 75
Hình 47: Truy cập đến địa chỉ của người dùng 76
Hình 48: Giao diện trang web chứa lỗ hổng DOM Based XSS 78
Hình 49: Kiểm tra lỗ hổng Dom Based XSS với mức độ bảo mật thấp (1) 87
Hình 50: Kiểm tra lỗ hổng Dom Based XSS với mức độ bảo mật thấp (2) 87
Hình 51: Kiểm tra lỗ hổng Dom Based XSS với mức độ bảo mật trung bình 88
Hình 52: Kiểm tra lỗ hổng Dom Based XSS với mức độ bảo mật cao 89
Hình 53: Chèn mã chứa sự kiện alert 90
Hình 54: Truy cập đến địa chỉ của người dùng 91
Trang 8MỞ ĐẦU
1 LÝ DO CHỌN ĐỀ TÀI
Trong thời đại công nghệ thông tin phát triển mạnh mẽ, máy tính và Internet trở nên phổ biến, kéo theo nhu cầu về bảo mật ngày càng cao Sự gia tăng của các thiết bị kết nối mạng và dịch vụ trực tuyến đã tạo điều kiện cho các cuộc tấn công mạng trở nên đa dạng và phức tạp hơn, gây thách thức lớn cho công tác đảm bảo
an toàn thông tin (ATTT)
Cùng với đó, thiết kế và phát triển website ngày càng quan trọng trong nhiều lĩnh vực như thương mại điện tử, giải trí và truyền thông Tuy nhiên, phần lớn các cuộc tấn công mạng hiện nay đều khai thác lỗ hổng bảo mật trên website, khiến việc kiểm thử bảo mật trở thành một yêu cầu thiết yếu Việc kiểm thử kỹ lưỡng giúp phát hiện và khắc phục các lỗi về tính năng, bảo mật, tích hợp hệ thống cũng như khả năng xử lý lưu lượng truy cập trước khi website đi vào hoạt động
Trong các phương pháp kiểm thử bảo mật, Fuzzing là một kỹ thuật quan trọng giúp phát hiện lỗ hổng phần mềm bằng cách tự động cung cấp các dữ liệu đầu vào bất thường hoặc không hợp lệ để kiểm tra khả năng phản hồi của hệ thống Fuzzing đặc biệt hiệu quả trong việc tìm ra các lỗ hổng như SQL Injection, Cross-Site Scripting (XSS), Buffer Overflow… mà không cần chuyên sâu về lập trình
Xuất phát từ thực tế này, nhóm em đã lựa chọn đề tài “Kiểm thử Fuzzing áp dụng trong kiểm tra lỗ hổng bảo mật web” để nghiên cứu và báo cáo Do thời gian
và kiến thức còn hạn chế, chắc chắn sẽ có thiếu sót, nhóm em rất mong nhận được
sự góp ý của giảng viên để hoàn thiện bài báo cáo tốt hơn
Trang 92 MỤC TIÊU NGHIÊN CỨU
Mục tiêu đặt ra khi thực hiện đề tài:
- Nghiên cứu tổng quan về các lỗ hổng bảo mật phổ biến trên ứng dụng web
- Tìm hiểu về kỹ thuật Fuzzing và ứng dụng trong kiểm thử bảo mật phần mềm
- Xây dựng mô hình thử nghiệm Fuzzing trên một số ứng dụng web cụ thể
- Đề xuất giải pháp bảo mật dựa trên kết quả kiểm thử
3 NHIỆM VỤ NGHIÊN CỨU
Nhiệm vụ nghiên cứu của đồ án gồm các nội dung sau:
- Nhiệm vụ 1: Tìm hiểu tổng quan về website, phương thức và mô hình hoạt động của website
- Nhiệm vụ 2: Nghiên cứu các lỗ hổng bảo mật website, cách thức tấn công và biện pháp phòng chống
- Nhiệm vụ 3: Tìm hiểu tổng quan về các phương pháp kiểm thử phần mềm nói chung
và kỹ thuật Fuzzing trong kiểm thử lỗ hổng bảo mật website nói riêng
- Nhiệm vụ 4: Nghiên cứu kỹ thuật lập trình bất đồng bộ trên ngôn ngữ Python nhằm tăng tốc độ truy vấn lấy toàn bộ nội dung website, đồng thời trích xuất liên kết và xây dựng lại cấu trúc một website
- Nhiệm vụ 5: Xây dựng ứng dụng kiểm tra lỗ hổng bảo mật website dựa trên cơ sở các nội dung nghiên cứu trước nhằm phát hiện lỗ hổng tồn tại website, đồng thời đưa ra các khuyến nghị và cách thức khắc phục cho từng loại lỗ hổng
Trang 11CHƯƠNG 1: TỔNG QUAN LỖ HỔNG BẢO MẬT WEB VÀ KỸ THUẬT
KIỂM THỬ FUZZING 1.1 Các tổng quan cơ bản
1.1.1 Ứng dụng web
Website là một tập hợp các trang web, thường chỉ nằm trong một tên miền hoặc tên miền phụ trên World Wide Web của Internet Một trang web là tập tin HTML hoặc XHTML có thể truy nhập dùng giao thức HTTP Website có thể được xây dựng từ các tệp tin HTML (website tĩnh) hoặc vận hành bằng các CMS chạy trên máy chủ (website động) Website có thể được xây dựng bằng nhiều ngôn ngữ lập trình khác nhau (PHP, NET, Java, Ruby on Rails…)
Một Website thường được bao gồm bởi các thành phần:
- Source code: Mã nguồn website, chứa tệp lệnh trích xuất HTML Để dễ hình dung, ở đây xem như mã nguồn là một phần mềm hoàn chỉnh nó được cài đặt lên web server/hosting của bạn, nó như công cụ để tạo lập và quản lý nội dung website
- Hosting: Bộ nhớ lưu trữ website
- Database: Dữ liệu nội dung website
- Domain: Tên miền của website, thực chất một website không cần đến tên miền nó vẫn
có thể hoạt động bình thường vì nó có địa chỉ IP Bản chất của tên miền là nó được ánh
xạ sang địa chỉ IP thông qua máy chủ DNS, tạo ra sự đơn giản cho người dùng dễ dàng truy cập vào web thông qua tên miền, thay vì phải nhớ địa chỉ IP của website
- Ứ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
- Web client là một trình duyệt web như: Internet Explorer, Chrome, FireFox hay có thể
là một chương trình có chức năng như một trình duyệt web Người dùng có thể gửi, nhận các dữ liệu từ máy chủ thông qua việc trao đổi luồng thông tin với web server và hiển thị nội dung trang web nhận được trên trình duyệt Các ứng dụng web này có thể
Trang 12là các trang cổng thông tin điện tử, trao đổi thông tin, mua bán, các diễn đàn, các trang gửi nhận thư,
Kiến trúc thông thường của một ứng dụng web bao gồm các lớp:
- Lớp trình diễn: Lớp này có chức năng hiển thị dữ liệu mà nó nhận được từ web server cho người dùng, ngoài ra còn có thể có chức năng tạo bố cục và giao diện cho trang web
- Lớp ứng dụng: Đây là nơi xử lý của ứng dụng web Nó sẽ xử lý thông tin yêu cầu từ người dùng, đưa ra quyết định, gửi kết quả đến lớp trình diễn Lớp này thường được cài đặt bằng các kỹ thuật lập trình dựa trên các ngôn ngữ như CGI, Java, NET, PHP,
và được triển khai trên host hoặc trên các dịch vụ của máy chủ như Apache của Linux, IIS của Windows Server,…
- Lớp dữ liệu: Lớp này là các hệ quản trị dữ liệu SQL như MySQL, SQL Server, Oracle, chịu tránh nhiệm quản lý các file dữ liệu và quyền sử dụng dữ liệu của toàn
bộ website Thường được triển khai trực tiếp trên cùng hoặc tách biệt riêng với web server
Việc phân lớp trong kiến trúc web tạo ra các hoạt động đơn giản nhưng có liên kết chặt chẽ giữa các lớp Nó giúp cho người quản trị dễ dàng triển khai, vận hành và chủ động trong phòng, chống các cuộc tấn công Ví dụ như lớp ứng dụng có lỗi nhưng hệ thống, cơ sở dữ liệu được cấu hình đảm bảo thì hacker khó có thể khai thác và làm ảnh hưởng tới hệ thống Hoạt động của một ứng dụng web là sự tương tác giữa web client với web server Dưới đây là mô hình hoạt động của một ứng dụng web:
Trang 13Hình 1: Mô hình hoạt động của ứng dụng web Một giải pháp dùng để bảo vệ hệ thống mạng thường được sử dụng là tường lửa (firewall), nó có vai trò như lớp rào chắn bên ngoài một hệ thống mạng, vì chức năng chính của firewall là kiểm soát luồng thông tin giữa các máy tính Có thể xem firewall như một bộ lọc thông tin, nó xác định và cho phép một máy tính này có được truy xuất đến một máy tính khác hay không, hay một mạng này có được truy xuất đến mạng kia hay không Người ta thường dùng firewall vào mục đích:
o Cho phép hoặc cấm các dịch vụ truy xuất ra ngoài
o Cho phép quy định cấm các hay cho phép dịch vụ từ bên ngoài truy xuất vào trong
o Kiểm soát địa chỉ truy nhập, cấm địa chỉ truy nhập
Firewall hoạt động dựa trên góp IP do đó kiểm soát được việc truy cập máy tính của người sử dụng
Mô tả hoạt động của website
Trang 14- Trình duyệt tạo một HTTP Request gửi máy chủ web thông qua các phương thức GET, POST,… của giao thức HTTP, yêu cầu cung cấp hoặc xử lý tài nguyên thông tin Địa chỉ của tài nguyên yêu cầu được xác định trong định dạng URL
- Sau khi nhận được truy vấn từ trình khách, máy chủ web xác định sự tồn tại của tài nguyên được yêu cầu
o Nếu yêu cầu can thiếp các quyền truy cập của tài nguyên thì máy chủ web từ chối truy vấn và trả về cảnh báo thích hợp
o Nếu yêu cầu là hợp lệ, lúc này máy chủ có thể cho thực thi một chương trình được xây dựng từ ngôn ngữ như Perl, C/C++,… hoặc máy chủ yêu cầu bộ biên dịch thực thi các trang PHP, ASP, JSP,… theo yêu cầu của máy khách
- Tùy 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 thông tin do máy khách gửi đến
- Khi máy chủ web định danh được tài nguyên, nó thực hiện hành động chỉ ra trong request method và tạo ra response trả về cho máy khách 1 luồng dữ liệu có định dạng theo giao thức HTTP, nó gồm 2 phần:
o 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
o 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ì
- Khi giao dịch hoàn tất, máy chủ web thực hiện ghi vào tệp tin nhật ký mô tả giao dịch vừa thực hiện
- Với Firewall, luồng thông tin giữa máy chủ và máy khách là luồng thông tin hợp lệ
Vì thế, nếu hacker tìm thấy vài lỗ hổng trong ứng dụng Web thì Firewall không còn hữu dụng trong việc ngăn chặn hacker này Do đó, các kỹ thuật tấn công vào một hệ thống mạng ngày nay đang dần tập trung vào những sơ suất (hay lỗ hổng) trong quá trình tạo ứng dụng của những nhà phát triển Web hơn là tấn công trực tiếp vào hệ thống mạng, hệ điều hành Tuy nhiên, hacker cũng có thể lợi dụng các lỗ hổng Web để mở rộng sự tấn công của mình vào các hệ thống không liên quan khác
Trang 151.1.2 Lỗ hổng bảo mật
Lỗ hổng bảo mật trên một hệ thống là các điểm yếu có thể tạo ra sự ngưng trệ của dịch vụ, thêm quyền đối với người sử dụng hoặc cho phép các truy nhập không hợp pháp vào hệ thống Các lỗ hổng cũng có thể nằm ngay các dịch vụ cung cấp như sendmail, web, ftp … Ngoài ra các lỗ hổng còn tồn tại ngay chính tại hệ điều hành như trong Windows
XP, Windows NT, UNIX; hoặc trong các ứng dụng mà người sử dụng thường xuyên sử dụng như Word processing, Các hệ databases…
Có thể nói lỗ hổng bảo mật là những điểm yếu trên hệ thống hoặc ẩn chứa trong một dịch vụ mà dựa vào đó kẻ tấn công có thể xâm nhập trái phép để thực hiện các hành động phá hoại hay chiếm đoạt các tài nguyên hợp pháp
Nguyên nhân gây ra lỗ hổng bảo mật là khác nhau:
- Do lỗi của bản thân hệ thống
- Do phần mềm cung cấp hoặc do người lập trình
- Do người quản trị yếu kém không hiểu sâu sắc các dịch vụ cung cấp
1.1.3 Lỗ hổng bảo mật website
Lỗ hổng website là những điểm yếu của hệ thống website mà tin tặc có thể lợi dụng
để khai thác nhằm thu thập thông tin về hệ thống, tấn công lấy cắp thông tin, tấn công vào người dùng hệ thống hay tấn công chiếm quyền điều khiển hệ thống website
Nguyên nhân gây ra lỗ hổng bảo mật website:
- Lỗi do người lập trình, ứng dụng không có thành phần kiểm tra hay kiểm tra yếu các
dữ liệu đầu vào từ người dùng, từ đó, kẻ tấn công có thể lợi dụng lỗ hổng từ mã nguồn
để khai thác và tấn công hệ thống
Trang 16- Lỗi do người quản trị cấu hình hệ thống yếu, cấu hình hệ thống mặc định, tài khoản mặc định, không thường xuyên cập nhật phiên bản mới cho các dịch vụ triển khai trên
Kiểm thử phần mềm là một tiến trình hay một tập hợp các tiến trình được thiết kế
và thực hiện nhằm tìm kiếm và phát hiện ra các lỗi của phần mềm đảm bảo cho hệ thống thực hiện theo đúng những yêu cầu mà chúng đã được thiết kế và không thực hiện những điều không mong Kiểm thử phần mềm là một pha quan trọng trong quá trình xây dựng
và phát triển hệ thống, chúng giúp cho người phát triển hệ thống và các khách hàng thấy được hệ thống mới đã đáp ứng các yêu cầu đặt ra
Các phương pháp kiểm thử phần mềm có thể chia làm 3 loại:
- Kiểm thử hộp đen (Black box testing): là một phương pháp kiểm thử phần mềm được
thực hiện mà không biết được cấu tạo bên trong của phần mềm, là cách mà các tester kiểm tra xem hệ thống như một chiếc hộp đen, không có cách nào nhìn thấy bên trong của cái hộp
o Còn được gọi là kiểm thử hướng dữ liệu hay là kiểm thử hướng in/out
o Người kiểm thử nên xây dựng các nhóm giá trị đầu vào mà sẽ thực thi đầy đủ tất cả các yêu cầu chức năng của chương trình
Trang 17Hình 2: Kiểm thử hộp đen
- Kiểm thử hộp trắng (White box testing): Là phương pháp kiểm thử trái ngược hoàn
toàn với kiểm thử hộp đen, nó cho phép kiểm tra cấu trúc bên trong của một phần mềm với mục đích đảm bảo rằng tất cả các mã lệnh, thuật toán và điều kiện sẽ được thực hiện ít nhất 1 lần Kiểm thử hộp trắng bao gồm phân tích dòng dữ liệu, điều khiển dòng, dòng thông tin, mã thực hành, ngoại lệ và những lỗi trình bày trong hệ thống để kiểm tra những hành động của phần mềm không được định hướng trước
Hình 3: Kiểm thử hộp trắng
- Kiểm thử hộp xám (Gray box testing): Là sự kết hợp của kiểm thử hộp đen và hộp
trắng Trong kiểm thử hộp xám, cấu trúc bên trong sản phẩm chỉ được biết một phần,
Trang 18người kiểm thử có thể truy cập vào cấu trúc dữ liệu bên trong và thuật toán của chương trình với mục đích là để thiết kế đầu vào, nhưng khi kiểm tra thì như ở mức hộp đen
Hình 4: Kiểm thử hộp xám
1.1.5 Kiểm thử website
Kiểm thử website là một thành phần trong kiểm thử phần mềm nhưng tập trung vào các ứng dụng web, nhằm đảm bảo các ứng dụng web hoạt động một cách hiệu quả, chính xác và đáp ứng được nhu cầu của khách hàng Hiện nay, nó đang là một trong những thành phần đang phát triển nhanh nhất của kiểm thử phần mềm
Hoàn thành quá trình kiểm thử của một hệ thống web trước khi đi vào hoạt động là bước đầu để có được sự đảm bảo về khả năng các ứng dụng được xây dựng trên trang web đang hoạt động đúng Nó giúp giải quyết các vấn đề như tính sẵn sàng, toàn vẹn, bảo mật của hệ thống web, đáp ứng cho số lượng ngày càng tăng cao người sử dụng và khả năng sống sót trong lưu lượng truy cập của người dùng Việc bỏ qua các vấn đề trong kiểm thử trước khi đi vào hoạt động có thể ảnh hưởng đến khả năng hoạt động của chính website
đó
Sau khi thực hiện kiểm thử web, kiểm thử viên có thể tìm thấy các sự cố trong hệ thống trước khi chúng xảy ra trong môi trường người dùng
Trang 191.2 Kỹ thuật Fuzzing trong việc kiểm thử phần mềm
1.2.1 Khái niệm về Fuzzing
Fuzzing là một kỹ thuật phát hiện lỗi của phần mềm bằng cách tự động hoặc bán tự động sử dụng phương pháp lặp lại thao tác sinh dữ liệu sau đó chuyển cho hệ thống xử lý
Fuzzing cung cấp dữ liệu đầu vào cho chương trình (là các dữ liệu không hợp lệ,
dữ liệu không mong đợi: các giá trị vượt quá biên, các giá trị đặc biệt có ảnh hưởng tới phần xử lý, hiển thị của chương trình), sau đó theo dõi và ghi lại các lỗi, các kết quả trả
về của ứng dụng trong quá trình xử lý của chương trình
Fuzzing là một trong những kỹ thuật của kiểm thử hộp đen không đòi hỏi quyền truy cập vào mã nguồn Do nó có khả năng tìm thấy lỗi một cách nhanh chóng và tránh được việc phải xem mã nguồn
Các chương trình và framework được dùng để tạo ra kỹ thuật Fuzzing hoặc thực hiện Fuzzing được gọi là Fuzzer Tùy theo môi trường và ứng dụng cần kiểm tra mà người
ta có các phương án khác nhau để xây dựng Fuzzer
1.2.2 Lịch sử phát triển của kiểm thử Fuzzing
Fuzzing bắt đầu được sử dụng vào cuối những năm 1980 bởi Barton Miller tại Đại học Wisconsin-Madison Kể từ đó, nó trở thành một kỹ thuật quan trọng trong kiểm thử bảo mật, giúp phát hiện nhiều lỗ hổ nghiêm trọng trong hệ thống phần mềm và hạ tầng mạng
1.2.3 Các loại kiểm thử Fuzzing
Các kỹ thuật Fuzzing khác nhau có cách tạo hoặc thay đổi dữ liệu đầu vào khác nhau Sau đây là một số kỹ thuật phổ biến nhất
Trang 20- Black-box Fuzzing liên quan đến việc tạo ngẫu nhiên dữ liệu đầu vào mà không có
bất kỳ kiến thức nào về cấu trúc bên trong của hệ thống đang được thử nghiệm Mặc
dù loại Fuzzing này có thể tạo ra một lượng lớn dữ liệu đầu vào, nhưng nó có thể không hiệu quả trong việc tìm ra các lỗi và lỗ hổng phức tạp
- White-box Fuzzing liên quan đến việc tạo dữ liệu đầu vào dựa trên phân tích mã
nguồn của hệ thống Phương pháp này có thể tạo ra dữ liệu đầu vào có mục tiêu và liên quan hơn Black-box Fuzzing và tìm ra các lỗi và lỗ hổng phức tạp hơn
- Grey-box Fuzzing là sự kết hợp giữa Black-box và White-box Fuzzing, cân bằng giữa
hiệu quả và hiệu suất Loại Fuzzing này tạo ra dữ liệu đầu vào dựa trên kiến thức một phần về hệ thống đang được thử nghiệm
- Kiểm tra Fuzzing dựa trên đột biến kiểm tra khả năng chịu đựng hoặc xử lý lỗi của hệ thống đối với các biến thể nhỏ hoặc phổ biến của dữ liệu đầu vào Dữ liệu
đầu vào được tạo ra bằng cách sửa đổi dữ liệu đầu vào hợp lệ, mẫu, trước đó hoặc dữ liệu đầu vào hiện có khác Đột biến được thực hiện bằng cách thay đổi, xóa, chèn hoặc hoán đổi bit, byte hoặc khối dữ liệu
- Kiểm tra Fuzzing dựa trên thế hệ kiểm tra tính tuân thủ hoặc khả năng tương thích của hệ thống với các định dạng dữ liệu đầu vào khác nhau hoặc mới Dữ liệu
đầu vào được tạo từ đầu bởi trình tạo số ngẫu nhiên, mô hình hoặc mẫu
- Fuzzing hướng dẫn theo phạm vi phủ sóng có thể tiết lộ hiệu quả các điểm yếu bảo mật tiềm ẩn của hệ thống, chẳng hạn như lỗi hỏng bộ nhớ hoặc lỗi logic Kỹ
thuật kiểm tra này tối đa hóa phạm vi phủ sóng của mã bằng cách liên tục tạo và thay đổi dữ liệu đầu vào và ưu tiên các đầu vào dẫn đến các khu vực chưa được khám phá trước đó của mã
1.2.4 Ưu - nhược điểm của kiểm thử Fuzzing
a) Ưu điểm
Trang 21o Kiểm thử Fuzzing giúp tìm thấy những lỗi nghiêm trọng nhất về bảo mật hoặc khiếm khuyết
o Kết quả sử dụng kiểm thử Fuzzing hiệu quả hơn khi sử dụng các phương pháp kiểm thử khác
o Kiểm thử Fuzzing cải thiện vấn đề về an ninh khi kiểm tra phần mềm
o Lỗi được tìm thấy bằng Fuzzing đôi khi nghiêm trọng và hầu hết là những lỗi mà tin tặc hay sử dụng Trong đó có crashes, rò rỉ bộ nhớ, unhandled exception, vv
o Những lỗi không được tìm thấy khi kiểm thử bị hạn chế về thời gian và nguồn lực thì cũng được kiểm thử Fuzzing tìm ra
o Fuzzing không cung cấp nhiều kiến thức về hoạt động nội bộ của các phần mềm
o Với chương trình có các đầu vào phức tạp đòi hỏi phải tốn thời gian hơn để tạo ra một fuzzer đủ thông minh
1.2.5 Các lỗ hổng được phát hiện bởi Fuzzing
Một số lỗ hổng được phát hiện bởi Fuzzing
o Tràn bộ nhớ (Buffer Overflow)
o Lỗ hổng truy vấn SQL (SQL Injection)
o Tài nguyên không hồi phục (Memory Leak)
o Lỗ hổng cho phép chèn mã độc hại (XSS)
o Lỗ hổng trong xử lý dữ liệu
Trang 221.2.6 Công cụ hỗ trợ kiểm thử Fuzzing
Các công cụ được sử dụng trong bảo mật web có thể được sử dụng rộng rãi trong các thử nghiệm Fuzzing như:
- Peach Fuzzer: cung cấp phạm vi bảo mật mạnh mẽ và bảo mật hơn so với scanner
Các công cụ kiểm tra khác chỉ có thể tìm kiếm các chủ đề đã biết trong khi Peach Fuzzer cho phép người dùng tìm cả các chủ đề đã biết và chưa biết
- Proxy Spike: là một công cụ cấp chuyên nghiệp tìm kiếm các lỗ hổng cấp ứng dụng
trong các ứng dụng web SPIKE Proxy bao gồm các vấn đề cơ bản, chẳng hạn như SQL Injection và cross-site-scripting, nhưng nó hoàn toàn là cơ sở hạ tầng Python mở SPIKE Proxy có sẵn cho Linux và Windows
- Webscarab: được viết bằng Java do đó di động với nhiều nền tảng Để phân tích ứng
dụng, khung công tác Webscarab được sử dụng để giao tiếp sử dụng giao thức HTTP
và HTTPS
- Burp: được sử dụng như một công cụ bảo mật cho ứng dụng web java Burp được sử
dụng để xử lý các cuộc tấn công chống lại các ứng dụng bao gồm kiểm tra các lỗ hổng ứng dụng web như tràn bộ đệm, kịch bản lệnh cross-site, chèn SQL,…
- OWASP WSFuzzer: là một chương trình GPL được viết bằng Python Chương trình
GPL hiện đang nhắm mục tiêu các Dịch vụ Web Trong phiên bản hiện tại của OWASPWSFuzzer, các dịch vụ SOAP dựa trên HTTP là mục tiêu chính
- AppScan: quét và kiểm tra tất cả các lỗ hổng ứng dụng web phổ biến như
SQL-Injection, Cross-Site Scripting và Buffer Overflow
1.2.7 Ứng dụng thực tế của Fuzzing trong bảo mật thông tin
Fuzzing có thể được áp dụng cho một số hệ thống phần mềm và thành phần xử lý
dữ liệu đầu vào của người dùng:
Trang 23- Ứng dụng, thư viện và API Kiểm thử Fuzz có thể xác định lỗi xác thực đầu vào, rò rỉ
bộ nhớ và sử dụng sai API trong các thành phần phần mềm Để kiểm thử, hãy sử dụng công cụ để nhập dữ liệu ngẫu nhiên hoặc không đúng định dạng vào giao diện của ứng dụng, thư viện hoặc API và theo dõi các sự cố và hành vi không mong muốn
- Hệ điều hành Fuzzing có thể giúp tìm ra tình trạng leo thang đặc quyền, tình trạng chạy đua và rò rỉ bộ nhớ Để kiểm tra, hãy gửi dữ liệu đến hạt nhân, lệnh gọi hệ thống
và trình điều khiển của hệ điều hành
- Giao thức mạng Sử dụng Fuzzing để giúp phát hiện tràn bộ đệm, hỏng bộ nhớ và giả mạo gói tin Để kiểm tra, hãy gửi đầu vào đến giao diện, ngăn xếp và ứng dụng của mạng
- Định dạng tệp Kiểm thử Fuzz có thể xác định lỗi tràn heap, tràn stack và lỗ hổng chuỗi định dạng Để kiểm tra, hãy gửi dữ liệu đến trình phân tích cú pháp tệp, trình xem và
bộ xử lý
- Ứng dụng web và trình duyệt Sử dụng Fuzzing để phát hiện các lỗ hổng có thể khiến ứng dụng web, máy chủ hoặc trình duyệt dễ bị tấn công bằng mã lệnh chéo trang (XSS), tiêm SQL, thực thi mã từ xa hoặc tấn công mạng từ chối dịch vụ (DoS) Để kiểm tra, hãy sử dụng một công cụ tự động để nhập dữ liệu ngẫu nhiên vào các trường của ứng dụng web hoặc trình duyệt và theo dõi các sự cố hoặc hành vi bất ngờ
1.2.8 Kiểm thử ứng dụng website bằng Fuzzing
Fuzzing là một kỹ thuật được áp dụng rất nhiều trong kiểm thử các vấn đề về an ninh trong các phần mềm , hệ thống máy tính và các dịch vụ website Ngoài ra Fuzzing còn là một cách phổ biến nhất được hacker sử dụng để tìm lỗ hổng của hệ thống Hệ thống Fuzzing sẽ gửi dữ liệu fuzz lên sever chứa website hoặc truy cập thẳng vào website đó kèm theo dữ liệu gây lỗi , nhận dữ liệu từ website trả về và đưa vào bộ phân tích trước khi đưa ra kết luận về lỗ hổng
Trang 241.3 Lựa chọn Fuzzing cho kiểm tra lỗ hổng ứng dụng web
Lựa chọn Fuzzing, kiểm thử hộp đen để xây dựng ứng dụng quét lỗ hổng website,
ta có thể quét bất kì website nào mà không phụ thuộc vào công nghệ hoặc ngôn ngữ lập trình nó đang sử dụng Nó được sử dụng để kiểm thử một trang web mà không cần biết cách trang web đó làm việc, giống như một kẻ tấn công thực sự Nên khi các quản trị viên , những người trực tiếp quản lý và theo dõi tình hình hoạt động của trang web giúp ngăn chặn hành vi tấn công từ hacker
1.4 Tổng kết chương 1
Chương đầu tiên nhóm em đã trình bày toàn bộ cơ sở lý thuyết có liên quan tới website và kiểm thử website Các nội dung này đã làm rõ và đưa ra được vấn để nghiên cứu của toàn bộ đề tài, đó là lỗ hổng bảo mật website và kỹ thuật Fuzzing trong phát hiện các lỗ hổng bảo mật
Từ những nội dung trình bày ở trên đã trình bày lý do lựa chọn kỹ thuật Fuzzing cho các nghiên cứu trong kiểm thử bảo mật website Các nội dung này là cơ sở lý thuyết cho việc nghiên cứu áp dụng kỹ thuật Fuzzing với các lỗ hổng web trong chương 2
Trang 25CHƯƠNG 2: NGHIÊN CỨU KỸ THUẬT FUZZING TRONG KIỂM THỬ
ỨNG DỤNG WEB 2.1 Mô hình Fuzzing cho ứng dụng website
2.1.1 Mô hình Fuzzing
Một ứng dụng web thao tác với người dùng qua trình duyệt và sử dụng giao thức HTTP (port 80) hoặc HTTPS (port 443) Một hệ thống website sẽ chứa các điểm đầu vào của hệ thống bao gồm: các form cho người dùng nhập dữ liệu, các giá trị của biến được truyền trên các URL của website, các trường thông tin trong HTTP Headers
Quá trình kiểm thử chủ yếu được thực hiện dựa trên các thông tin đầu vào cho hệ thống, cụ thể các trường dữ liệu của request headers được gửi qua phương thức truyền dữ liệu của HTTP hay HTTPS, chủ yếu là 2 phương thức GET và POST Fuzzer sẽ phải thực hiện việc thu thập toàn bộ các điểm đầu vào của hệ thống trước khi thực hiện quá trình kiểm thử Fuzzing
Hình 5: Mô hình Fuzzing cho ứng dụng web tổng quát
Mô hình kiểm thử Fuzzing có 2 thành phần chủ yếu là fuzzer và web server:
- Fuzzer là công cụ hay chương trình thực hiện việc kiểm thử bằng kỹ thuật Fuzzing
Trang 26- Web server là hệ thống máy chủ và cũng là mục tiêu của Fuzzer kiểm thử
Với mỗi loại lỗ hổng website sẽ có những dữ liệu fuzz để thực hiện nhận dạng cho các ứng dụng đó, cụ thể chính là giá trị được thêm vào các biến trước khi gửi tới hệ thống Việc phân tích các Response trả về cũng được thực hiện dựa trên các đặc điểm của từng loại hệ thống Web Server có mã nguồn website được xây dựng trên loại ngôn ngữ lập trình nào
2.1.2 Quy trình Fuzzing trong kiểm thử lỗ hổng bảo mật website
Tùy thuộc vào các nhân tố khác nhau, việc lựa chọn cách tiếp cận Fuzzing có thể khác nhau Tuy nhiên, về cơ bản Fuzzing có các giai đoạn như sau:
Hình 6: Quy trình Fuzzing
a) Xác định mục tiêu
Trang 27Mục tiêu được đánh giá có nguy cơ rủi ro cao gồm các lỗ hổng do lỗi của người lập trình hệ thống: SQL Injection, Code Injection, Cross Site Scripting, URL Redirect… Hoặc các lỗi do việc cấu hình hệ thống không an toàn như để đường dẫn vào trang quản trị hệ thống là mặc định, tài khoản mặc định…
Fuzzer cần có đầu vào là địa chỉ IP hay domain của website cho việc xác định đối tượng Fuzzing
b) Định nghĩa đầu vào
Một ứng dụng web nhận các yêu cầu, dữ liệu từ người dùng thông qua các URL hoặc trường biểu mẫu Các yêu cầu của người dùng được chuyển thành các gói tin theo giao thức HTTP và đưa tới Web Server Các trường trong phần tiêu đề của gói tin sẽ được chèn dữ liệu Fuzzing
Fuzzer thực hiện cuộc thử nghiệm thông qua phần tiêu đề khác nhau của giao thức HTTP của website đó, do vậy, việc thực hiện thu thập được toàn diện các điểm đầu vào là các URL, trường biểu mẫu giúp cho Fuzzer đi vào được các ngóc ngách của website và thực hiện Fuzzing
c) Tạo dữ liệu Fuzz
Mục tiêu của Fuzzing là cung cấp dữ liệu bất thường thông qua đầu vào cho mục tiêu mà nó thường không mong đợi nhận được
Giai đoạn này được xem là quan trọng nhất trong Fuzzing Ngày nay, nó được nghiên cứu và phát triển đáng kể bởi các nhà khoa học Mục đích của một fuzzer là để kiểm tra sự tồn tại của lỗ hổng bảo mật trên các đầu vào của ứng dụng Do đó, fuzzer phải tạo ra dữ liệu thử nghiệm mà ở các mức độ mà sau đó nó có thể được thông qua vào mục tiêu ứng dụng đầu vào Dữ liệu được tạo ra có thể dạng file nhị phân (Binary files), file văn bản (Text files) được tạo ra lặp đi lặp lại vào thời điểm bắt đầu của mỗi lần test
Toàn bộ phạm vi của dữ liệu thử nghiệm tạo ra cho Fuzzing ứng với một mục đích nhất định, nó bao gồm nhiều trường riêng biệt (gọi là test case) Các cách tiếp cận chung
để kiểm tra là để nó lặp đi lặp lại, cung cấp các trường hợp thử nghiệm vào các mục tiêu
Trang 28và theo dõi các phản ứng Trong suốt quá trình kiểm thử, một test case được sử dụng để tìm ra các phản ứng bất thường của ứng dụng, sự kết hợp của một trường hợp thử nghiệm
cụ thể và thông tin về bản chất của sự bất thường tạo ra một báo cáo về lỗ hổng Báo cáo
lỗ hổng có thể được coi như là đầu ra của Fuzzing, tạo điều kiện thuận lợi cho các nhà phát triển trong quá trình khắc phục
Các dữ liệu kiểm thử được tạo ra là một tập hợp các quy tắc hoặc các luật, thông thường là được xác định bởi người sử dụng hoặc do chuyên gia đề xuất
Hiệu quả của quá trình kiểm thử phụ thuộc bộ dữ liệu đầu vào:
- Độ bao phủ không gian đầu vào: Không gian đầu vào của bộ dữ liệu fuzz cho kiểm thử càng rộng thì hiệu quả đạt càng cao
- Chất lượng của dữ liệu đầu vào: Các dữ liệu đầu vào độc hại tiêu biểu và dị hình sẽ làm sẽ là tăng cường khả năng kiểm thử đối với các yếu tố hoặc cấu trúc trong định nghĩa giao diện
d) Thực hiện Fuzzing
Server nắm bắt dữ liệu từ tiêu đề được gửi bởi khách hàng để thực hiện một số nhiệm vụ ở phía máy chủ Các dữ liệu lần lượt được chèn vào các trường phần tiêu đề của HTTP Request
Các trường tiêu đề sau đây có thể được chèn dữ liệu Fuzzing:
dữ liệu Fuzzing đã sẵn sàng, đó là lúc để gửi nó tới đích
Trang 29Khi bộ fuzzer bắt đầu Fuzzing, fuzzer theo dõi mục tiêu và đợi cho ứng dụng gặp phải tình trạng lỗi hay phản ứng bất thường do những dữ liệu không thích hợp được truyền đến Tình trạng lỗi và dữ liệu gây ra lỗi sẽ được ghi lại
e) Xác định khả năng khai thác
Giai đoạn này, không đơn thuần các fuzzers phát hiện các lỗ hổng qua việc Fuzzing
mà phải định nghĩa các lỗ hổng được phát hiện Điều này có ý nghĩa hết sức quan trọng trong việc phân tích và báo cáo lỗ hổng Để báo cáo lỗ hổng đòi hỏi Fuzzer hiểu rõ về hoạt động xử lý và được tích hợp vào sự kiện phân loại lỗ hổng tự động
Sau khi một hoặc một số lỗi phần mềm đã được xác định, các fuzzers gửi một danh sách các khiếm khuyết này để một đội ngũ phát triển, để họ có thể sửa chữa chúng Tất nhiên, việc này đòi hỏi một cuộc kiểm tra cho dù khiếm khuyết có hay không có khả năng khai thác nhằm tìm hiểu các tác động gì sẽ ảnh hưởng đến người dùng
2.2 Một số kịch bản thực nghiệm với Fuzzing
2.2.1 Kiểm thử lỗ hổng Cross-site Scripting (XSS)
Lỗ hổng Cross-Site Scripting (XSS) vẫn là một trong những lỗ hổng bảo mật nguy hiểm và phổ biến nhất trong các ứng dụng web hiện nay Mặc dù nhiều biện pháp bảo mật
đã được triển khai, XSS vẫn thường xuyên bị phát hiện và khai thác trên các hệ thống web, gây ra nhiều rủi ro nghiêm trọng như đánh cắp dữ liệu người dùng, chiếm quyền điều khiển phiên (session hijacking), thực thi mã độc trên trình duyệt nạn nhân và nhiều hình thức tấn công khác
Có nhiều phương pháp để phát hiện lỗ hổng XSS, trong đó Fuzzing là một kỹ thuật hiệu quả giúp kiểm thử bảo mật ứng dụng web một cách tự động và có hệ thống Fuzzing hoạt động bằng cách gửi hàng loạt dữ liệu đầu vào ngẫu nhiên hoặc có chủ đích vào các trường nhập liệu của ứng dụng web, từ đó quan sát phản hồi để xác định xem ứng dụng
có thực thi mã JavaScript không mong muốn hay không Nếu hệ thống phản hồi mà không
Trang 30có cơ chế lọc hoặc mã độc được thực thi thành công, điều đó cho thấy ứng dụng có thể tồn tại lỗ hổng XSS
Để áp dụng quy trình Fuzzing cho kiểm thử lỗ hổng XSS cần thực hiện các bước sau:
- Bước 1: Xác định mục tiêu: Xác định địa chỉ IP hay tên miền của ứng dụng cần
kiểm thử lỗ hổng XSS bằng Fuzzing
- Bước 2: Định nghĩa đầu vào: Xác định các điểm đầu vào trong ứng dụng web mục
tiêu mà ở đó là nơi có thể xảy ra lỗ hổng XSS, bao gồm các tham số URL, các trường nhập dữ liệu mà người dùng có thể tương tác
- Bước 3: Tạo dữ liệu Fuzz: Tạo 1 danh sách các dữ liệu kiểm thử (payload) để thử
nghiệm trên ứng dụng web Các payload này có thể tạo ra bằng thủ công hay sử dụng các công cụ hỗ trợ: Burp Suite Intruder, wfuzz,
- Bước 4: Thực hiện Fuzzing: Sử dụng công cụ Fuzzing (Fuzzer) để tự động chèn
các payload trong danh sách đã được tạo từ bước 3 vào các điểm đầu vào đã được định nghĩa và theo dõi phản hồi của website
- Bước 5: Xác định khả năng khai thác: Kiểm tra phản hồi từ website sau mỗi yêu
cầu Nếu payload xuất hiện trong phản hồi (đặc biệt là nếu nó được thực thi), thì trang web có thể dễ bị tấn công XSS Dựa trên kết quả đó, đánh giá mức độ an toàn của ứng dụng web và báo cho đội ngũ phát triển để họ có thể khắc phục các lỗ hổng tiềm ẩn
2.2.2 Kiểm thử lỗ hổng SQL Injection
Kỹ thuật Fuzzing được sử dụng để kiểm thử lỗ hổng SQL Injection vì nó cho phép
tự động tạo và biến đổi dữ liệu đầu vào nhằm phát hiện các lỗ hổng bảo mật trong ứng dụng web Phương pháp này hoạt động bằng cách cung cấp các dữ liệu không hợp lệ hoặc
Trang 31bất ngờ cho ứng dụng, sau đó theo dõi và ghi lại các lỗi cũng như phản hồi của hệ thống trong quá trình xử lý
Fuzzing có thể tự động sinh ra các chuỗi dữ liệu đầu vào ngẫu nhiên hoặc theo mẫu
để kiểm tra mức độ an toàn và ổn định của ứng dụng web Khi áp dụng để kiểm thử SQL Injection, kỹ thuật này sẽ tạo ra các chuỗi tấn công SQL độc hại và gửi đến ứng dụng Sau
đó, hệ thống sẽ phân tích phản hồi để xác định xem dữ liệu đầu vào có thể tác động đến truy vấn SQL hay không Nếu ứng dụng xử lý không an toàn và phản hồi bất thường, điều
đó có thể cho thấy sự tồn tại của lỗ hổng SQL Injection
Để áp dụng quy trình Fuzzing cho kiểm thử lỗ hổng SQL Injection cần thực hiện các bước sau:
- Bước 1: Xác định mục tiêu: Xác định địa chỉ IP hoặc tên miền của ứng dụng web
cần kiểm thử
- Bước 2: Định nghĩa đầu vào: Xác định các điểm đầu vào mà ứng dụng sử dụng để
tương tác với cơ sở dữ liệu mà có thể bị lỗ hổng SQL Injection, bao gồm các trường nhập dữ liệu, tham số URL, tham số của các yêu cầu HTTP, và các điểm đầu vào khác mà người dùng tương tác với ứng dụng
- Bước 3: Tạo dữ liệu Fuzz: Tạo một danh sách các payload SQL Injection để thử
nghiệm ứng dụng web Các payload này có thể được thu thập từ nguồn đáng tin cậy hoặc tạo mới dựa trên các kỹ thuật lỗ hổng SQL Injection phổ biến
- Bước 4: Thực hiện Fuzzing: Sử dụng một công cụ Fuzzing như SQLMap hoặc mã
tự động để gửi các chuỗi tấn công SQL Injection tới các điểm đầu vào của ứng dụng web đã được định nghĩa và theo dõi các phản ứng từ hệ thống cũng như dữ liệu trả
về
- Bước 5: Xác định khả năng khai thác: Kiểm tra kết quả của các yêu cầu gửi đến
ứng dụng web sau mỗi lần thử nghiệm Xác định xem liệu các chuỗi tấn công SQL
Trang 32Injection đã tìm thấy có thể khai thác thành công hay không Nếu có bất kỳ dấu hiệu nào của kết quả không mong muốn, chẳng hạn như lỗi SQL hoặc thông tin nhạy cảm được trả về, đó là một dấu hiệu của lỗ hổng SQL Injection Dựa trên kết quả của kiểm thử, đánh giá mức độ nghiêm trọng của lỗ hổng SQL Injection và báo cáo cho đội ngũ phát triển để họ có thể khắc phục Đề xuất các biện pháp sửa lỗi cụ thể
và theo dõi việc triển khai các sửa lỗi này
2.3 Tổng kết chương 2
Trong chương này chúng em đã trình bày mô hình và quy trình Fuzzing trong kiểm thử bảo mật ứng dụng web, giúp làm rõ cách thức áp dụng kỹ thuật này trong thực tế Để minh họa, nhóm đã xây dựng hai kịch bản kiểm thử tập trung vào hai lỗ hổng phổ biến: SQL Injection và Cross-site Scripting Trên cơ sở những nội dung đã trình bày, chương 3
sẽ tiến hành các thử nghiệm thực tế, áp dụng Fuzzing để kiểm tra mức độ an toàn của các ứng dụng web, từ đó đánh giá hiệu quả của phương pháp này trong phát hiện lỗ hổng bảo mật
Trang 33CHƯƠNG 3: THỰC NGHIỆM VỀ QUÁ TRÌNH FUZZING TRONG KIỂM THỬ
ỨNG DỤNG WEB 3.1 Xây dựng chương trình
3.1.1 Cấu hình máy chủ web
- Nền tảng máy chủ web DVWA: Apache2
- Cơ sở dữ liệu: MySQL
- Ngôn ngữ lập trình: PHP
- Cổng cơ sở dữ liệu đang sử dụng: 3306
- Hệ điều hành : Kali Linux
3.1.2 Dựng phòng thực nghiệm
Trong phần này, nhóm sẽ trình bày cách dựng một phòng thực nghiệm dùng để kiểm thử các lỗ hổng ứng dụng web Phòng thực nghiệm mà nhóm chọn là DVWA DVWA (Damn Vulnerable Web Application) là một ứng dụng web tiêu chuẩn mở được thiết kế để chú tâm vào việc học các kỹ thuật bảo mật web qua việc thực chiến, cho phép người học có cơ hội tìm hiểu sâu vào các lỗ hổng thông qua việc thử nghiệm trong môi trường được kiểm soát Sau đây là cách để triển khai DVWA trên Kali Linux:
Bước 1: Tải xuống DVWA
- Bước đầu tiên cần tải xuống DVWA từ GitHub vào thư mục /var/www/html trên Kali Linux Đây là nơi vị trí lưu trữ các tệp Localhost trong hệ thống Linux Khởi chạy Terminal và thay đổi thư mục hiện tại thành thư mục /var/www/html bằng lệnh bên dưới:
$ cd /var/www/html
Trang 34- Sau khi đã đổi thành công thư mục thì sẽ bắt đầu tải DVWA từ GitHub về bằng lệnh sau:
$ sudo git clone https://github.com/digininja/DVWA
- Khi tải thành công DVWA về máy thì sẽ đổi tên thư mục DVWA thành dvwa để thuận tiện cho việc cài đặt các lệnh sau này:
$ sudo mv DVWA dvwa
Bước 2: Cấu hình DVWA
- Sau khi tải xuống DVWA trong thư mục /var/www/html, cần đặt quyền đọc, ghi và
thực thi cho thư mục DVWA bằng dòng lệnh dưới đây:
$ sudo chmod -R 777 dvwa/
- Sau khi thực hiện thành công lệnh, cần thiết lập người dùng và mật khẩu cần thiết để truy cập cơ sở dữ liệu Thay đổi thư mục hiện tại đến thư mục config bằng lệnh bên dưới
$ cd dvwa/config
- Khi chạy lệnh ls để xem các tệp trong thư mục, sẽ thấy tệp config.inc.php.dist Đó là file gốc chứa các cấu hình mặc định Người dùng sẽ tạo một bản sao của tệp này có tên config.inc.php và tệp config.inc.php.dist ban đầu sẽ đóng vai trò là bản sao lưu trong trường hợp có sự cố xảy ra
$ sudo cp config.inc.php.dist config.inc.php
- Chạy lệnh bên dưới để mở tệp mới tạo bằng trình soạn thảo nano và thực hiện các thay đổi cần thiết, như trong hình bên dưới Đặt db_user là user và db_password là pass
$ sudo nano config.inc.php
Và đây là kết quả sau khi cấu hình:
Trang 35Hình 7: Cấu hình DVWA
Bước 3: Cấu hình cơ sở dữ liệu MySQL
- Để khởi động dịch vụ MySQL, sử dụng câu lệnh sau:
$ sudo service mysql start
- Sau đó có thể kiểm tra xem dịch vụ có đang chạy không bằng lệnh:
$ systemctl status mysql
kết quả sẽ hiện ra như trong ảnh dưới đây nếu dịch vụ đang chạy
Hình 8: Trạng thái của MySQL
Trang 36- Tiếp đến, người dùng phải đăng nhập vào cơ sở dữ liệu MySQL bằng lệnh dưới với quyền root MySQL sẽ mở ra, như trong hình bên dưới:
$ sudo mysql -u root -p
Hình 9: Đăng nhập vào MySQL với quyền root
- Tạo một người dùng mới với tên người dùng và mật khẩu được đặt trong tệp cấu hình ứng dụng DVWA Trong trường hợp này, tên người dùng là user và mật khẩu là pass Máy chủ đang sử dụng là Localhost (127.0.0.1) Sử dụng lệnh dưới đây:
create user 'user'@'127.0.0.1' identified by 'pass';
- Người dùng mới này cần được cấp đặc quyền trên cơ sở dữ liệu dvwa grant all privileges on dvwa.* to 'user'@'127.0.0.1' identified by 'pass';
- Gõ “exit” để thoát cơ sở dữ liệu Đến bước này là đã cấu hình xong ứng dụng DVWA
và cơ sở dữ liệu MySQL
Bước 4: Cấu hình Apache Server
- Bây giờ cần cấu hình server Sử dụng lệnh bên dưới để thay đổi vị trí hiện tại trên Terminal để trỏ đến thư mục /etc/php/8.2/apache2
Trang 37- Cuộn xuống và tìm hai dòng sau: allow_url_fopen và allow_url_include Đặt cả hai là On Lưu file (Ctrl + O, sau đó Enter) và Thoát (Ctrl + X)
- Khởi động Apache server bằng lệnh bên dưới
$ sudo service apache2 start
- Để kiểm tra xem dịch vụ có khởi động thành công hay không, hãy sử dụng lệnh:
$ systemctl status apache2.service
- Nếu kết quả hiện thị như trong ảnh thì đã khởi động thành công Apache server
Hình 10: Trạng thái của Apache2
Bước 5: Truy cập DVWA trên trình duyệt
- Để truy cập DVWA trên trình duyệt, cần truy vấn danh sách người dùng MySQL cùng với host mà họ có thể đăng nhập từ đó
$ sudo mysql -u root -p -e "SELECT user, host FROM mysql.user;"
Trang 38Hình 11: Truy vấn danh sách người dùng MySQL
- Dùng lệnh sau để sửa file cấu hình DVWA như hình:
$ sudo nano /var/www/html/dvwa/config/config.inc.php
Hình 12: Chỉnh sửa file cấu hình DVWA
- Mọi thứ cần thiết đã được cấu hình xong và có thể tiến hành khởi chạy DVWA trên trình duyệt bằng đường dẫn http://127.0.0.1/dvwa/ Tài khoản và mật khẩu mặc định
là “admin - password”
Hình 13: Giao diện trang đăng nhập web DVWA
Trang 39- Sau khi đăng nhập xong, cần vào mục DVWA Security để chuyển mức độ bảo mật trang web về thấp Việc này giúp thực hiện các kịch bản thực nghiệm dễ hơn
Hình 14: DVWA Security
3.2 Triển khai thực nghiệm
3.2.1 Kiểm thử lỗ hổng SQL Injection sử dụng kỹ thuật Fuzzing
Dựa trên kịch bản kiểm thử lỗ hổng SQL Injection bằng Fuzzing ở trên, dưới đây
là quá trình thực hiện các bước kiểm thử
Bước 1: Xác định mục tiêu kiểm thử
- Chọn trang: http://127.0.0.1/dvwa/vulnerabilities/sqli/ là mục tiêu để tiến hành kiểm thử , xác định mục tiêu có thể chứa lỗ hổng SQL Injection
(1) Trường hợp trang web có mức độ bảo mật thấp:
Trang 40Hình 15: Ô nhập User ID của trang web có mức độ bảo mật thấp
- Sau khi nhập một tham số bình thường như hệ thống yêu cầu, sử dụng Burp Suite để thực hiện các bước tiếp theo
Hình 16: Các Request được thực hiện
- Tái tạo Request bằng Repeater Sau đó chỉnh sửa
Hình 17: Nơi có thể truyền payload của Burp Suite
- Có thể thấy khi trang web được đặt mức độ bảo mật thấp, phương thức gửi Request là phương thức GET Thử thay đổi bằng cách thêm ‘ hoặc “