CHƯƠNG I: BIỂU THỨC CHÍNH QUY 1.1 Khái niệm Regular Expression hay còn gọi là biểu thức chính quy được dùng để xử lý chuỗi nâng cao thông qua biểu thức riêng của nó, những biểu thức này
Trang 1MỤC LỤC
MỤC LỤC 2
DANH MỤC HÌNH ẢNH 4
DANH MỤC BẢNG 5
CHƯƠNG I: BIỂU THỨC CHÍNH QUY 6
1.1 Khái niệm 6
1.2 Biểu diễn 7
1.2.1 Literal character 7
1.2.2 Các ký tự biểu diễn – Meta 7
1.2.3 Các cờ 12
1.3 Ví dụ về cách sử dụng biểu thức chính quy 12
CHƯƠNG II: TẤN CÔNG SQL INJECTION 14
2.1 Khái niệm 14
2.2 Hậu quả 15
2.3 Cách phòng chống 16
CHƯƠNG III: MODSECURITY 18
3.1 Giới thiệu Modsecurity 18
3.2 Khả năng của ModSecurity 18
3.3 Hoạt động của ModSecurity 19
3.4 Cấu trúc Modsecurity 21
3.4.1 Nội dung của rules trong Modsecurity 21
3.4.2 Thành phần trong một rule 21
3.4.3 Logging 25
3.5 Biểu thức chính quy trong ModSecurity 27
CHƯƠNG IV: THỰC HIỆN TẤN CÔNG SQL INJECTION VÀ NGĂN CHẶN BẰNG BIỂU THỨC CHÍNH QUY TRONG MODSECURIY 30
3.1 Chuẩn bị 30
3.2 Cài dặt ModSecurity 30
Trang 23.3 Thực hiện tấn công 32 3.4 Xây dựng luật áp dụng biểu thức chính quy để ngăn chặn tấn công SQL injection 37
TÀI LIỆU THAM KHẢO 40
Trang 3DANH MỤC HÌNH ẢNH
Hình 1 Biểu thức chính quy 6
Hình 2 Biểu diễn biểu thức chính quy 7
Hình 3 Tấn công SQL injection 14
Hình 4 Cách phòng chống SQL injection 16
Hình 5 ModSecurity 18
Hình 6 Các phase trong hoạt động của ModSecurity 19
Hình 7 Màn hình đăng nhập DVWA 32
Hình 8 Màng hình DVWA security 33
Hình 9 Màng hình các cách tấn công DVWA 33
Hình 10 File modsedurity.conf 34
Hình 11 Kết quả tấn công SQL injection 35
Hình 12Kết quả truy vấn version 36
Hình 13 Kết quả Modsecurity bảo vệ 37
Hình 14 Kết quả truy vấn bị chặn bởi rules vừa được xây dựng 39
Trang 4DANH MỤC BẢNG
Bảng 1 Các ký tự biểu diễn Meta 8
Bảng 2 Ký hiệu tắt cho tập hợp 11
Bảng 3 Các cờ 12
Bảng 4 Biểu thức chính quy xử lý chuỗi 27
Bảng 5 Biểu thức chính quy dùng toán tử so sánh 28
Bảng 6 Biểu thức chính quy dùng toán tử so sanh đại số 28
Trang 5CHƯƠNG I: BIỂU THỨC CHÍNH QUY
1.1 Khái niệm
Regular Expression hay còn gọi là biểu thức chính quy được dùng để xử lý chuỗi nâng cao thông qua biểu thức riêng của nó, những biểu thức này sẽ có những nguyên tắc riêng và bạn phải tuân theo nguyên tắc đó thì biểu thức của bạn mới hoạt động được Ngoài cái tên gọi Regular Expression ra thì nó còn có thể viết tắt thành Regex hay RegExr
Trang 61.2 Biểu diễn
Hình 2 Biểu diễn biểu thức chính quy
Cú pháp của biểu thức chính quy gồm 2 thành phần cơ bản là Literal character (ký
tự thường) và Meta character (siêu ký tự)
1.2.1 Literal character
Literal character là một biểu thức chứa một hoặc nhiều ký tự từ a đến z dùng
để làm mẫu so sánh trùng khớp với một chuỗi nào đó
Ví dụ nếu ta có một Regex là “ello” và một chuỗi “helloworld”, regex engine sẽ tìm và so sánh với chuỗi “helloworld” để tìm sự trùng khớp, nó sẽ khớp với “ello” trong chuỗi “helloworld”
1.2.2 Các ký tự biểu diễn – Meta
Trang 7? Tùy chọn có hay không cho mẫu phía trước {n,m} Độ dài tối thiểu là n tối đa là m
(xyz) Biểu diễn một nhóm
| Biểu diễn thay thế, phép toán or
\ Biểu diễn ký tự đặc biệt [ ] ( ) { } * + ? ^ $ \ |
^ Điểm bắt đầu của dòng
Dùng [] để chứa tập hợp các ký tự Có thể dùng dấu - để biểu diễn một dải các
ký tự theo vị trí trong bảng chữ cái như a-z, 0-9 , biểu thức so sánh sẽ hợp mẫu nếu chứa bất kỳ ký tự nào trong đó (không cần quan tâm thứ tự)
Ví dụ biểu thức [ưƯ]ớc có nghĩa là: Có một chữ ư hoặc Ư, theo sau bởi ớ, tiếp theo là c
[ưƯ]ớc => Ước một điều mộng ước rất đơn sơ Nụ hôn trao hạnh phút đến bất ngờ
Nếu [] chứa thì nó biểu diễn ký tự chứ không con ý nghĩa đại diện như trường hợp trên
nh[.] => Thời gian cứ thế xoay vòng thật nhanh Bao mùa chiếc áo phông phanh!
Tập hợp ngoại trừ [^]
Trang 8Thông thường thì ^ biểu diễn điểm bắt đầu của chuỗi, tuy nhiên nếu nó nằm ở
vị trí sau dấu [ của cặp [] thì nó lại mang ý nghĩa tạo ra tập hợp ký tự loại trừ (phụ định)
Ví dụ biểu thức [^n]hanh có nghĩa là bất kỳ ký tự nào ngoại trừ ký tự n, theo sau bởi h, tiếp theo bởi a, n và h
[^n]hanh => Thời gian cứ thế xoay vòng thật nhanh Bao mùa chiếc áo phông
Lặp lại với ký tự *
Ký hiệu * cho biết có sự lặp lại 0 hoặc nhiều lần mẫu phù hợp đứng phía trước
nó Ví dụ mẫu a* có nghĩa là ký tự a lặp lại 0 hoặc nhiều lần là phù hợp Nếu nó
đi sau tập hợp thì lặp tập hợp đó lặp lại 0 hoặc nhiều lần ví dụ [a-z]* có nghĩa
là dòng có số lượng bất kỳ các ký tự chữ viết thường thì phù hợp
* có thế sử dụng với để biểu diễn bất kỳ chuỗi nào, hay dùng mẫu (.*)
* có thể sử dụng với ký tự trắng \s để biểu diễn bất kỳ khoảng trắng nào
Ví dụ \s*mình\s* có nghĩa bắt đầu bởi không hoặc nhiều khoảng trắng, tiếp theo
là ký tự m, ì, n, h tiếp theo là không hoặc nhiều khoảng trắng
"\s*mình\s*" => Đừng so sánh mình với bất cứ ai trong thế giới này
Nếu bạn làm như vậy có nghĩa bạn đang sỉ nhục chính bản thân mình Bill
Gates
Lặp lại với ký tự +
Ký hiệu + tương tự như * nhưng lặp lại 1 hoặc nhiều Ví dụ
có.+! có nghĩa ký tự bắt đầu bằng có theo sau ít nhất một ký tự nào đó, tiếp theo
Trang 9Trong biểu thức Regex thông thường ? là một tùy chọn cho biết mẫu phía trước
nó có thể có hoặc không
Ví dụ [h]?ôn nghĩa là tùy chọn có h hoặc không, theo sau là ô, tiếp theo là n [h]?ôn => Đàn bà khôn ngoan hơn đàn ông vì họ biết ít hơn, nhưng hiểu nhiều hơn
Biểu diễn độ dài {}
{} là biểu diễn số lượng, nó chỉ ra số lần mà một ký tự hoặc một nhóm các ký
tự lặp lại
Ví dụ [0-9]{2,3} có nghĩa là có tối thiểu 2 tới 3 ký tự số
Bạn có thể bỏ đi số thứ 2, ví dụ [0-9]{2,} có nghĩa là chuỗi có 2 hoặc nhiều ký
tự số Nếu bỏ đi ký tự , ví dụ [0-9]{3} có nghĩa là chuỗi chính xác có 3 ký tự
Nhóm mẫu ( )
Nhóm ký tự là một mẫu (pattern) con được viết biên trong () Ví dụ (ab)* lặp lại
ab 0 hoặc nhiều lần Chúng ta cũng dùng ký hiệu | bên trong nhóm như là phép toán or để xác định nhóm Ví dụ n(g|h) có nghĩa bắt đầu bằng n theo sau là một mẫu, mẫu đó hoặc là chữ g hoặc là chữ h
n(g|h) =>Nếu có một ai đó làm chậm bước chân của bạn, hãy nhẹ nhàng rẽ sang
hướng khác
Biểu diễn ký tự đặc biệt với \
Do một số ký hiệu đã được dùng đã biểu diễn Regex như : { } [ ] / \ + * $ ^ | ?
nên để biểu diễn các ký tự đó dùng ký hiệu \ trước ký tự
"(f|c|m)at\.?" => The fat cat sat on the mat
Bắt đầu của dòng ^
Sử dụng ^ để cho biết sẽ kiểm tra sự phù hợp nếu ký tự đầu tiên của chuỗi hợp mẫu Ví dụ ^a thì chuỗi phù hợp có dạng như abcxyz, nếu vẫn chuỗi đó nó lại không phù hợp với ^b
^(T|t)he có nghĩa là T hoặc t bắt đầu của chuỗi, theo sau là he
Trang 10Điểm kết thúc của chuỗi $
Cho biết kết thúc dòng phải thỏa mãn mẫu phía trước $
Ngược lại với ^ ví dụ (at\.)$ nghĩa là cuối chuỗi có at thì là phù hợp
"(at\.)$" => The fat cat sat on the mat
Ký hiệu tắt cho tập hợp
Bất kỳ ký tự nào ngoại trừ xuống dòng
\w Chữ,sô, và _, tương đương với: [a-zA-Z0-9_]
\W Ngoài bảng chữ cái, tương đương với: [^\w]
Lookahead ?= cho thêm vào để lọc kết quả
Ký hiệu ?= Phần đầu của biểu thức phải được tiếp nối bởi biểu thức lookahead
Ví dụ (T|t)he(?=\sfat) thì lookahead là (?=\sfat) - nghĩa là T hoặc t theo sau là
he vậy tìm được 2 kết quả Nhưng do có biểu thức lookahead, điều này thì kết quả phù hợp là chỉ lấy khi theo sau nó là chuỗi fat
Biểu thức ?! phủ định lookahead
Ký hiệu là ?!, nghĩa là lấy kết quả mà đi sau nó không có chuỗi lookahead
Biểu thức (?<= ) Lookbehind
Sử dụng để lấy các phù hợp mà đi trước là một mẫu cũ thể
Trang 11(?<=(T|t)he\s)(fat|mat) có nghĩa lấy tất cả các từ fat hoặc mat sau các từ The hoặc the
i Thiết lập không phân biệt chữ hoa chữ thường
g Tìm kiếm toàn chuỗi
m Multiline: Anchor meta character works on each line
Bảng 3 Các cờ
Các cờ này được đưa vào mẫu theo dạng /RegExp/flags
"/The/gi" => The fat cat sat on the mat
"/.(at)/" => The fat cat sat on the mat
"/.(at)/g" => The fat cat sat on the mat
1.3 Ví dụ về cách sử dụng biểu thức chính quy
Kiểm tra về tính hợp lệ của email:
^([a-z0-9_\.\+-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$
Regex trên được chia thành 3 phần
Đầu tiên là dấu ^ dùng để tìm và so sánh các ký tự đầu của chuỗi đích Kế tiếp là nhóm đầu tiên của Regex ([a-z0-9_\.\+-]+), nhóm này sẽ trùng khớp nếu như những ký tự của ta từ a đến z, từ 0 đến 9 và gồm cả các dấu như _ (dấu gạch dưới), (dấu chấm), dấu – (dấu gạch nối)
Sau đó là dấu @, đây là một literal character dùng để tìm dấu @ trong chuỗi đích Tiếp theo là nhóm thứ 2 ([\da-z\.-]+), tương tư nhóm đầu tiên nhóm này sẽ
Trang 12khớp với những ký tự từ a đến z, những ký tự số, dấu gạch dưới, dấu chấm và dấu gạch nối
Tiếp đến là dấu \., đây là một escape character dùng để gõ dấu vào trong chuỗi (dùng để tránh nhầm lẫn với dấu chấm của Regex) Sau đó đến nhóm thứ 3 ([a-z\.]{2,6}) nhóm này khớp với 2 đến 6 ký tự từ a đến z vì có những domain dạng như com.vn, com.cn hay co.uk chẳng hạn
Các chuỗi ví dụ khớp với Regex trên: email@gmail.com,
email+email@gmail.com, email.email@yahoo.com
Trang 13CHƯƠNG II: TẤN CÔNG SQL INJECTION 2.1 Khái niệm
SQL Injection là một trong những kiểu hack web bằng cách inject các mã SQLquery/command vào input trước khi chuyển cho ứng dụng web xử lí, bạn có thể login mà không cần username và password, remote execution (thực thi từ xa), dump data và lấy root của SQL server Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape, Lynx, …
Rất nhiều ông lớn từng bị dính – Sony, Microsoft UK Mọi vụ lùm xùm liên quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL Injection
Trang 142.2 Hậu quả
Hậu quả lớn nhất mà SQL Injection gây ra là: Làm lộ dữ liệu trong database Tuỳ vào tầm quan trọng của dữ liệu mà hậu quả dao động ở mức nhẹ cho đến vô cùng nghiêm trọng
Lộ dữ liệu khách hàng có thể ảnh hưởng rất nghiêm trọng đến công ty Hình ảnh công ty có thể bị ảnh hưởng, khách hàng chuyển qua sử dụng dịch vụ khác, dẫn đến phá sản v…v
Lỗ hỗng này cũng ảnh hưởng lớn đến khách hàng Do họ thường dùng chung một mật khẩu cho nhiều tài khoản, chỉ cần lộ mật khẩu một tài khoản thì các tài khoản khác cũng lộ theo
Đây cũng là lý do mình nhắc nhở phải mã hoá mật khẩu, nếu database
có bị tấn công thì người dùng cũng không bị mất mật khẩu
Trong nhiều trường hợp, hacker không chỉ đọc được dữ liệu mà còn
có thể chỉnh sửa dữ liệu Lúc này hacker có thể đăng nhập dưới vai trò admin, lợi dụng hệ thống, hoặc xoá toàn bộ dữ liệu để hệ thống ngừng hoạt động
Trang 152.3 Cách phòng chống
Hình 4 Cách phòng chống SQL injection
Không bao giờ được tin tưởng những input người dùng nhập vào: Dữ liệu luôn phải được xác thực trước khi sử dụng trong các câu lệnh SQL
Các thủ tục được lưu trữ: Những thủ tục này có thể trừu tượng hóa các lệnh SQL và xem xét toàn bộ input như các tham số Nhờ đó, nó
không thể gây ảnh hưởng đến cú pháp lệnh SQL
Các lệnh được chuẩn bị sẵn: Điều này bao gồm việc tạo truy vấn SQL như hành động đầu tiên và sau đó xử lý toàn bộ dữ liệu được gửi như những tham số
Những cụm từ thông dụng: Những cụm từ này được sử dụng để phát hiện mã độc và loại bỏ nó trước khi câu lệnh SQL được thực hiện
Thông báo lỗi đúng: Thông báo lỗi phải tuyệt đối tránh tiết lộ những thông tin/chi tiết nhạy cảm và vị trí xảy ra lỗi trên thông báo lỗi
Giới hạn quyền truy cập của người dùng đối với cơ sở dữ liệu: Chỉ những tài khoản có quyền truy cập theo yêu cầu mới được kết nối với
cơ sở dữ liệu Điều này có thể giúp giảm thiểu những lệnh SQL được thực thi tự động trên server
Hãy loại bỏ các kí tự meta như ‘”/\; và các kí tự extend như NULL,
CR, LF, … trong các string nhận được từ:
Trang 17CHƯƠNG III: MODSECURITY 3.1 Giới thiệu Modsecurity
ModSecurity là một Opensource web application firewall được Ivan Ristic phát triển dành cho Web Server Apache Ivan Ristic cũng là tác giả quyển sách “Mod Security Handbook” Ông là một người có rất nhiều kinh nghiệm trong bảo vệ Web Server Apache Ông đã có nhiều thời gian nghiên cứu Web Application Security, Web Intrusion Detection, và Security Patterns Trước khi chuyển sang lĩnh vực security, Ivan đã có nhiều năm làm việc như một Developer, System Architect, Technical Director trong phát triển phần mềm Ông là người sáng lập ra công ty ThinkingStone làm các dịch vụ liên quan đến web application security
Hình 5 ModSecurity
3.2 Khả năng của ModSecurity
Mod Security đứng trước Web Server, làm nhiệm vụ như một firewall để kiểm soát truy cập vào ra Web Server Các thông tin đi từ bên ngoài vào và bên trong
ra sẽ được kiểm soát chặt chẽ để tránh những thông tin có thể gây hại cho Web Server hay là việc rò rỉ các thông tin đặc biệt từ Web Server đến Client
Mod Security có thể thực hiện các chức năng cụ thể sau:
- Request filtering : tất cả các request gửi đến web server đều được phân tích và càn lọc (filter) trước khi chúng được đưa đến các modules khác để xử lý
- Anti-evasion techniques : paths và parameters được chuẩn hóa trước khi phân tích để chống evasion techniques
- Understanding of the HTTP protocol : ModSecurity là web application firewall nên nó có khả năng hiểu được HTTP protocol ModSecurity có khả
Trang 18năng càn lọc dựa trên các thông tin ở HTTP header hay có thể xem xét đến từng parameters hay cookies của các requests…
- POST payload analysis : ngoài việc càn lọc dựa trên HTTP header,
ModSecurity có thể dựa trên nội dung (payload) của POST request
- Audit logging : mọi request đều có thể được ghi lại (bao gồm cả POST)
để người quản trị có thể theo dõi nếu cần
- HTTPS filtering : ModSecurity có thể phân tích HTTPS
- Compressed content filtering : ModSecurity sẽ phân tích sau khi đã
decompress các request data
3.3 Hoạt động của ModSecurity
Quá trình xử lý các request của Apache và ModSecurity :
Trong ModSecurity, mỗi phiên phân tích sẽ được thực hiện lần lượt qua 5 bước (phase), tại mỗi bước ModSecurity sẽ thực thi các rule tương ứng nhằm phát hiện và phòng chống các khai thác
Trang 19ModSecurity cho phép bạn đặt rule tại một trong năm thời điểm trong chu kỳ
xử lý của Apache như sau :
- Phase Request Header : rule được đặt tại đây sẽ được thực hiện ngay sau khi Apache đọc request header, lúc này phần request body vẫn chưa được đọc Đây là bước đầu tiên trong quá trình thực hiện phân tích gói tin Mục đích của bước này nhằm cho phép người viết rule tương tác với các request trước khi thực hiện các yêu cầu trong phần HTTP body Phần này khá quan trọng để phân tích các khai thác dựa vào HTTP method cũng như dựa vào URL như SQL Injection, Reflect XSS, Local file include …
- Phase Request Body : đây là thời điểm các thông tin chức năng chung đưa vào được phân tích và xem xét, các rule mang tính application-oriented thường được đặt ở đây Bước này là quá trình kiểm tra chính trong quá trình client gởi request đến server, phần này sẽ có hiệu quả khi người dùng cố sử dụng phương thức POST hoặc PUT để upload tập tin lên phía server Việc kiểm tra này bảo đảm
dữ liệu đưa lên server là an toàn, tránh tình trạng upload mã độc hoặc các dạng tấn công như Stored XSS, Ajax Injection ModSecurity hỗ trợ ba loại mã hóa request body :
+ Application/x-www-form-urlencoded dùng để truyền form dữ liệu
+ Multipart/form-data dùng để truyền file
+ Text/xml : dùng để phân tích dữ liệu XML
- Phase Response Header : Những request đã được xử lý tại server sẽ được trả
về cho ModSecurity kiểm tra trạng thái trong phần respone header Trước khi phần respone body được đọc thì ModSecurity sẽ dựa vào tập rule để xác định có cần kiểm tra nội dung dữ liệu trong phần body hay không
Ví dụ: mã trạng thái trả về là 404 (Not found) thì lúc này sẽ không cần kiểm tra nội dung gói tin trả về
- Phase Response Body : Sau khi ModSecurity đã hoàn thành việc kiểm tra tại respone header thì nội dung trong phần body sẽ được kiểm tra so trùng với mẫu trong tập lệnh Việc này là khá hiệu quả để phát hiện và phòng chống xâm nhập trong trường hợp ở phase request header và phase request body không phát hiện được tấn công