You are on page 1of 22

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP. HCM

ĐỒ ÁN CƠ SỞ

KIỂM THỬ TRÊN PYTHON

Ngành: Công nghệ thông tin

Chuyên ngành: An toàn thông tin

Giảng viên hướng dẫn : ThS.Dương Minh Chiến

Sinh viên thực hiện : Trần Quang Trường

MSSV: 1911770446 Lớp: 19DATA1


TP. Hồ Chí Minh, 2022
LỜI CẢM ƠN
Em xin bày tỏ lòng kính trọng và biết ơn đến thầy Dương Minh Chiến đã tận tình
giúp đỡ và hướng dẫn em hoàn thành bài báo cáo này. Nhờ sự giúp đỡ nhiệt lòng của
thầy mà báo cáo đã hoàn thành đúng tiến độ đề ra.

Với hiểu biết tìm tòi của bản thân và sự chỉ bảo hướng dẫn tận tình của giảng viên
em đã cố gắng hoàn thành đồ án một cách tốt nhất có thể nhưng cũng không thể tránh
được thiếu sót. Kính mong nhận được sự đóng góp ý kiến từ thầy cô để em có thể nâng
cao cũng như bổ sung thêm kiến thức cho bản thân, hoàn thiện đồ án với một kết quả tốt
và hoản chỉnh hơn. Em xin chân thành cám ơn!
MỤC LỤC

Chương 1. TỔNG QUAN......................................................................2

1.1 Giới thiệu..........................................................................................................2

1.2 Nhiệm vụ đồ án................................................................................................2

1.3 Cấu trúc đồ án..................................................................................................2

Chương 2. CƠ SỞ LÝ THUYẾT..............................................................3

2.1 Ngôn ngữ lập trình Python...............................................................................3


2.1.1 Lịch sử hình thành.........................................................................................................................................3
2.1.2 Các khái niệm cơ bản....................................................................................................................................4
2.1.3 Các thư viện cơ bản.......................................................................................................................................7
2.1.4 Sử dụng hàm trong Python...........................................................................................................................8

2.2 Kiểm thử...........................................................................................................9


2.2.1 Pentest là gì?.................................................................................................................................................9
2.2.2 Các hình thức Pentest.................................................................................................................................10
2.2.3 Tại sao cần Pentest?....................................................................................................................................12
2.2.4 Điểm yếu của Pentest.................................................................................................................................14
2.2.5 Quy trình Pentest........................................................................................................................................15

1
Chương 1. TỔNG QUAN
1.1 Giới thiệu

Giới thiệu ngắn gọn về đề tài

nêu tóm tắt những lý thuyết, nghiên cứu trước đây có liên quan đến đề tài (có trích
dẫn tài liệu tham khảo). Phần này thường dài từ 5-7 trang đối với đồ án tổng hợp.

1.2 Nhiệm vụ đồ án

Nêu tính cấp thiết và lý do hình thành đề tài

ý nghĩa khoa học và thực tiễn, mục tiêu nghiên cứu, đối tượng, phạm vi giới hạn.
Phần này thường dài từ 1-2 trang.

1.3 Cấu trúc đồ án

Trình bày cấu trúc của đồ án gồm các chương và tóm tắt từng chương.

Phần này thường dài tối đa 1 trang.

2
Chương 2. CƠ SỞ LÝ THUYẾT
2.1 Ngôn ngữ lập trình Python
2.1.1 Lịch sử hình thành

Python đã được hình thành vào cuối những năm 1980 và được bắt đầu thực hiện
vào tháng 12/1989 bởi Guido van Rossum tại CWI tại Hà Lan như là người kế thừa của
ngôn ngữ ABC (tự lấy cảm hứng từ SETL) có khả năng xử lý ngoại lệ và giao tiếp với hệ
điều hành Amoeba. Van Rossum là tác giả chính của Python, và vai trò trung tâm của
ông tiếp tục trong việc quyết định hướng phát triển của Python được phản ánh trong tiêu
đề mà cộng đồng Python dành cho ông “Độc tài nhân từ cho cuộc sống” (benevolent
dictator for life)(BDFL).

Python 2.0 được phát hành vào ngày 16/10/2000, với nhiều tính năng chính mới
bao gồm một bộ dọn rác đầy đủ và hỗ trợ Unicode. Với phiên bản này, quá trình phát
triển đã được thay đổi và trở thành minh bạch hơn và được cộng đồng ủng hộ.

