Bài tập lớn môn Kỹ thuật lập trình về Fuzzing
Bài tập lớn môn Kỹ thuật lập trình về Fuzzing giúp sinh viên tham khảo và phục vụ nhu cầu học tập của mình
Môn: Kỹ thuật lập trình - FUZZING
Trường: Học viện kỹ thuật mật mã
Thông tin:
Tác giả:
Preview text:
lOMoARcPSD| 36477832
CHƯƠNG 1: TỔNG QUAN VỀ FUZZING ............................................................. 1
1.1. Fuzzing ................................................................................................................... 1
1.1.1. Fuzzing là gì? .............................................................................................. 1
1.1.2. Ưu nhược điểm của Fuzzing ....................................................................... 2
1.1.3. Phân loại ..................................................................................................... 3
1.2. Một số công cụ hỗ trợ thực nghiệm ....................................................................... 5
1.2.1. HTTP ........................................................................................................... 5
1.2.2. Nmap ........................................................................................................... 7
1.2.3. Google Dorks .............................................................................................. 8
CHƯƠNG 2: THỰC NGHIỆM ............................................................................... 10
2.1. Chương trình triển khai ........................................................................................ 10
2.1.1. Get_banner ................................................................................................ 10
2.1.2. Fuzzing ...................................................................................................... 11
2.1.3. Google_dork .............................................................................................. 12
2.1.4. Nmap scan ................................................................................................. 12
2.2. Thực nghiệm ........................................................................................................ 13
2.2.1. Phân tích dữ liệu web ................................................................................ 13
2.2.2. Thực hiện fuzzing ...................................................................................... 14
2.2.3. Tìm kiếm với Google Dork ........................................................................ 14
2.2.4. Quét cổng với nmap .................................................................................. 15
KẾT LUẬN ................................................................................................................ 15
TÀI LIỆU THAM KHẢO ........................................................................................ 17 LỜI NÓI ĐẦU
Trong thời đại công nghệ phát triển mạnh mẽ như hiện nay, việc một doanh
nghiệp sở hữu website riêng cho mình gần như đã trở thành một điều bắt buộc để
thúc đẩy sự phát triển cũng như quảng bá sản phẩm, thương hiệu đến với người tiêu
dùng. Bên cạnh sự phát triển nên nền tảng website đó, vấn đề bảo mật và an toàn
thông tin cũng rất được quan tâm và chú trọng đầu tư. Tuy nhiên, không phải tất cả
các tổ chức và doanh nghiệp đều có thể trang bị đầy đủ, cũng như đảm bảo an toàn
thông tin trên website của mình được toàn diện.
Theo thống kê của BKAV cho thấy, tại Việt Nam có tới 40% website tồn tại lỗ
hổng. Còn theo báo cáo toàn cầu từ Kaspersky Lab, Việt Nam đứng thứ ba trên thế lOMoAR cPSD| 36477832
giới về sự nguy hiểm với 35% số người dùng đã bị tấn công khi lướt web. VNCERT
cũng ghi nhận hơn 30.000 sự cố an ninh Việt Nam trong năm 2015.
Từ tình hình trên, chúng ta thấy cần thiết phải có một giải pháp, kỹ thuật xây
dựng hệ thống kiểm thử bảo mật cho mỗi hệ thống website, nhằm phát hiện và cảnh
báo các lỗ hổng sớm nhất trước khi tới với người dùng. Trong đó, kỹ thuật Fuzzing là
một kỹ thuật phát hiện lỗ hổng mang lại hiệu quả rất lớn cho việc kiểm thử các vấn đề
an ninh trong các phần mềm, hệ thống máy tính và các ứng dụng dịch vụ.
Xuất phát từ thực tế trên, nhóm chúng em đã thống nhất lựa chọn đề tài
“FUZZING” để nghiên cứu và thực thi với mong muốn có cái nhìn xác thực, rõ ràng
hơn về phương pháp kiểm thử hộp đen Fuzzing.
Với những giới hạn về vấn đề nghiên cứu, bài báo cáo được xây dựng cấu trúc phân thành 2 chương:
Chương 1: Tổng quan về Fuzzing.
Chương 2: Thực nghiệm và kết luận. lOMoARcPSD| 36477832
CHƯƠNG 1: TỔNG QUAN VỀ FUZZING 1.1. Fuzzing
Ngày nay, hình thức thanh toán trực tuyến thông qua website, ứng dụng
online đang ngày càng trở nên phổ biến. Vì thế, các website, ứng dụng online này đã trở
thành mục tiêu tấn công của hacker. Tại Việt Nam, “Trong năm 2013 đã có gần 5.000 hệ
thống website của các cơ quan doanh nghiệp tại Việt Nam bị hacker tấn công. Chủ yếu
thông qua các lỗ hổng về mạng và cấu hình hệ thống.
Nhằm phát hiện và cảnh báo được các lỗ hổng trên hệ thống website một cách
chính xác, Fuzzing giúp tìm kiếm và xử lý được hầu hết các lỗ hổng trong vấn đề nêu trên.
1.1.1. Fuzzing là gì?
Fuzzing có nguồn gốc từ năm 1988, bởi giáo sư Barton Miller, tại Đại học Wisconsin.
Trong lĩnh vực an ninh ứng dụng, Fuzzing hay kiểm thử mở (fuzz testing) là một kỹ
thuật thuộc kiểm thử hộp đen (black box) mà không đòi hỏi quyền truy cập vào mã nguồn,
phát hiện lỗi của phần mềm bằng cách tự động hoặc bán tự động cung cấp dữ liệu đầu vào
không hợp lệ, không mong đợi hay ngẫu nhiên vào phần mềm. Phần mềm sẽ được giám sát
và ghi lại các trường hợp ngoại lệ như lỗi mã không được thực thi, tài nguyên thất thoát.
Nhằm xác định các hành vi bất thường, phát hiện các lỗ hổng bảo mật tiềm ẩn của phần
mềm. Dữ liệu không mong đợi thường là 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.
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.
Fuzzing cũng giống như các kỹ thuật kiểm thử phần mềm, nhưng nó được sử dụng để
phát hiện ra một loạt các vấn đề của web như: Cross Site Cripting, chèn câu truy vấn (SQL Injection),… 1 lOMoARcPSD| 36477832
1.1.2. Ưu nhược điểm của Fuzzing a. Ưu điểm
Như bất kỳ kỹ thuật kiểm thử an toàn nào khác, kiểm thử Fuzzing có ưu
và nhược điểm của nó.
Những ưu điểm của Fuzzing:
- 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. Kiểm thử Fuzzing tập trung vào việc sử dụng các giá
trị đặc biệt như đầu vào cho ứng dụng được kiểm thử, do đó giúp việc phát
hiện các lỗi quan trọng mà có thể không được phát hiện bằng các phương
pháp tiếp cận dựa trên mô hình.
- Kiểm thử Fuzzing chỉ theo dõi các trường hợp mà kết quả trả về có sự bất
thường hay hành vi không mong muốn. Điều này giúp nó có khả năng chạy
hàng nghìn trường hợp thử nghiệm.
- Là một loại kiểm thử hộp đen nên có thể thực hiện kiểm thử cho cấc ứng
dụng không biết mã nguồn bên trong, vì vậy nó thường tìm ra các lỗ hổng
nghiêm trọng và hầu hết là những lỗ hổng mà tin tặc thường khai thác.
- Các quá trình Fuzzing thường có lượng đầu vào thử nghiệm rất lớn, độ bao
phủ rộng nên hiệu quả trong việc tìm kiếm các lỗ hổng. b. Nhược điểm 2 lOMoARcPSD| 36477832
Bên cạnh những ưu điểm giúp cho Fuzzing được trở nên ưa chuộng thì
nó cũng tồn tại những hạn chế:
- Khó có thể kiểm thử toàn diện và tìm thấy được tất cả các lỗi trong một
chương trình lớn, những lỗi đòi hỏi kiểm thử viên phải thực hiện phân tích tĩnh.
- Fuzzing nằm trong phương pháp kiểm thử hộp đen nên 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, vì vậy khó có thể tìm hiểu chi tiết.
- Với chương trình có các đầu vào phức tạp để tìm ra các lỗi đòi hỏi phải tốn
nhiều thời gian bởi với mỗi biến đang fuzzing phải thử N vector fuzz.
- Fuzzing hoạt động không hiệu quả trong các chương trình có các kết quả trả
về không có các mã lỗi hay các dấu hiệu bất thường. 1.1.3. Phân loại
Phân loại fuzzing có thể tùy thuộc vào bộ dữ liệu fuzz, mục tiêu fuzzing hay phương pháp fuzzing.
a. Phân loại theo dữ liệu Fuzz Mutation Based Fuzzing
Kiểm thử Mutation Based Fuzzing hay còn gọi là kiểm thử Dumb
Fuzzing là phương pháp kiểm thử mà dữ liệu fuzz được biến đổi từ mẫu dữ liệu
hợp lệ hiện có để tạo thành dữ liệu kiểm thử cho mục tiêu fuzzing.
Một số đặc điểm đối với cách tiếp cận này:
- Người thực hiện không cần có nhiểu hiểu biết về cấu trúc của các yếu tố đầu vào.
- Tính dị thường được thêm vào đầu vào hợp lệ hiện có có thể hoàn toàn ngẫu
nhiên hoặc theo số chuẩn đoán về mặt kinh nghiệm.
- Dữ liệu cho thực hiện fuzzing hoàn toàn phụ thuộc vào các yếu tố đầu vào được sửa đổi.
- Yêu cầu ít hoặc việc thiết lập thời gian đơn giản hoặc không cần thiết. Một số
công cụ cho phép thực hiện fuzzing theo phương pháp này: Taof, GPF, ProxyFuzz, Peach Fuzzer. Generation Based Fuzzing 3 lOMoARcPSD| 36477832
Kiểm thử Generation Based Fuzzing hay còn gọi là kiểm thử Smart Fuzzing là phương
pháp kiểm thử mà dữ liệu fuzz được xây dựng mới hoàn toàn dựa trên các mô tả đặc điểm
kỹ thuật, định dạng của mô hình đầu vào.
Đối với cách tiếp cận này:
- Trường hợp thử nghiệm được tạo ra từ một số mô tả về các định dạng:
RFC, các định dạng tài liệu.
- Tính dị thường được thêm vào mỗi điểm có thể có trong các đầu vào.
- Hỗ trợ kiến thức về giao thức nên cho kết quả tốt hơn so với Fuzzing ngẫu nhiên.
- Có thể mất thời gian đáng kể để thiết lập.
Công cụ để thực hiện: SPIKE, Sulley, Mu-4000.
b. Phân loại theo OWASP
The Open Web Application Security Project (OWASP) là một dự án phi
lợi nhuận phát triển các dự án liên quan tới bảo mật ứng dụng Web hàng đầu thế
giới, tổ chức này đưa ra 2 cách phân loại khác về Fuzzing hỗ trợ cho kiểm thử mở
các ứng dụng Web như sau: • Fuzzing đệ quy
Fuzzing đệ quy (Recursive Fuzzing) là phương pháp kiểm thử mà Fuzzer
thực hiện duyệt qua bộ dữ liệu fuzz được xây dựng dựa trên tất cả các kết hợp
của bộ chữ cái Alpahbet.
Giả sử ta gửi một request là một chuỗi có dạng:
Nếu chọn “2af8rb03” như một điểm đầu vào thì bộ dữ liệu fuzzing là một tập các
chuỗi của bảng chữ cái Alphabet và số hệ thập lục phân (a-z, 0-9) thuộc loại fuzzing đệ
quy. Như vậy, fuzzer sẽ thực hiện các reques có dạng như sau: 4 lOMoARcPSD| 36477832 • Fuzzing thay thế
Fuzzing thay thế (Replacive Fuzzing) là quá trình fuzzing mà
một phần của yêu cầu được thực hiện thông qua việc thay thế nó bằng một tập
giá trị mở. Giá trị này được hiểu như một fuzz vector. Xét trường hợp:
Để thực hiện kiểm tra sự tồn tại của lỗ hổng Cross Site Scripting (XSS),
fuzzer thực hiện kiểm thử bằng cách gửi đến server các fuzz vector như sau:
Các fuzz vector được xây dựng dựa trên các mô tả về loại lỗ hổng cần
kiểm thử. Tổng số lượng request mà các fuzzer cần phải thực hiện phụ thuộc
vào số lượng các fuzz vector xác định.
1.2. Một số công cụ hỗ trợ thực nghiệm 1.2.1. HTTP a. HTTP Header
HTTP là viết tắt của “HyperText Transfer Protocol”, hay còn gọi là giao
thức truyền tải siêu văn bản. Tức là nó dùng để chuyển và nhận dữ liệu mỗi khi có
yêu cầu. Cụ thể, mỗi khi ta truy cập vào một url thì đồng nghĩa với việc ta sẽ thực
hiện gửi và nhận nhiều http request, đồng thời cũng là gửi và nhận nhiều http header kèm theo. b. HTTP Method
REST (Representational State Transfer) là một dạng chuyển đổi cấu trúc dữ
liệu, một kiểu kiến trúc để viết API. Nó sử dụng phương thức HTTP đơn giản để
tạo cho giao tiếp giữa các máy. Chức năng quan trọng nhất của REST là quy định 5 lOMoAR cPSD| 36477832
cách sử dụng các HTTP method. REST gửi một yêu cầu HTTP như GET, POST,
DELETE.. đến một URL để xử lý dữ liệu.
HTTP method có tất cả 9 loại request, trong đó method GET và POST là 2 loại
thông dụng được sử dụng nhiều.
o GET: được sử dụng để lấy thông tin từ server theo URL đã cung cấp. o
HEAD: giống với GET nhưng response trả về không có body, chỉ có header.
o POST: gửi thông tin tới server thông qua các biểu mẫu.
o PUT: ghi đè tất cả thông tin của đối tượng với những gì được gửi lên. o
PATCH: ghi đè các thông tin được thay đổi của đối tượng.
o DELETE: xóa tài nguyên trên server.
o CONNECT: thiết lập một kết nối tới server theo URL. o OPTIONS: mô
tả các tùy chọn giao tiếp cho resource. o TRACE: thực hiện một bài test
loopback theo đường dẫn đến resource.
Fuzzing Method HTTP tìm điểm yếu trong các dịch vụ bằng cách gửi nhiều
yêu cầu không hợp lệ hoặc ngẫu nhiên thông qua các phương thức HTTP. Thông
thường, kẻ tấn công cố gắng gửi các yêu cầu ngẫu nhiên thông qua các phương
thức HTTP khác nhau để kích hoạt một số loại hành vi không mong muốn hoặc
lấy thông tin hệ thống hữu ích. Nếu quá trình quét không tiết lộ bất kỳ thông tin
nào về các lỗ hổng có thể xảy ra, khả năng bảo mật của hệ thống mục tiêu tương
đối an toàn. Nếu quá trình phản hồi trả về các bất thường, nó cho thấy việc bảo
mật của hệ thống không được tốt. Điều này gây ra các vấn đề về bảo mật hoặc làm
lộ dữ liệu nhạy cảm. c. HTTP Status
HTTP status code (mã trạng thái) là mã code server trả về sau mỗi lần gửi
request. Tất cả các request mà server nhận được đều sẽ được trả về 1 response với
1 mã code tương ứng. HTTP status code giúp xác định request thành công hay
không, nếu thất bại thì nguyên nhân là gì.
HTTP status code gồm 3 chữ số, được chia thành 5 loại khác nhau, mỗi loại bắt
đầu với 1 chữ số khác nhau và mang ý nghĩa riêng: 6 lOMoARcPSD| 36477832
• 1xx (Informational – Thông tin): Các status code loại này dùng để đơn giản
thông báo với client rằng server đã nhận được request. Các status code này ít được sử dụng.
• 2xx (Success – Thành công): Các status code loại này có ý nghĩa rằng
request được server và xử lý thành công.
• 3xx (Redirect – Chuyển hướng): Các status code loại này có ý nghĩa rằng
server sẽ chuyển tiếp request hiện tại sang một request khác và client cần
thực hiện việc gửi request tiếp theo đó để có thể hoàn tất. Thông thường khi
trình duyệt nhận được status code loại này nó sẽ tự động thực hiện việc gửi
request tiếp theo để lấy về kết quả.
• 4xx (Client error – Lỗi Client): Các status code loại này có ý nghĩa rằng đã
có lỗi từ phía client trong khi gửi request. Ví dụ như sai URL, sai HTTP
method, không có quyền truy cập vào trang…
• 5xx (Server error – Lỗi Server): Các status code loại này có ý nghĩa rằng đã
có lỗi từ phía server trong khi xử lý request. Ví dụ như server quá tải, hết bộ
nhớ, lỗi kết nối database… 1.2.2. Nmap
Nmap (tên đầy đủ Network Mapper) là một tiện ích mã nguồn mở và
miễn phí dùng để khai thác thông tin mạng và kiểm tra bảo mật được phát triển
bởi Floydor Vaskovitch. Nmap được sử dụng để xác định xem thiết bị nào đang
chạy trên hệ thống, cũng như tìm kiếm ra các máy chủ có sẵn và các dịch vụ
mà các máy chủ này cung cấp, đồng thời dò tìm các cổng mở và phát hiện các nguy cơ về bảo mật. Các tính năng của Nmap: Máy quét cổng Quét hệ điều hành Lập bản đồ mạng
Zenmap, GUI Ưu điểm của Nmap:
• Linh hoạt: Hỗ trợ hàng chục kỹ thuật tiên tiến cho việc tạo lập sơ đồ
mạng với các thống kê về bộ lọc IP, firewall, router và các thành phần
khác. Với bao gồm nhiều cơ chế kĩ thuật port scanning (cả TCP và
UDP), phát hiện hệ điều hành và phiên bản và nhiều thứ hay ho khác. 7 lOMoARcPSD| 36477832
• Tính phổ biến: Hỗ trợ hầu hết các hệ điều hành bao gồm Linux,
Microsoft Windows, FreeBSD, OpenBSD, Solaris, IRIX, Mac OS X,
HP-UX, NetBSD, Sun OS, Amiga và nhiều hệ điều hành khác nữa.
• Sự hiệu quả: Nmap được thiết kế để nhanh chóng quét các mạng lớn
với hàng trăm nghìn máy nhưng đạt hiệu suất cao với một máy chủ
duy nhất. Nmap có thể hoạt động trên rất nhiều các hệ điều hành quen
thuộc như Linux, Windows và Mac OS X.
• Miễn phí: Mục tiêu chính của dự án Nmap là giúp internet trở nên an
toàn hơn và cung cấp cho quản trị viên (hoặc hacker) một công cụ để
khai thác mạng. Nmap hoàn toàn miễn phí đi kèm mã nguồn đầy đủ,
bạn có thể tải về, sửa đổi và phân phối lại theo các điều khoản của license.
• Hỗ trợ: Nmap là tiện ích mã nguồn mở, vì vậy nó được cộng đồng
các nhà phát triển và người dùng hỗ trợ rất tốt. Hầu hết các tương tác
được gửi về mail Nmap. Nhược điểm của Nmap:
• Phạm vi quét của Nmap rất rộng nên sẽ mất một khoảng thời gian lớn để hoàn thành.
• Các chức năng của Nmap không có sẵn với Windows. 1.2.3. Google Dorks
Google Dork là kỹ thuật đưa các truy vấn tìm kiếm nâng cao vào công
cụ tìm kiếm của Google để tìm kiếm dữ liệu nhạy cảm như tên người dùng, mật
khẩu, tệp nhật ký của các trang web mà Google đang lập chỉ mục do cấu hình
sai trang web. Dữ liệu này được hiển thị công khai và trong một số trường hợp, có thể tải xuống.
Một tìm kiếm thông thường của Google liên quan đến một từ khóa gốc,
câu hoặc câu hỏi. Tuy nhiên, trong Google Dork, kẻ tấn công sử dụng các toán
tử đặc biệt để tăng cường tìm kiếm và ra lệnh cho trình thu thập thông tin web
cắt các tệp hoặc thư mục rất cụ thể trên internet. Trong hầu hết các trường hợp,
chúng là tệp nhật ký hoặc cấu hình sai trang web.
Những truy vấn được sử dụng trong Google Dork: 8 lOMoARcPSD| 36477832
• Inurl: Xác định trình thu thập thông tin để tìm kiếm các URL có
chứa một từ khóa được chỉ định.
• Allintext: Tham số này tìm kiếm văn bản do người dùng chỉ định trong một trang web.
• Filetype: Tham số này yêu cầu trình thu thập thông tin tìm kiếm
và hiển thị một loại tệp cụ thể.
• Site: Liệt kê tất cả các URL được lập chỉ mục cho trang web được chỉ định. • …. 9 lOMoARcPSD| 36477832
CHƯƠNG 2: THỰC NGHIỆM
2.1. Chương trình triển khai. 2.1.1. Get_banner.
Hàm get_banner() nhận một đối số là url , hàm này bao gồm các chức năng:
- Lấy ra các header quan trọng tồn tại trong header.txt mà website trả về trong response.
- Tìm kiếm các lỗ hổng đã được công bố của server web.
- Tìm kiếm các tệp cấu hình nhạy cảm trên website.
- Lấy ra các thể input, meta và các link trên website mục tiêu. 10 lOMoARcPSD| 36477832 2.1.2. Fuzzing.
Hàm brute_force_page() nhận 4 đối số là url, path, processes, mod bao gồm các chức năng:
- Trước tiên hàm load_file() nhận hai đối số url, path để tạo ra một danh sách chứa
các payload phục vụ cho việc fuzzing.
- Tiếp đến hàm sẽ fuzzing bằng cách gửi các request lên website và sau đó phân tích
response trả về từ đó phát hiện lỗi.
- Ngoài ra đối số processes sẽ cho phép tăng tốc độ fuzzing bằng các chạy đa luồng
gửi nhiều request trong một lần.
- Đối số mod sẽ giúp người dùng chuyển qua các hình thức fuzzing khác được hỗ trợ như sqli và xss.
• Mod = none sẽ tương ứng với việc quét các page ẩn trên web.
• Mod = sqli sẽ fuzz các payload được truyền vào và dựa vào phản hồi của
ứng dụng để phát hiện lỗ hổng.
• Mod = xss sẽ fuzz các payload xss và phát hiện lỗ hổng dựa trên phản hồi. 11 lOMoARcPSD| 36477832 2.1.3. Google_dork.
Hàm google_dork() nhận vào đối số query sẽ có chức năng tìm kiếm nâng cao
với google bằng các từ khóa như : intext, inurl, intitle, site, link,… 2.1.4. Nmap scan.
Hàm nmap_scan_host() nhận vào hai đối số là host_scan và portlist thực hiện
chứa năng quét host_scan tương ứng được đưa vào cùng với danh sách cổng và trả về
các cổng dịch vụ mở cùng với các thông số hệ điều hành của hệ thống mục tiêu. 12 lOMoARcPSD| 36477832 2.2. Thực nghiệm.
2.2.1. Phân tích dữ liệu web.
Query: python tool_scan_web.py -u http://testphp.vulnweb.com/ 13 lOMoARcPSD| 36477832
2.2.2. Thực hiện fuzzing.
Query: python tool_scan_web.py -r db/logins.txt -P 10 -u http://testphp.vulnweb.com/
Query: python tool_scan_web.py -r db/sqli.txt -P 10 -m sqli
-u http://testphp.vulnweb.com/listproducts.php?cat=1
2.2.3. Tìm kiếm với Google Dork.
Query: python tool_scan_web.py -q 'inurl:/etc/passwd' 14 lOMoARcPSD| 36477832
2.2.4. Quét cổng với nmap.
Query: python tool_scan_web.py -u http://testphp.vulnweb.com/ -p22,23,80,443 KẾT LUẬN
A. Những kết quả đạt được của bài tập môn học
- Rèn luyện khả năng làm việc nhóm khi các thành viên cùng nhau hoàn thành bài tập này.
B. Hướng phát triển tiếp theo và đề xuất 15 lOMoARcPSD| 36477832
- Ứng dụng những kiến thức đã học Fuzzing và các phương pháp kiểm thử khác để
làm nền tảng cho học tập và công việc sau này. 16 lOMoARcPSD| 36477832
TÀI LIỆU THAM KHẢO
Những tài liệu tham khảo để thực hiện được đề tài.
[1]. https://en.wikipedia.org/wiki/Fuzzing
[2]. https://viblo.asia/p/tim-hieu-ve-fuzz-testing-YWOZrDzv5Q0 [3]. 17