Python 3.0 (còn được gọi là Python 3000 hoặc Py3k), một bản phát hành lớn,
không tương thích ngược, được phát hành vào ngày 03/12/2008 sau một thời gian dài thử
nghiệm. Nhiều trong số các tính năng chính của nó đã được điều chỉnh để tương thích
ngược với Python 2.6 và 2.7. Các tính năng và triết lý phát triển Python là 1 ngôn ngữ lập
trình đa hình: lập trình hướng đối tượng và hướng cấu trúc được hỗ trợ đầy đủ, và có 1 số
tính năng của ngôn ngữ hỗ trợ lập trình theo chức năng và lập trình hướng khía cạnh
(Aspect-oriented programming). Nhiều mô hình khác được hỗ trợ bằng việc sử dụng các
phần mở rộng, bao gồm thiết kế theo hợp đồng (design by contract) và lập trình luận lý.

Các trang như Mozilla, Reddit, Instagram và PBS đều được viết bằng Python.

Ngôn ngữ lập trình Python được dùng vào các mục đích:

 Phát triển web (trên máy chủ)


 Phát triển phần mềm

3
 Tính toán một cách khoa học
 Lên kịch bản cho hệ thống

Tại Sao Nên Học Lập Trình Python?

 Python hỗ trợ nhiều nền tảng khác nhau (Windows, Mac, Linux, Raspberry
Pi, etc).
 Python có cú pháp đơn giản, dễ đọc hiểu và rất gần gũi với tiếng Anh.
 Cú pháp của Python giúp lập trình viên sử dụng ít dòng code để lập trình
cùng một thuật toán hơn so với các ngôn ngữ lập trình khác.
 Python sử dụng trình thông dịch để thực thi các dòng code. Do đó, những
dòng code có thể được thực thi ngay lập tức mà không cần biên dịch toàn
bộ chương trình. Như vậy giúp chúng ta kiểm tra code nhanh hơn.

Python cũng hỗ trợ hàm, thủ tục, hay kể cả lập trình hướng đối tượng.

Để viết mã nguồn Python, ta có thể sử dụng bất kỳ một trình soạn thảo nào, kể cả
những trình soạn thảo đơn giản nhất như NotePad. Tuy nhiên, để phát triển các ứng dụng
một cách hiệu quả hơn, ta nên sử dụng một IDE, để có thể tiết kiệm thời gian và công sức
viết code. ở đây chúng ta sử dụng một trong những IDE thông dụng nhất để lập trình ứng
dụng Python, đó là PyCharm IDE.

2.1.2 Các khái niệm cơ bản

Trong Python bất kỳ văn bản nào ở bên phải biểu tượng # thì sẽ được trình biên
dịch hiểu là một comment và không biên dịch phần đó.

Sử dụng càng nhiều comment hữu ích trong chương trình của bạn sẽ làm cho công
việc lập trình của bạn dễ dàng hơn:

 Giải thích các giả định.


 Giải thích các quyết định quan trọng.
 Giải thích chi tiết quan trọng.
 Giải thích vấn đề bạn đang cố gắng giải quyết.
4
 Giải thích các vấn đề đang cố gắng khắc phục trong chương trình của mình,
v.v. .

Hằng số (Literal Constants): Ví dụ về một hằng số theo nghĩa đen là một số như 5,
1. 23 hoặc một chuỗi như ‘python’hay “It’s a string!”. Nó được gọi là nghĩa đen
bởi vì sử dụng giá trị của nó theo nghĩa đen. Số 2 luôn luôn đại diện cho chính nó
và không có gì khác và nó là một hằng số vì giá trị của nó không thể thay đổi. Do
đó, tất cả những giá trị này được gọi là hằng số.

Số (Numbers): Số chủ yếu có hai loại – số nguyên (integer) và số thực (float).

Chuỗi (String): Một chuỗi là một dãy các ký tự. Chuỗi về cơ bản chỉ là một loạt
các từ.

Biến: Biến chính xác như tên gọi của nó, tức là giá trị của nó có thể thay đổi. Các
biến có thể giúp lưu trữ bất cứ cái gì nếu có thể định nghĩa được nó. Các biến chỉ
là một phần của bộ nhớ máy tính nơi lưu trữ một số thông tin.

Đối tượng(Object): Python đề cập đến bất cứ điều gì được sử dụng trong một
chương trình như là một đối tượng.

Việc tổ chức, quản lý và lưu trữ dữ liệu rất quan trọng vì nó cho phép truy cập dễ
dàng hơn và sửa đổi hiệu quả. Cấu trúc dữ liệu (Data Structure) cho phép bạn sắp xếp dữ
liệu của mình theo cách cho phép bạn lưu trữ các bộ dữ liệu được thu thập, liên quan đến
chúng và theo đó mà thực hiện các thao tác trên chúng.

Python có hỗ trợ ngầm cho Cấu trúc dữ liệu cho phép lưu trữ và truy cập dữ liệu.
Các cấu trúc này được gọi là List, Dictionary, Tuple và Set.

Python cho phép người dùng tạo Cấu trúc dữ liệu của riêng họ, cho phép toàn
quyền kiểm soát chức năng. Các cấu trúc dữ liệu nổi bật nhất là Stack, Queue, Tree,
Linked List, v.v. đồng thời cũng có sẵn trong các ngôn ngữ lập trình khác.

Cấu trúc dữ liệu tích hợp (Built-in Data Structures)

5
Về cấu trúc dữ liệu trong Python, các Cấu trúc dữ liệu này được tích hợp sẵn với
Python giúp lập trình dễ dàng hơn và giúp các lập trình viên sử dụng chúng để có được
các giải pháp nhanh hơn. Và có các kiểu cấu trúc dữ liệu là:

List: Được sử dụng để lưu trữ dữ liệu của các loại dữ liệu khác nhau một cách
tuần tự. Có các địa chỉ được gán cho mọi thành phần của danh sách, được gọi là Index.
Giá trị chỉ mục bắt đầu từ 0 và tiếp tục cho đến khi phần tử cuối cùng được gọi là chỉ số
dương. Dictionary: Được sử dụng để lưu trữ các cặp key-value. Để hiểu rõ hơn,
hãy nghĩ đến một thư mục điện thoại nơi hàng trăm và hàng ngàn tên và số tương ứng của
chúng đã được thêm vào. Bây giờ các giá trị không đổi ở đây là Tên và Số điện thoại
được gọi là các phím. Và các tên và số điện thoại khác nhau là các giá trị đã được đưa
vào các phím. Nếu truy cập các giá trị của các phím, sẽ nhận được tất cả tên và số điện
thoại. Vì vậy, đó là những gì một cặp key-value. Và trong Python, cấu trúc này được lưu
trữ bằng Dictionary Set: Là một tập hợp các yếu tố không có thứ tự là duy nhất. Có nghĩa
là ngay cả khi dữ liệu được lặp lại nhiều lần, nó sẽ chỉ được nhập vào tập hợp một lần.

Tuple (các bộ dữ liệu): Tuples giống như các list với ngoại lệ là dữ liệu một khi
được nhập vào bộ dữ liệu không thể thay đổi bất kể điều gì. Ngoại lệ duy nhất là khi dữ
liệu bên trong Tuple có thể thay đổi, chỉ sau đó dữ liệu Tuple có thể được thay đổi.

Python luôn chạy một loạt các câu lệnh theo thứ tự từ trên xuống một cách chính
xác. Câu lệnh điều khiển là loại câu lệnh được dùng để điều khiển luồng chạy của các câu
lệnh khác trong chương trình.

Điều này đạt được bằng cách sử dụng các câu lệnh điều khiển. Có 3 lệnh kiếm soát
cấu trúc điều khiển của Python là: if, for và while.

If được sử dụng để kiểm tra một điều kiện: nếu điều kiện là đúng sẽ chạy một khối
các câu lệnh (được gọi là if-block), nếu sai chương trình sẽ xử lý một khối các câu lệnh
khác (được gọi là else-block ).

For . . in là một câu lệnh lặp khác, nó lặp đi lặp lại qua một chuỗi (sequences) các
đối tượng tức là đi qua từng mục trong một chuỗi. Chúng ta sẽ tìm 25 hiểu nhiều hơn về
6
sequences trong bài về cấu trúc dữ liệu trong Python sau. Những gì bạn cần biết ngay bây
giờ là một chuỗi trình từ chỉ là một tập hợp các items.

Kết quả Vòng lặp for trong Python hoàn toàn khác với vòng lặp trong C / C ++.
vòng lặp for trong Python tương tự như vòng lặp foreach trong C#. Trong C / C ++, nếu
bạn muốn viết for(int i = 0; i<5;i++), thì trong Python bạn chỉ cần viết for i in
range(0,5).

Vòng lặp for đơn giản, biểu cảm hơn và ít bị lỗi hơn trong Python.

While cho phép liên tục thực thi một khối các câu lệnh miễn là điều kiện là đúng.
Một câu lệnh while là một ví dụ về cái được gọi là câu lệnh lặp. Một câu lệnh while có
thể có một mệnh đề khác tùy chọn.

2.1.3 Các thư viện cơ bản

Pip là công cụ quản lý các gói thư viện python (Python package manager). Với
việc sử dụng pip, ta sẽ dễ dàng cài đặt các gói thư viện cần thiết trong quá trình làm việc
với Python.

Matplotlib là một thư viện xây dựng các khối cần thiết để tạo các biểu đồ chất
lượng từ mảng và trực quan và tương tác với chúng.

NumPy là một “ngựa kéo” phân tích thực sự của Python. Nó cung cấp cho người
dùng cách làm việc với các mảng nhiều chiều, cùng một số lượng lớn các hàm để xử lý
trên các toán tử toán học nhiều chiều trên các mảng đó. Mảng là các khối dữ liệu được
sắp xếp theo nhiều chiều dựa trên các véc tơ và ma trận trong toán học. Mảng thường hữu
ích không chỉ trong việc lưu dữ liệu mà cả việc tính toán nhanh các ma trận, điều không
thể thiếu khi giải quyết các vấn đề liên quan đến khoa học dữ liệu.

SciPy là một dự án gốc bởi Travis Oliphant, Pearu Peterson, and Eric Jones, SciPy
hoàn thiện các tính năng của NumPy, nhằm cung cấp các thuật toán cho đại số tuyến tính,
không gian ma trận, xử lý tín hiệu và xử lý ảnh, tối ưu, biến đổi Fourier, …

7
Pandas là thư viện thực hiện mọi thứ mà NymPy và SciPy không thể làm. Nó làm
việc với các đối tượng cấu trúc dữ liệu, DataFrames và Chuỗi (Series). pandas cho phép
bạn có thể xử lý các bảng dữ liệu phức tạp của nhiều loại khác nhau (điều mà các mảng
của NumPy thông thể làm được) và chuỗi thời gian. Bạn sẽ dễ dàng tải dữ liệu từ nhiều
nguồn khác nhau, sau đó slide, dice, xử lý các thành phần còn thiếu, thêm, đổi tên, tổng
hợp (aggregate), reshape và cuối cùng là trực quan dữ liệu theo ý của bạn.

Scikit-learn là lõi hoạt động của khoa học dữ liệu trên Python. Nó cung cấp tất cả
những gì bạn cần để tiền xử lý dữ liệu, học giám sát và không giám sát, lựa chọn mô
hình, validate và error metrics.

IPython được tạo bởi Fernando Perez để giải quyết việc cần thiết một lệnh Shell
Python (dựa trên shell, trình duyệt web, và giao diện ứng dụng) với đồ họa tích hợp, các
lệnh có thể tùy chỉnh, lịch sử phong phú (dưới định dạng JSON) và khả năng tính toán
song song để cải thiện hiểu năng tính toán.

2.1.4 Sử dụng hàm trong Python

Hàm (Function) là những phần tái sử dụng của chương trình. Chúng cho phép đặt
tên cho một khối các câu lệnh, cho phép chạy khối đó bằng cách sử dụng tên được chỉ
định ở bất kỳ đâu trong chương trình với số lần không hạn chế. Điều này được gọi là gọi
hàm. Các Hàm được xác định bằng cách sử dụng từ khóa “def“. Sau khi từ khóa này xuất
hiện một tên định danh cho hàm, theo sau là một cặp dấu ngoặc đơn có thể kèm theo một
số tên của các biến và bởi dấu hai chấm cuối cùng kết thúc dòng. Tiếp theo sau là khối
các câu lệnh của Hàm.

Một hàm có thể lấy tham số, là các giá trị bạn cung cấp cho hàm để hàm có thể sử
dụng các giá trị đó cho một mục đích cụ thể. Các tham số này giống như các biến ngoại,
trừ các giá trị của các biến này được xác định khi chúng ta gọi hàm và đã được gán các
giá trị khi hàm chạy.

Các tham số được chỉ định trong cặp dấu ngoặc trong khai báo hàm, được phân
tách bằng dấu phẩy. Khi chúng ta gọi hàm, chúng ta cung cấp các giá trị theo cùng một
8
cách. Lưu ý thuật ngữ được sử dụng – các tên được đưa ra trong định nghĩa hàm được gọi
là tham số trong khi các giá trị bạn cung cấp trong lệnh gọi hàm được gọi là đối số.

Lệnh return thường được dùng để thoát hàm và trở về nơi mà tại đó hàm được
gọi. Lệnh này có thể chứa biểu thức được tính toán và giá trị trả về. Nếu không có biểu
thức nào trong câu lệnh hoặc không có lệnh return trong hàm thì hàm sẽ trả về None.
Lệnh return dùng để trả về một giá trị (hoặc một biểu thức), hoặc đơn giản là trả về
"không gì cả". Khi lệnh return được thực thi, hàm sẽ kết thúc. return là lệnh không bắt
buộc phải có trong thân hàm.

Chuỗi đầu tiên ngay sau tiêu đề hàm được gọi là docstring (documentation string),
nó được dùng để giải thích chức năng cho hàm. Mặc dù docstring là không bắt buộc,
nhưng việc giải thích ngắn gọn về chức năng của hàm sẽ giúp người dùng sau khi gọi
hàm có thể hiểu ngay hàm sẽ làm gì mà không cần phải tìm lại định nghĩa hàm để xem
xét.

Việc thêm tài liệu cho code giúp sau khi quay trở lại có thể nhớ được chi tiết, rõ
ràng đoạn code đã viết trước đó mà không có sai sót gì.

Python có một tính năng tiện lợi gọi là chuỗi tài liệu, thường được gọi bằng tên
ngắn hơn của nó docstrings. DocStrings là một công cụ quan trọng mà bạn nên sử dụng
vì nó giúp ghi lại chương trình tốt hơn và dễ hiểu hơn. Chúng ta thậm chí có thể in hoặc
sử dụng các chuỗi này trong các hàm.

2.2 Kiểm thử


2.2.1 Pentest là gì?

Pentest, viết tắt của penetration testing (kiểm tra xâm nhập), là hình thức đánh
giá mức độ an toàn của một hệ thống IT bằng các cuộc tấn công mô phỏng thực tế. Hiểu
đơn giản, pentest cố gắng xâm nhập vào hệ thống để phát hiện ra những điểm yếu tiềm
tàng của hệ thống mà tin tặc có thể khai thác và gây thiệt hại.

9
Mục tiêu của pentest là giúp tổ chức phát hiện càng nhiều lỗ hổng càng tốt, từ đó
khắc phục chúng để loại trừ khả năng bị tấn công trong tương lai. Người làm công việc
kiểm tra xâm nhập được gọi là pentester.

Pentest có thể được thực hiện trên hệ thống máy tính, web app, mobile app, hạ
tầng mạng, IoT, ứng dụng và hạ tầng cloud, phần mềm dịch vụ SaaS, API, source code,
hoặc một đối tượng IT có kết nối với internet và có khả năng bị tấn công… nhưng phổ
biến nhất là pentest web app và mobile app. Những thành phần trên được gọi là đối tượng
kiểm thử (pentest target).

Khi thực hiện xâm nhập, pentester cần có được sự cho phép của chủ hệ thống hoặc
phần mềm đó. Nếu không, hành động xâm nhập sẽ được coi là hack trái phép. Thực tế,
ranh giới giữa pentest và hack chỉ là sự cho phép của chủ đối tượng. Vì thế, khái niệm
pentest có ý nghĩa tương tự như ethical hacking (hack có đạo đức), pentester còn được
gọi là hacker mũ trắng (white hat hacker).

Để hiểu rõ hơn về Pentest, ta cần hiểu rõ ba khái niệm cơ bản trong bảo mật là
“vulnerabilities”, “exploits”, và “payloads”

 Lỗ hổng (vulnerabilities) là những điểm yếu bảo mật của một phần mềm,
phần cứng, hệ điều hành, hay ứng dụng web cho phép kẻ tấn công một cơ
sở để tấn công hệ thống. Lỗ hổng có thể đơn giản như mật khẩu yếu, hay
phức tạp như lỗ hổng SQL hoặc tràn bộ nhớ đệm.
 Khai thác (exploits) là hành động lợi dụng một lỗ hổng, sự cố hay lỗi của
phần mềm, đoạn dữ liệu hay một chuỗi các lệnh nhằm gây ra hành vi bất
thường không mong muốn xảy ra trên một hệ thống máy tính. Những hành
vi đó bao gồm leo thang đặc quyền, đánh cắp thông tin nhạy cảm, tấn công
từ chối dịch vụ, v.v.
 Trọng tải (payloads) là một phần của hệ thống đang tồn tại lỗ hổng và là
mục tiêu để khai thác.

10
2.2.2 Các hình thức Pentest

White box Testing: Trong hình thức pentest white box, các chuyên gia kiểm thử
được cung cấp đầy đủ thông tin về đối tượng mục tiêu trước khi họ tiến hành kiểm thử.
Những thông tin này bao gồm: địa chỉ IP, sơ đồ hạ tầng mạng, các giao thức sử dụng,
hoặc source code.

Ưu điểm:

 Nó đảm bảo rằng tất cả các đường dẫn độc lập của một mô-đun đã được
thực hiện.
 Nó đảm bảo rằng tất cả các quyết định hợp lý đã được xác minh cùng với
giá trị đúng và sai của chúng.
 Nó phát hiện ra các lỗi đánh máy và kiểm tra cú pháp.
 Nó tìm thấy các lỗi thiết kế có thể xảy ra do sự khác biệt giữa luồng logic
của chương trình và thực thi thực tế.

Gray box Testing: Pentest gray box là hình thức kiểm thử mà pentester nhận
được một phần thông tin của đối tượng kiểm thử, ví dụ URL, IP address,… nhưng không
có hiểu biết đầy đủ hay quyền truy cập vào đối tượng.

Ưu điểm:

 Vì người kiểm tra không yêu cầu quyền truy cập của mã nguồn, nó không
xâm phạm và không thiên vị.
 Vì có sự khác biệt rõ ràng giữa nhà phát triển và người thử nghiệm, nên ít
có nguy cơ xảy ra xung đột cá nhân.
 Bạn không cần cung cấp thông tin nội bộ về các chức năng của chương
trình và các hoạt động khác

Black box Testing: Pentest black box, hay còn gọi là ‘blind testing’, là hình thức
pentest dưới góc độ của một hacker trong thực tế. Với hình thức này, các chuyên gia
kiểm thử không nhận được bất kỳ thông tin nào về đối tượng trước khi tấn công. Các

11
pentester phải tự tìm kiếm và thu thập thông tin về đối tượng để tiến hành kiểm thử. Loại
hình pentest này yêu cầu một lượng lớn thời gian tìm hiểu và nỗ lực tấn công, nên chi phí
không hề rẻ.

Ưu điểm:

 Người kiểm thử không nhất thiết phải là một chuyên gia, vì nó không đòi
hỏi kiến thức ngôn ngữ cụ thể.
 Người kiểm tra xác minh mâu thuẫn trong hệ thống thực tế và thông số kỹ
thuật.
 Kiểm tra thường được tiến hành với quan điểm của người dùng, không phải
người thiết kế

Nhược điểm:

 Các loại trường hợp thử nghiệm rất khó thiết kế.
 Có thể, nó không có giá trị vì nhà thiết kế đã tiến hành một test case.
 Nó không tiến hành mọi thứ.

Ngoài ra còn các hình thức pentest khác như: double-blind testing, external
testing, internal testing, targeted testing tuy nhiên chúng không phổ biến tại Việt Nam và
chỉ được sử dụng với nhu cầu đặc thù của một số doanh nghiệp.

2.2.3 Tại sao cần Pentest?

Ngày nay, dưới sự phát triển của công nghệ, kiểm tra thâm nhập đã trở thành một
mô-đun không thể thiếu trong hệ thống an toàn thông tin của nhiều doanh nghiệp.

Penetration Testing (kiểm tra thâm nhập) là giải pháp hiệu quả để bảo mật cho
web, mobile app, network, IoT,… khỏi cuộc tấn công của tin tặc. Thông qua các cuộc tấn
công mô phỏng thực tế, các kỹ sư kiểm thử có thể tìm ra những điểm yếu bảo mật của hệ
thống. Qua đó giúp doanh nghiệp vá lỗ hổng kịp thời, trước khi tin tặc khai thác chúng và
gây thiệt hại về tiền bạc, danh tiếng cho tổ chức.

12
Theo đơn vị nghiên cứu thị trường Market Watch, dung lượng thị trường Pentest
vào năm 2018 là 920 triệu USD, sẽ tăng lên 2420 triệu USD vào năm 2025 với tốc độ
tăng trưởng 14,9% trong giai đoạn 2019 – 2025. Nhu cầu dành cho việc kiểm tra sức
chống chịu của hệ thống trước tội phạm mạng là rất lớn. Lý do giải thích cho sự tăng
trưởng này đến từ bốn yếu tố:

 Phát triển web app, mobile app gia tăng


 Xu hướng chuyển đổi số
 Phần mềm SaaS
 Pentest là hình thức phòng ngừa chủ động hiệu quả

Khi thực hiện pentest định kỳ và đúng cách, doanh nghiệp có thể đạt được những
mục tiêu bảo mật quan trọng:

 Tăng cường an ninh cho ứng dụng web, mobile, network, IoT, API, hệ
thống cloud, SaaS, phần cứng, v.v. Giảm thiểu tối đa khả năng bị hacker
xâm nhập trái phép và gây thiệt hại;
 Các nhà lãnh đạo có cài nhìn toàn cảnh về an ninh ứng dụng & sản phẩm
công nghệ của tổ chức;
 Ước tính thiệt hại mà một cuộc tấn công thực tế có thể gây ra;
 Bảo mật cơ sở dữ liệu, các thông tin quan trọng của doanh nghiệp và thông
tin người dùng;
 Giúp hệ thống hoạt động ổn định, giảm thiểu khả năng bị tấn công gây gián
đoạn;
 Tìm được các lỗ hổng nguy hiểm mà công cụ/phần mềm phòng thủ tự động
khó phát hiện ra;
 Đảm bảo tiêu chuẩn bảo mật của từng ngành cụ thể (PCI DSS, HIPAA, ISO
27001,…);
 Củng cố niềm tin cho khách hàng, đối tác, nhà đầu tư.

13
Các tổ chức được khuyến cáo thực hiện pentest định kỳ theo chu kỳ hàng năm
hoặc quý để đảm bảo an ninh cho hệ thống IT bao gồm hạ tầng mạng và các ứng dụng.
Bên cạnh việc triển khai pentest định kỳ, kiểm tra xâm nhập sẽ cần thiết mỗi khi doanh
nghiệp:

 Có thêm hạ tầng mạng hoặc ứng dụng mới;


 Cập nhật hay điều chỉnh đáng kể các ứng dụng và hạ tầng;
 Chuyển văn phòng sang địa điểm mới và cài đặt lại hệ thống;
 Cập nhật bản vá bảo mật mới;
 Điều chỉnh chính sách bảo mật cho người dùng cuối.

Tuy nhiên, pentest không phải dành cho tất cả mọi tổ chức. Cần xem xét các yếu
tố sau trước khi thực hiện pentest:

 Quy mô công ty. Những công ty xuất hiện online thường xuyên hơn sẽ có
nhiều vector tấn công và trở nên hấp dẫn hơn với tin tặc.
 Các công ty có hạ tầng trên cloud có khả năng sẽ không được phép thực
hiện pentest hạ tầng cloud. Tuy nhiên nhà cung cấp sẽ có nghĩa vụ phải
thực hiện pentest định kỳ để đảm bảo an ninh cho khách hàng sử dụng tài
nguyên đám mây của họ.
 Chi phí pentest không hề thấp, vì thế các công ty có ngân sách an ninh
mạng hạn hẹp sẽ khó có thể thực hiện định kỳ.

2.2.4 Điểm yếu của Pentest

Mặc dù Pentest là một giải pháp hiệu quả để chống lại các cuộc tấn công mạng có
chủ đích. Nhưng không có phương pháp nào là hoàn hảo tuyệt đối. Dưới đây là một số
mặt hạn chế của Kiểm thử thâm nhập:

Chi phí cao: Đối với dịch vụ pentest thông thường, doanh nghiệp sẽ phải trả phí
theo giờ hoặc ngày công làm việc của pentester, và chi phí này không hề thấp. Thực tế

14
nhiều doanh nghiệp có nhu cầu bảo mật web app, mobile app nhưng việc chi một khoản
tiền quá lớn cho pentest là một rào cản.

Thiếu tính đa dạng: Thông thường đội ngũ pentest chỉ bao gồm tối đa 3-5 người,
và họ thường kiểm tra theo một quy trình có sẵn, lặp đi lặp lại. Trong khi tin tặc ngoài
thực tế không bị bó buộc vào bất kỳ một quy trình nào, và số lượng kẻ xấu là rất nhiều.

Khó tích hợp nền tảng: Các pentest thông thường sẽ tạo ra một báo cáo dài với
các lỗ hổng được liệt kê. Không có sự tích hợp nào trong vòng đời phát triển phần mềm,
và điều này làm tăng thêm chi phí hoạt động và làm chậm tốc độ của cả việc khắc phục
và phát triển ứng dụng.

Pentest cộng đồng được cho là giải pháp hiệu quả để khắc phục những yếu điểm
trên. Với Pentest cộng đồng, doanh nghiệp có thể tiếp cận hàng trăm chuyên gia bảo mật,
pentester hay hacker mũ trắng để tìm lỗi cho sản phẩm. Hơn nữa, mô hình tính phí Bug
bounty (trả tiền theo lỗi) cho phép doanh nghiệp tối ưu hiệu quả đầu tư với cùng mức chi
phí so với Pentest truyền thống.

2.2.5 Quy trình Pentest

Có nhiều phương pháp và cách tiếp cận khác nhau khi nói tới quy trình kiểm thử
xâm nhập. Tuy nhiên chúng đều theo một tư duy chung gồm 4 bước cơ bản: thu thập
thông tin về đối tượng – nghiên cứu các phương án khả thi – khai thác lỗ hổng & xâm
nhập – báo cáo.

1. Reconnaissance
2. Enumerate
3. Exploit
4. Documentation

Thu thập thông tin

Đây là giai đoạn pentester thu thập tất cả những thông tin cần thiết về đối tượng.
Quá trình này ảnh hưởng to lớn đến kết quả kiểm thử của chuyên gia. Nếu thu thập thông

15
tin chính xác sẽ giúp rút ngắn thời gian kiểm thử đi nhiều lần. Những thông tin có thể thu
thập bao gồm: địa chỉ website, loại máy chủ, địa điểm đặt máy chủ, các đường link, tiêu
chuẩn mã hóa, thông tin liên hệ, email, số điện thoại,… Các công cụ được sử dụng rất đa
dạng, có thể là Google Search hay các công cụ chuyên sâu như Nmap, Wireshark. Đôi
khi các pentester cũng phân tích source code của website để tìm kiếm thông tin.

Xác định các cổng truy cập

Việc tiếp theo là xác định toàn bộ các cổng cho phép truy cập vào ứng dụng. Ở
bước này, pentester sẽ sử dụng kinh nghiệm và các công cụ hỗ trợ để tìm ra những cổng
khả thi giúp truy cập vào phần mềm. Những công cụ thường được sử dụng là Nmap,
Wireshark.

Khai thác lỗ hổng và xâm nhập

Sau khi đã có đầy đủ thông tin và các cổng truy cập, pentester thực hiện khai thác
các lỗ hổng để có được quyền truy cập vào ứng dụng web/mobile.

Gửi báo cáo lỗ hổng và PoC

Khi đã xâm nhập thành công, các pentester cần gửi báo cáo lỗ hổng cho đơn vị chủ
quản của hệ thống để tiến hành xác minh và đánh giá mức độ nghiêm trọng. Ở bước này,
pentester cần viết một PoC.

PoC (Proof of Concept) là một bản mô phỏng cuộc tấn công khai thác lỗ hổng
trong thế giới thực. Một đoạn mã được viết phục vụ việc mô phỏng được gọi là PoC
code. Nếu PoC code bị phát tán rộng rãi trước khi có bản vá bảo mật, sẽ trở thành một
Zero-day exploit.

Quá trình pentest hoàn tất khi hai bên (Pentester và Doanh nghiệp) thống nhất báo
cáo cuối cùng về các lỗ hổng và mức độ ảnh hưởng của nó tới phần mềm hoặc hệ thống.

Nhiều pentester tìm ra lỗ hổng nguy hiểm, nhưng không chứng minh được mức độ
ảnh hưởng của lỗ hổng đó tới tổ chức, thì sẽ không được đánh giá cao. Bởi vậy, việc

16
chứng minh mức độ ảnh hưởng của lỗ hổng rất quan trọng trong quá trình đám phán, và
pentester cần tìm hiểu kỹ về tổ chức để trao đổi dễ dàng hơn về phạm vi ảnh hưởng.

17
Chương 3. KẾT QUẢ THỰC NGHIỆM

18
Chương 4. KẾT LUẬN VÀ KIẾN NGHỊ
Nêu những kết luận chung, khẳng định những kết quả đạt được, những đóng góp, đề xuất
mới và kiến nghị (nếu có). Phần kết luận cần ngắn gọn (1-2 trang).

19

You might also like