Lời cảm ơn
Lời đầu tiên em muốn gửi là lời biết ơn chân thành tới thày Nguyễn Hải Châu.
Trong suốt thời gian thực hiện khóa luận thày đã tạo điều kiện cho em về thời gian và
những sự giúp đỡ quý báu về kiến thức, sự chỉ dẫn, định hướng và tài liệu tham khảo
quý báu. Và sau đó em muốn gửi lời biết ơn chân thành nhất tới toàn thể các thày cô
trong trường. Các thày cô là những người có kiến thức sâu rộng, nhiệt tình với sinh
viên, và trên hết đó là các thày cô luôn là tấm gương sáng về nghị lực, lòng say mê
khoa học, và sự chính trực cho chúng em.
Những lời biết ơn thân thương nhất con xin kính gửi tới bố mẹ. Bố mẹ đã cho
con cả quá khứ hiện tại và tương lai. Cám ơn những người bạn tốt trong tập thể
K51CC, những người bạn đã cùng chia sẻ những niềm vui, nỗi buồn trong suốt quãng
đời sinh viên của tôi. Kỉ niệm về các bạn là những kỉ niệm đẹp nhất của tôi thời sinh
viên trên giảng đường đại học.
Cuối cùng em xin kính chúc các thày cô và toàn thể các bạn sinh viên trường
Đại học Công nghệ một sức khỏe dồi dào, đạt được những thành công trên con đường
học tập và nghiên cứu khoa học. Chúc trường ta sẽ sớm trở thành ngọn cờ đầu của
giáo dục nước nhà và Quốc tế.
Mục lục
Lời cảm ơn 1
Chương 1. Đặt vấn đề . 6
1.1. Đặc trưng của ứng dụng sử dụng cơ sở dữ liệu. . 6
1.2. SQL Injection và tính nghiêm trọng của vấn đề an ninh cơ sở dữ liệu
. 7
1.2.1. Khái niệm SQL Injection: 7
1.2.2. SQL Injection và vấn đề an ninh cơ sở dữ liệu. . 8
Chương 2. SQL Injection và các cách tấn công phổ biến 12
2.1. Nhận diện điểm yếu SQL injection trong ứng dụng Web 12
2.1.1. Thăm dò dựa trên phản hồi 12
2.1.2. Cơ chế sinh truy vấn SQL bên trong ứng dụng và các phương
pháp chèn truy vấn SQL 15
2.2. Các phương pháp tấn công phổ biến . 18
2.2.1. Tấn công khai thác dữ liệu thông qua toán tử UNION . 18
2.2.2. Khai thác thông qua các câu lệnh điều kiện . 24
2.2.3. Blind SQL Injection – phương thức tấn công nâng cao 27
2.2.4. Vấn đề qua mặt các bộ lọc tham số đầu vào 38
2.2.5. Một số phương pháp qua mặt bộ lọc của tường lửa Web 43
Chương 3. Phòng chống SQL Injection 49
3.1. Phòng chống từ mức xây dựng mã nguồn ứng dụng . 49
3.1.1. Làm sạch dữ liệu đầu vào 49
3.1.2. Xây dựng truy vấn theo mô hình tham số hóa 52
3.1.3. Chuẩn hóa dữ liệu 60
3.1.4. Mô hình thiết kế mã nguồn tổng quát . 61
3.2. Các biện pháp bảo vệ từ mức nền tảng hệ thống 65
3.2.1. Các biện pháp bảo vệ tức thời . 65
3.2.2. Các biện pháp bảo vệ database . 69
3.3. Đề xuất một số giải pháp 70
Phụ lục: . 72
Cấu hình ModSecurity phòng chống SQL Injection. 72
1. Cài đặt . 72
2. Cấu hình . 74
2.1. Cấu hình tổng quát 75
2.2. Cấu trúc các luật . 78
Tài liệu tham khảo . 92
Tóm tắt nội dung
Theo các báo cáo về an ninh mạng gần đây, như của Whitehat Security(1)
hay
trên trang Verizon Business
(2)
, Sans Institute
(3)
, thì đều cho thấy mức độ phát triển
nhanh chóng, tính nghiêm trọng của các lỗ hổng bảo mật và sự quan tâm chưa đúng
mức của các tổ chức tới vấn đề này. SQL Injection là một vấn đề an ninh ứng dụng
Web được nhấn mạnh trong các báo cáo trên. Khóa luận này có tên “SQL Injection –
tấn công và cách phòng tránh”, nhằm mục đích trình bày những hình thái cơ bản của
các cuộc tấn công SQL Injection lên các ứng dụng Web, từ đó rút ra một mô hình kèm
theo các khuyến nghị cho việc phát triển ứng dụng Web an toàn.
Nội dung khóa luận sẽ được trình bày sẽ xoay quanh ba nội dung chính. Thứ
nhất là nguồn gốc hình thành các điểm yếu SQL Injection trong mã nguồn ứng dụng
và cách nhận biết. Thứ hai là các phương pháp được sử dụng để thăm dò, khai thác,
lợi dụng các điểm yếu này để tiến hành tấn công vào ứng dụng web. Thứ ba là các
khuyến nghị trong việc xây dựng ứng dụng Web, kèm theo đó là đề xuất mô hình phát
triển ứng dụng Web an toàn.
Bảng tóm tắt các ký hiệu viết tắt
Ký hiệu Diễn giải
Database Cơ sở dữ liệu
DBMS Database Management System
(hệ quản trị Cơ sở dữ liệu)
WAF Web Application Firewall
(tường lửa cho ứng dụng Web)
SQL Structured Query Language
(Ngôn ngữ truy vấn có cấu trúc)
93 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 10899 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Đề tài SQL Injection – Tấn công và cách phòng tránh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
tên khó đoán để đặt cho
tên bảng, tên cột chứa các thông tin nhạy cảm như password, credit
card,… Mặc dù phương pháp này không trực tiếp ngăn chặn kẻ tấn
công truy cập vào dữ liệu, nhưng nó gây khó khăn cho việc tìm mục
tiêu của kẻ tấn công.
e. Thiết lập các đối tượng giả làm mồi nhử.
Chiến thuật này được đưa ra nhằm cảnh báo cho quản trị viên
nguy cơ một cuộc tấn công khi một ai đó cố tình tìm cách khai thác
những dữ liệu nhạy cảm như password. Phương pháp này nên phối
hợp với việc đặt tên các đối tượng khó đoán ở bên trên. Để thực hiện
phương pháp này, ta sinh các bảng chứa các cột có tính nhạy cảm mà
dễ đoán, ví dụ như password, credit_no, nhưng dữ liệu trong các
bảng này là dữ liệu giả, và mỗi khi các thông tin này được truy cập,
sẽ có một thông báo gửi về cho quản trị viên.
Trên Oracle database có thể triển khai một bảng kiểu virtual
private database (VPD). Tham khảo tại:
-security/virtual-private-database/index.html
f. Tham khảo và cập nhật các khuyến nghị bảo mật khác
Ngoài việc cập nhật thường xuyên các báo cáo bảo mật về
database, đội ngũ phát triển ứng dụng cũng có thể sử dụng các tài
nguyên được cung cấp thường xuyên bao gồm các công cụ, các
hướng dẫn, báo cáo,… cho việc phát triển ứng dụng một cách an
toàn. Một số nguồn được sử dụng phổ biến như sau:
Dự án nguồn mở về an ninh ứng dụng Web (Open Web
Application Security Project – OWASP – www.owasp.org):
đây là một cộng đồng mở được sáng lập nhằm đào tạo các kỹ
năng an ninh ứng dụng Web. Một trong số các dự án của
OWASP đã từng được đề cập và minh họa trong luận văn này
đó là WebGoat và công cụ Proxy server tên là WebScarab.
Một trong số các dự án đáng chú ý của OWASP là Enterprise
Security API (ESAPI), cung cấp một tập hợp các API cho
việc triển khai các giải pháp bảo mật, ví dụ như xử lý input,
…
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 65
Các hướng dẫn phòng chống SQL Injection của Oracle
(
SQLSecurity.com (www.sqlsecurity.com): trang này tập trung
phục vụ các vấn đề bảo mật của SQL Server, nó chứa các
thông tin, tài nguyên hữu ích cho việc phòng chống SQL
Injection cũng như các mối nguy SQL Server khác
Red-Database-Security:
security.com
Milw0rm ( : một địa chỉ lớn cập nhật các
lỗ hổng và các phương thức khai thác thông tin. Chúng ta có
thể tìm trên địa chỉ này những cảnh báo lỗ hổng, video, bài
viết, shellcode khai thác điểm yếu được cập nhật.
3.2. Các biện pháp bảo vệ từ mức nền tảng hệ thống
Các biện pháp phòng chống từ mức nền tảng hệ thống (platform-level)
là những biện pháp cải tiến trong thời gian hoạt động (runtime) hoặc các thay
đổi trong cấu hình sao cho có thể nâng cao mức độ an ninh tổng thể của ứng
dụng.
Một điều luôn cần ghi nhớ, đó là các giải pháp mức nền tảng hệ thống
không thể thay thế cho việc xây dựng mã nguồn ứng dụng an toàn, chúng chỉ
có tác dụng hỗ trợ. Một database cấu hình tốt không ngăn chặn được SQL
Injection nhưng sẽ khiến chúng gặp khó khăn khi lợi dụng điểm yếu ứng dụng
để khai thác database, một bộ lọc an ninh có thể được sử dụng tạm thời như
một bản vá ảo (virtual patch) từ khi phát hiện lỗ hổng đến khi đội phát triển
ứng dụng khắc phục được lỗ hổng đó. Các bộ lọc có thể được xây dựng nhanh
chóng hơn và có thể phòng tránh được những lỗ hổng trong giai đoạn zero-day
của cuộc tấn công. Và có thể khẳng định rằng, an ninh mức nền tảng là một
thành phần quan trọng trong chiến lược an ninh tổng thể của ứng dụng.
3.2.1. Các biện pháp bảo vệ tức thời
Những biện pháp bảo vệ tức thời là những biện pháp có thể áp dụng
mà không cần phải thực hiện biên dịch lại mã nguồn của ứng dụng. Các
biện pháp bảo vệ trong thời gian hoạt động là các công cụ hữu ích nhằm
phòng tránh việc lợi dụng các điểm yếu SQL Injection đã được xác
định. Việc thực hiện sửa lỗi trong mã nguồn ứng dụng luôn là một giải
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 66
pháp triệt để nhưng không phải luôn thực hiện được với khả năng và chi
phí có thể. Ngoài ra, với các ứng dụng thương mại, hầu hết chúng được
phát hành với bản hoàn chỉnh đã biên dịch chứ không phải ở dạng mã
nguồn. Và ngay cả khi có mã nguồn thì việc thực hiện chỉnh sửa nó hầu
hết đều vi phạm các điều khoản sử dụng và các chính sách bảo hành, hỗ
trợ của nhà phân phối. Và do đó, việc sử dụng các biện pháp bảo vệ
trong thời gian hoạt động có thể là giải pháp dạng bản-vá-ảo (virtual
patch) tạm thời trước khi việc sửa lỗi trong mã nguồn ứng dụng hoàn
chỉnh.
Ngay cả khi thời gian, tài nguyên cần thiết cho phép việc vá lỗi trong
mã nguồn, các biện pháp bảo vệ trong thời gian chạy vẫn là một lớp an
ninh có giá trị cho việc phát hiện hoặc ngăn chặn những điểm yếu SQL
Injection chưa biết tới. Điều này sẽ dễ nhận thấy khi mà ứng dụng chưa
từng trải qua các đánh giá, thử nghiệm bảo mật, hoặc chưa từng bị các
cuộc tấn công SQL Injection – những điều mà rất phổ biến trong hoạt
động phát triển ứng dụng Web ở nước ta hiện nay. Rõ ràng, đây là
những tiền đề cho việc khai thác các lỗi zero-day cũng như các lỗi SQL
khác phát tán từ Internet. Lúc này, các phương pháp của chúng ta không
chỉ mang tính đối phó bị động (reactive) mà còn cung cấp các biện pháp
đối phó chủ động (proactive) cho ứng dụng.
a. Các ứng dụng tường lửa Web
Ứng dụng tường lửa Web (Web Application Firewall - WAF) là
một ứng dụng được bố trí đóng vai trò trung gian giữa client và web
server, làm nhiệm vụ điều phối các thông tin luân chuyển, cân bằng
tải, … một ứng dụng WAF sẽ được bố trí như sau:
Hình 3.1 – vị trí của tường lửa Web trong luồng thông tin
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 67
Ưu điểm:
Đòi hỏi ít thay đổi tới web server và ứng dụng web
Là một tiêu chuẩn đối với các hệ thống thanh toán điện
tử (tiêu chuẩn PCI DSS v1.1 ), tham khảo tại PCI Data
Security Standard .
Cập nhật nhanh, đơn giản
Hỗ trợ phòng tránh nhiều loại hình tấn công
Nhược điểm:
Có thể gia tăng độ phức tạp của hệ thống hiện tại, nhất
là khi triển khai kèm proxy
Chi phí đào tạo trong quá trình kiểm thử và khi nâng
cấp phiên bản mới
Gia tăng độ phức tạp của các hoạt động gỡ lỗi, do
WAF cũng trả về các lỗi, và WAF chịu trách nhiệm xử
lý các tình huống của toàn bộ hệ thống.
Tính kinh tế có thể không đảm bảo như nhà quản lý
mong muốn.
Một số sản phẩm tiêu biểu
Miễn phí: ModSecurity, AppArmor, UFW
(uncomplicated firewall), …
Có phí: Barracuda, Cisco ACE, Citrix NetScale, …
Trong phần phụ lục chúng ta sẽ đề cập khái quát về việc sử dụng
ModProxy để phòng chống một số dạng tấn công SQL Injection
b. Các bộ lọc ngăn chặn
Hầu hết các ứng dụng tường lửa web (WAF) đều cài đặt các mẫu
lọc ngăn chặn trong cấu trúc của mình. Các bộ lọc này là một chuỗi
các module độc lập có thể được gắn kết với nhau để thực hiện thao
tác xử lý trước và sau các xử lý chính bên trong ứng dụng (Web
page, URL, script). Các bộ lọc đều không có sự ràng buộc rõ rệt nào
với nhau, do đó nó cho phép triển khai thêm các mẫu lọc mới mà
không hề ảnh hưởng tới những cái sẵn có. Chúng ta sẽ đề cập tới hai
cách triển khai các bộ lọc ngăn chặn phổ biến nhất, đó là dưới dạng
các plug-in cho Web server và dưới dạng các module cho nền tảng
phát triển ứng dụng
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 68
Bộ lọc dạng Plug-in cho Web server
Ở dạng này, các bộ lọc được tích hợp vào Web server dưới
dạng plug-in/module, đảm nhiệm việc mở rộng khả năng của
Web server sang các tác vụ xử lý.
Thông thường các request và response được xử lý ở Web
server phải trải qua vài pha xử lý, các plug-in lọc có thể đăng kí
chạy ở những pha này, thực hiện xử lý trước khi các request tới
được ứng dụng Web hoặc ngay sau khi ứng dụng Web trả về các
response. Những xử lý này độc lập và không ảnh hưởng tới các
module khác của Web server hay không làm thay đổi logic
nghiệp vụ của nó.
Một ưu điểm dễ thấy khi triển khai dạng module của Web
server đó là các bộ lọc này sẽ không phụ thuộc vào nền tảng của
ứng dụng Web hoặc ngôn ngữ lập trình, ví dụ các bộ lọc ISAPI
cho Microsoft IIS có thể xử lý và theo dõi các request trên cả
ASP và ASP.NET.
Do các bộ lọc tham gia xử lý tất cả các request nên vấn đề
hiệu năng được đặc biệt coi trọng, các plugin đều được viết bằng
C/C++ để có thể chạy nhanh hơn. Tuy nhiên khi dùng các ngôn
ngữ này sẽ dễ nảy sinh các điểm yếu về tràn bộ đệm hay về định
dạng xâu ký tự.
Dạng module hỗ trợ cho nền tảng phát triển ứng dụng
Dạng module lọc này cho phép chúng ta cài đặt chúng bên
trong mã nguồn ứng dụng web hoặc framework. Dạng module
này khá tương đồng với dạng plug-in cho Web server ở chỗ các
đoạn code ở dạng module, có thể được cài đặt kèm theo từng pha
xử lý request từ client. Trong ASP.NET chúng ta có interface tên
là Web.IhttpModule và trong Java chúng ta có javax.servlet.Filter
để cài đặt các mẫu lọc.
Các module này có thể được cài đặt độc lập, không làm
thay đổi hoạt động của ứng dụng Web. Ngoài ra, chúng cũng có
thể được phát triển độc lập thành các thư viện .dll và jar và có thể
được khởi chạy ngay.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 69
3.2.2. Các biện pháp bảo vệ database
Các biện pháp bảo vệ chính database nhằm đề phòng những trường
hợp xấu, khi kẻ tấn công đã khai thác được điểm yếu, và từ đó có thể
điều khiển các hoạt động của database nhằm ăn cắp dữ liệu hoặc làm
bàn đạp thâm nhập vào hệ thống bên trong, đằng sau database.
a. Giới hạn phạm vi ảnh hưởng của ứng dụng
Các biện pháp này được chuẩn bị, đề phòng cho tình huống xấu
nhất khi kẻ tấn công có thể thâm nhập được vào database:
Cấp quyền ưu tiên tối thiểu cho tài khoản đăng nhập vào database
Hủy bỏ các quyền PUBLIC: các database thường cung cấp một
số chế độ mặc định cho tất cả các đăng nhập, các chế độ này có
một tập mặc định các quyền, bao gồm cả việc truy cập tới một số
đối tượng thuộc hệ thống. Các chế độ công khai này đôi khi cung
cấp những quyền truy cập tới những stored procedure có sẵn, một
số các gói, hoặc các hàm có thể sử dụng cho mục đích quản trị.
Vì vậy cần hủy quyền dạng này tới mức tối đa có thể.
Sử dụng các Stored procedure: trường hợp này, các stored
procedure có vai trò đóng gói các quyền ứng dụng cần vừa đủ để
thực hiện công việc của mình.
Sử dụng các thuật toán mã hóa mạnh để mã hóa và lưu trữ những
dữ liệu nhạy cảm.
b. Giới hạn phạm vi ảnh hưởng của database
Các biện pháp ở mức này được chuẩn bị, đề phòng cho tình
huống kẻ tấn công chiếm được quyền điều khiển database:
- Khóa các quyền truy cập tới các đối tượng có đặc quyền, ví dụ những
tiện ích quản trị, tiện ích thực thi gián tiếp các lệnh phía hệ điều hành,
hoặc các tiện ích sinh các kết nối tới các đối tượng, database khác.
- Hạn chế các truy vấn đặc biệt (ad hoc query): câu lệnh OPENROWSET
trong SQL Server là một ví dụ. Việc sử dụng câu lệnh này có thể giúp kẻ
tấn công có thể cướp quyền truy vấn, và thực hiện các kết nối tới các
database khác dưới chế độ xác thực lỏng lẻo hơn.
- Luôn cập nhật các bản vá mới nhất của ứng dụng quản trị database
(DBMS). Đây là một nguyên tắc căn bản mà chúng ta cần tuân thủ, bởi
các bản vá này có thể không cập nhật nhanh nhất nhưng nó có tính đảm
bảo cho các điểm yếu đã được phát hiện.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 70
3.3. Đề xuất một số giải pháp
Thực tế cho thấy không một hệ thống ứng dụng Web nào được coi là an
ninh tuyệt đối. Các giải pháp an ninh hệ thống chỉ có thể hướng tới việc bảo vệ
hệ thống một cách tối đa, và giảm thiểu các nguy cơ tấn công xuống mức tối
thiểu. Một mô hình an ninh nhiều mức là một sự lựa chọn sáng suốt cho vấn đề
này.
Các biện pháp an ninh chúng ta đã đề cập tới bao gồm các biện pháp
quản lý luồng thông tin trao đổi giữa ứng dụng và database server như: lọc
request từ client thông qua tường lửa Web, chuẩn hóa các tham số lấy được từ
request, xây dựng các truy vấn tham số hóa, lọc tiếp lần cuối các http response
tại tường lửa Web. Ngoài ra còn cần áp dụng các biện pháp an ninh mức nền
tảng hệ thống.
Chúng ta có thể hệ thống lại các giải pháp an ninh ứng dụng đã đề cập
theo một mô hình sau.
Hình 3.2 – mô hình đề xuất
Trong mô hình trên, quá trình xử lý request từ phía người dùng trải qua
6 giai đoạn:
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 71
- Nhận request từ client (các tham số đầu vào do người dùng toàn quyền
điều khiển). Giai đoạn này chúng ta không can thiệp được.
- Xử lý request ở tường lửa Web: trong giai đoạn này các luật lọc ở tường
lửa Web sẽ giúp chặn lại các request có URL, tham số tiềm ẩn nguy cơ
tấn công.
- Chuẩn hóa dữ liệu thu được từ request trong mã nguồn ứng dụng. Giai
đoạn này thực hiện kiểm tra, chuẩn hóa các dữ liệu từ phía người dùng,
một số thao tác cần tiến hành như kiểm tra kiểu dữ liệu, kiểm tra độ dài
dữ liệu (đề phòng Buffer overflow), …
- Sinh các truy vấn theo mô hình tham số hóa (parameterized query hay
prepared query). Các truy vấn này sẽ được DBMS tối ưu, khi thực thi sẽ
nhận các tham số đã chuẩn hóa ở giai đoạn trước vào để có câu truy vấn
hoàn chỉnh
- Xử lý kết quả từ database trả về, sinh các kết quả để HTML gửi về client
thông qua các thông điệp phản hồi (HTTP response)
- Thông điệp phản hồi (HTTP response) sẽ được qua tường lửa Web lọc
các thông tin trong đó nhằm loại bỏ các request có rò rỉ dữ liệu nhạy
cảm.
- Các thông điệp phản hồi sau khi được kiểm tra sẽ được trả về cho client.
Giai đoạn này ứng dụng không kiểm soát được.
Mô hình trên nên được áp dụng cho tất cả các ứng dụng Web nhằm đảm
bảo an ninh tối đa trước các cuộc tấn công SQL Injection. Trong mô hình trên,
chúng ta đã thực hiện được việc kiểm soát dữ liệu đầu vào của người dùng
thông qua các bước xử lý khác nhau. Việc xử lý request từ mức tường lửa sẽ
giúp giảm thiểu được gánh nặng xử lý cho ứng dụng bên trong, đồng thời tiết
kiệm được băng thông cho hệ thống. Các tham số chuẩn hóa sẽ giúp các truy
vấn SQL (trực tiếp hoặc thông qua các Stored Procedure) được thực thi an toàn
hơn. Và cuối cùng, các thông tin có thể bị rò rỉ trong thông điệp phản hồi sẽ
được kiểm tra lần nữa trước khi chuyển về cho client.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 72
Phụ lục:
Cấu hình ModSecurity phòng chống SQL Injection.
1. Cài đặt
ModSecurity là một ứng dụng tường lửa Web xây dựng dưới dạng
module cho ứng dụng Web server Apache. Mọi thông tin chi tiết về
ModSecurity được đăng tại trang chủ của sản phẩm (
Chúng ta sẽ đề cập đến việc cài đặt ứng dụng này trên hệ điều hành
Linux, cụ thể là trên bản phân phối Debian/Ubuntu.
- Gói mã nguồn được tải về tại địa chỉ:
- chúng ta thực hiện cài đặt các gói, thư viện liên quan:
#apt-get install libxml2-dev liblua5.1-0 lua5.1 apache2-dev build-essential
- giải nén mã nguồn:
tar xzf modsecurity-apache_2.5.7.tar.gz
- chuyển vào trong thư mục dành cho apache2:
cd modsecurity-apache_2.5.7/apache2
- biên dịch mã nguồn
# configure && make && make install
sau giai đoạn biên dịch, thư viện chia sẻ của module phải nằm ở thư
mục: /usr/lib/apache2/modules/ và có tên mod_security2.so
- tạo file chỉ thị để Apache nạp module ModSecurity
vi /etc/apache2/mods-available/mod-security2.load
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 73
thêm các dòng sau và lưu lại:
LoadFile /usr/lib/libxml2.so
LoadFile /usr/lib/liblua5.1.so.0
LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so
- kích hoạt module để chạy cùng apache (chỉ thị unique_id cần có đối
với mod-security, nó được dùng làm chuẩn kèm theo apache)
a2enmod mod-security2
a2enmod unique_id
- tạo file cấu hình cho ModSecurity và khai báo khu vực chứa các luật
lọc:
vi /etc/apache2/conf.d/mod-security2.conf
thêm dòng sau vào file và lưu lại:
Include /etc/modsecurity2/*.conf
- tạo các thư mục riêng cho ModSecurity và các file log:
mkdir /etc/modsecurity2
mkdir /etc/modsecurity2/logs
touch /etc/modsecurity2/logs/modsec_audit.log
touch /etc/modsecurity2/logs/modsec_debug.log
- cài đặt các luật cơ bản cho ModSecurity
các luật cơ bản cho ModSecurity được cung cấp sẵn tại:
- sau khi tải về, giải nén và chép vào thư mục /etc/modsecurity2:
cp /tmp/modsecurity-apache_2.5.7/rules/*.conf /etc/modsecurity2
- cập nhật lại vị trí lưu các log trong file cấu hình:
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 74
vi /etc/modsecurity2/modsecurity_crs_10_config.conf
tìm dòng
SecDebugLog logs/modsec_debug.log
thay bằng
SecDebugLog /etc/modsecurity2/logs/modsec_debug.log
và tìm dòng
SecAuditLog logs/modsec_audit.log
thay bằng
SecAuditLog /etc/modsecurity2/logs/modsec_audit.log
Sau khi sửa xong lưu lại
- kiểm tra xem các cấu hình của apache đã đúng chưa:
apache2ctl configtest
câu lệnh này cần phải trả về OK thì ta mới cấu hình thành công
- khởi động lại apache: /etc/init.d/apache2 restart
- kiểm tra xem ModSecurity đã chạy chưa:
cat /var/log/apache2/error.log | grep ModSecurity
cần tìm thấy dòng có nội dung: … ModSecurity for Apache/2.5.4
( configured.
2. Cấu hình
Công việc cài đặt thực hiện xong, việc chính của chúng ta phải làm đó là
thiết lập và bảo trì tập cấu hình các luật (rules), các luật này mô tả các mẫu
dạng blacklist/whitelist. Điểm mạnh của ModSecurity đó là ngôn ngữ được sử
dụng để mô tả các luật của nó, ngôn ngữ này được tổ hợp giữa các chỉ dẫn cấu
hình và một dạng ngôn ngữ lập trình đơn giản áp dụng cho các request và
response HTTP. Các chỉ thị được đưa ra thường là cho phép request, ghi chép
lại (logging) request đó, hoặc chặn (blocking) nó.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 75
Các cấu hình được thực hiện trên các phiên bản ModSecurity 1.x và 2.x
có vài điểm khác biệt, nhiều điểm khác biệt này không thể tương thích lẫn
nhau, do đó khi triển khai nâng cấp hoặc sửa đổi, bổ sung các luật, người quản
trị cần xem xét kỹ phiên bản để có điều chỉnh phù hợp. Thông tin về các thay
đổi giữa hai phiên bản có thể tham khảo tại địa chỉ
.
2.1. Cấu hình tổng quát
a. Một số thông tin cơ bản
Việc khai báo và cấu hình module ModSecurity trong file cấu hình của
Apache có thể theo hai cách:
Cách thứ nhất: mô tả cấu hình trong chính bản thân file cấu hình của apache
(là file httpd.conf với apache v1.x và là apache2.conf với apache v2.x).
Cách này có thể khiến file cấu hình của apache phức tạp thêm và khó quản
lý hơn.
Cách thứ hai: xây dựng một file độc lập (thường được đặt tên là
modsecurity2.conf), và định nghĩa file này là file cấu hình của module
ModSecurity trong file cấu hình của apache, ví dụ trong khai báo module
trong apache2.conf:
include /etc/apache2/conf.d/modsecurity2.conf
Sau khi khai báo module, và file cấu hình, chúng ta thực hiện tạo file
cấu hình của ModSecurity. Như khai báo ở trên, file cần tạo là
modsecurity2.conf đặt trong thư mục conf.d là thư mục con của thư mục
apache2. Để bắt đầu sử dụng module, cần khai báo thông qua chỉ thị sau:
# turn on rule engine and set default action
SecRuleEngine On
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 76
SecDefaultAction "phase:2,deny,log,status:403"
Cần lưu ý ở đây là định danh của module được chỉ ra trong chỉ thị
IfModule cần đúng với định danh được khai báo trong lệnh LoadModule
trong file cấu hình của Apache (apache2.conf), nếu không Apache sẽ bỏ qua
tất cả nội dung nằm trong cặp thẻ IfModule.
- SecRuleEngine On : kích hoạt engine xử lý các luật lọc.
- SecDefaultAction: chỉ ra những gì sẽ xảy ra khi một luật được khớp (rule
match).
- Phase:2 . ModSecurity xử lý một request theo 5 pha (phase), tương ứng với
các pha xử lý của Apache, ModSecurity 2.x trở đi có thể áp các luật cho cả
5 pha này. Năm pha xử lý này như sau:
Số thứ tự, tên pha Thời điểm xảy ra
1. REQUEST_HEADERS Ngay sau khi Apache đọc xong header của
request HTTP
2. REQUEST_BODY Sau khi nội dung request được đọc. Hầu
hết các luật được đưa ra để xử lý trong
pha này
3. RESPONSE_HEADERS Sau khi header của response được gửi lại
cho client
4. RESPONSE_BODY Trước khi gửi nội dung response cho
client, nội dung này sẽ được rà soát lại
để tránh những thiếu sót về rò rỉ dữ liệu
5. LOGGING Sau khi quá trình ghi log bắt đầu. Tại thời
điểm này, request sẽ không thể bị chặn
lại.
Như nội dung bảng trên đã trình bày, pha hữu ích nhất để quản lý các
request HTTP là pha thứ hai. Khi chỉ định phase:2 cho hành động mặc định,
tất cả các luật tiếp theo sẽ luôn xử lý ở pha 2 trừ khi các pha khác được chỉ
định trong luật đó. Để mô tả một hành động tùy ý, bỏ qua hành động mặc
định, sử dụng cấu trúc ví dụ như sau:
SecRule REQUEST_HEADERS:User-Agent “WebVulnScan” “phase:1”
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 77
Với mô tả này, luật sẽ xử lý ở pha 1, sau khi nhận được request header.
b. Hoàn tất cấu hình cơ bản
Để hoàn tất cấu hình cơ bản cho ModSecurity, ta cần bổ sung thêm một
số chỉ thị hữu ích, cần thiết khác cho nó. Xét cấu hình được khuyến cáo sau:
# turn on rule engine and set default action
SecRuleEngine On
SecDefaultAction "phase:2,deny,log,status:403"
# Configure request body access and limits
SecRequestBodyAccess On
# Debug log setting
SecDebugLog logs/modsec_debug.log
SecDebugLogLevel 0
Chỉ thị SecRequestBodyAcces On sẽ kích hoạt việc xử lý thân nội dung
HTTP request. Điều này cho phép chúng ta kiểm tra những nội dung gửi lên
thông qua request POST. Khi chỉ thị này được kích hoạt, ModSecurity sẽ
lưu tạm lại thân request trong bộ nhớ, xử lý nó trước khi gửi lại cho Apache
xử lý tiếp.
Chỉ thị SecDebugLog, chúng ta cần cung cấp đường dẫn tới file log
phục vụ debug, trong trường hợp này là thư mục logs nằm bên trong thư
mục gốc của Apache. Ngoài ra chỉ thị SecDebugLogLevel 0 nói lên rằng
không một dữ liệu nào về debug được lưu lại. Điều này có ích khi mô tả
trong file cấu hình, bởi các mức độ debug log sẽ có thể thay đổi trong các
luật khác.
Một điều rất quan trọng mỗi khi thực hiện chỉnh sửa lên luật hoặc các
luật, đó là sau mỗi thay đổi, nhất thiết phải khởi động lại Apache để nạp lại
các luật. Nếu điều này không thực hiện đúng, sẽ gây ra những xung đột do
mất đi sự nhất quán giữa cấu hình, luật, các log, và tai hại thường khó lường
trên những mô hình lớn.
c. Thực hiện minh họa với một luật đơn giản
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 78
Sau khi trình bày tóm lược về một số thao tác cài đặt và cấu hình cơ bản,
chúng ta sẽ bắt đầu thử xây dựng một luật cơ bản và thử nghiệm hoạt động
của chúng. Trong file cấu hình ModSecurity, thêm luật sau:
# block all requests that containts “restricted” in URI
SecRule REQUEST_URI “restricted”
Trong thư mục DocumentRoot của Apache2 (trường hợp này là trong
thư mục /var/www/), tạo một file restricted.php có nội dung bất kỳ, để kiểm
tra hoạt động của bộ lọc, ta thử truy cập vào file restricted.php trên:
Kết quả trên chứng tỏ luật khai báo phía trên đã hoạt động tốt. Tiếp theo
chúng ta sẽ thực hiện đề cập các luật chi tiết hơn trong phần 1.2.2.
d. Ngụy trang Web Server
Việc ngụy trang chính bản thân Web server là một việc cần thiết nhằm
gây khó khăn cho kẻ tấn công. Việc ngụy trang ở đây có thể thực hiện thông
qua ModSecurity, ModSecurity có thể trả về thông tin thay vì là Apache có
thể sẽ là Microsoft-IIS/5.0 hoặc một thông tin gì đó gây khó khăn cho kẻ
tấn công. Để thực hiện việc này, sử dụng chỉ thị SecServerSignature, trên
Apache2 cần cấu hình biến ServerToken từ Prod (mặc định) thành Full để
có thể sử dụng được chỉ thị trên. Cú pháp của chỉ thị trên dạng như:
SecServerSignature “Microsoft-IIS/5.0”
2.2. Cấu trúc các luật
Việc định nghĩa các luật là một công việc rất thường xuyên trong việc bảo
trì, nâng cấp hệ thống WAF. Chỉ thị được sử dụng thường xuyên nhất để định
nghĩa các luật đó là SecRule.
Để tự tạo, quản lý và bảo trì các luật phức tạp thế này không đơn giản.
Trước tiên chúng ta sẽ tìm hiểu cấu trúc cú pháp của chỉ thị SecRule.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 79
SecRule Target Operator [Actions]
Target: chỉ định thành phần nào đó của request hoặc response mà ta cần
áp đặt luật. Target nhận giá trị là các biến, biến có thể là dạng biến
thường và dạng biến tập, chúng ta sẽ đề cập đến sau.
Operator: thành phần này chỉ định các phương thức, phép so sánh dữ
liệu được sử dụng khi thực hiện khớp với các biến cụ thể hoặc các biến.
Operator mặc định, nếu không được chỉ định, là @rx, tức là rule
engine sẽ sử dụng biểu thức chính quy để khớp xâu với biến cụ thể nào
đó.
Action: là một danh sách (tùy chọn) các hành động sẽ được áp đặt khi
một luật được khớp (rule match). Những hành động này có thể là từ chối
request và chỉ định mã lỗi trả về, …
Danh sách hành động này không bắt buộc, bởi nếu không được chỉ
định, các hành động đã được khai báo mặc định trong chỉ thị
SecDefaultAction trong cấu hình cơ bản sẽ được áp đặt lên request.
2.2.1. Biến thường và các biến tập
ModSecurity sử dụng hai loại biến, loại thứ nhất là các biến chuẩn (standard
variable) chỉ chứa một giá trị đơn ứng với mỗi biến, và loại thứ hai là các biến
tập (collection variable) có thể chứa nhiều giá trị ứng với một biến. lấy một ví
dụ về biến tập như REQUEST_HEADER, nó chứa tất cả giá trị trường header
của một thông điệp HTTP.
Để truy cập vào các trường trong biến tập, sử dụng cấu trúc
tên_biến:tên_trường, ví dụ luật sau:
SecRule REQUEST_HEADER:Referer “victim.com”
Hầu hết các biến tập có thể được sử dụng độc lập mà không cần chỉ định
trường cụ thể. Khi sử dụng tên biến tập độc lập tương đương với việc truy cập
tới mọi trường trong tập đó. Ví dụ, querystring gửi lên trong thông điệp POST
như sau: username=cuongpt&password=weakpasswd. Thì thay vì sử dụng luật:
SecRule ARGS:username|ARGS:password “select”
Ta có thể sử dụng
SecRule ARGS “select” deny.
Một số biến tập có các trường cố định (vd: GEO có country_name, city,…)
nhưng một số lại có các trường không cố định, tùy thuộc vào nội dung client
gửi đến.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 80
Trong các biến tập, có thể truy cập tới các trường không tồn tại hoặc trường
đó không được gán giá trị mà không phát sinh lỗi. Điều này cần ghi nhớ trong
trường hợp debug, có thể bỏ qua khả năng trường giá trị trong biến tập không
tồn tại hoặc không được gán giá trị.
2.2.2. Lưu trữ dữ liệu giữa các request.
Có ba loại biến tập trong ModSecurity có thể được sử dụng để lưu trữ lâu
dài. Thông thường, các biến sẽ hết hiệu lực mỗi khi request hiện thời được xử
lý hoàn tất. Tuy nhiên trong một số trường hợp, chúng ta lại cần lưu giữ chúng
lại và sử dụng chúng khi thao tác với các request sau này. Ba loại biến tập có
thể được sử dụng cho mục đích lưu trữ là IP, SESSION, USER.
Biến tập IP được dùng để lưu thông tin về một user thông qua địa chỉ IP.
Chúng ta có thể sử dụng nó cho một số mục đích như phát hiện ra user nào
request nhiều lần vào một tài nguyên, hoặc số lần request của một user, giả sử
để chống DOS.
Trước khi sử dụng các biến trên, chúng ta cần khởi tạo chúng cách sử dụng
action tên là initcol, ví dụ:
SecAction initcol:ip=%{REMOTE_ADDR},nolog,pass
Trong đó, REMOTE_ADD là biến lưu địa chỉ IP của client gửi request. Để
lưu trữ biến, chúng ta cũng cần cấu hình một thư mục dữ liệu cho ModSecurity
thông qua chỉ thị SecDataDir, ví dụ:
SecDataDir /var/log/apache2/modsec_data
Điều cần lưu ý đó là thư mục được chỉ định trong chỉ thị nêu trên phải cho
phép người dùng Apache ghi dữ liệu lên.
Sau khi cấu hình thư mục lưu trữ dữ liệu, khởi tạo biến, ta có thể thao tác
với giá trị của biến, gán giá trị thông qua action tên là setvar. Trong phần giới
thiệu biến tập tiếp theo ta sẽ sử dụng action setvar.
2.2.3. Biến tập giao tác (transaction collection)
Biến TX là một dạng biến tập giao tác, các biến này được gán giá trị trong
một vòng đời của một request/response. Chúng ta có thể sử dụng TX để tạo các
biến của riêng mình nhằm lưu dữ liệu trong vòng một chu kỳ transaction. Xét
một số luật sau:
SecRule REQUEST_URI “select” “pass,setvar:tx.score=+1”
SecRule REQUEST_URI “passwd” “pass,setvar:tx.score=+2”
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 81
SecRule TX:SCORE “@gt 3” deny
Bộ luật trên mô tả như sau, thực hiện kiểm tra các URI trong request, nếu
phát hiện có chứa “select” thì tăng biến SCORE lên 1, nếu phát hiện thấy có
“passwd” thì tăng biến SCORE lên 2, và nếu kiểm tra thấy biến SCORE lớn
hơn hoặc bằng 3 thì chặn request đó lại.
Cấu trúc action setvar ở trên cho phép tạo và cập nhật một biến. Để hủy một
biến, cũng sử dụng action setvar nhưng thêm dấu chấm than phía trước biến, cụ
thể: setvar:!tx.score.
Biến tập TX có thể chứa các trường định nghĩa sẵn (built-in) như TX:0,
TX:1, … cho đến TX:9. Với trường hợp TX:0 đó là giá trị được khớp khi sử
dụng toán tử @rx hoặc @pm, các biến TX:1 đến TX:9 chứa các giá trị kiểu
biểu thức chính quy thu được khi ước lượng một biểu thức chính quy kèm theo
action capture.
2.2.4. Thực hiện thao tác đồng thời nhiều biến
Chúng ta có thể thực hiện so khớp một biểu thức chính quy với một vài biến
một lúc, ví dụ cùng so khớp cả request header và request argument xem có xuất
hiện “select” hay không thì cần dùng dấu | (pipe) để ngăn cách giữa các biến
cần thực hiện so khớp, ví dụ:
SecRule ARGS|REQUEST_HEADERS “select” deny
2.2.5. Việc sử dụng các dấu nháy
Trong cấu trúc một luật, phần chuỗi action và biểu thức chính quy không
nhất thiết phải luôn được bao bởi một cặp dấu nháy (như ví dụ ở trên). Nếu
chuỗi action và biểu thức chính quy không chứa khoảng trắng (vd: dấu cách)
bên trong thì không cần sử dụng dấu nháy để bọc chuỗi. Ngược lại, cần sử
dụng dấu nháy kép để bọc một chuỗi có chứa khoảng trắng bên trong. Ví dụ:
SecRule REQUEST_URI “waitfor delay” deny
Một trường hợp khác xảy ra, đó là dấu nháy xuất hiện với tư cách là thành
phần hợp lệ của chuỗi, ví dụ với một thông báo trong log “someone’s try to
hack us”, thì cần sử dụng dấu \ (backlash) để escape dấu đó, ví dụ ta có
“someone\’s try to hack us”. Ngoài dấu nháy, các ký tự đặc biệt khác thường
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 82
gặp trong xử lý biểu thức chính quy cũng cần được escape, ví dụ dấu chấm, dấu
sao, dấu mở ngoặc đơn, …
2.2.6. Xây dựng chuỗi các luật
Chuỗi các luật (chained rules) được sử dụng để kết hợp các luật lại sao cho
một sự kiện khớp luật phải thỏa mãn điều kiện của một vài điều kiện thay vì chỉ
một điều kiện đơn lẻ.
Sử dụng action có tên là “chain” có thể cho phép ghép các luật lại thành
một chuỗi xử lý. Một request/response khớp với chuỗi luật nếu khớp với tất cả
các luật thành viên. Từ khóa chain này có tác dụng tương tự phép thao tác logic
AND trong các mệnh đề điều kiện ở các ngôn ngữ lập trình khác. Ví dụ với
điều kiện đặt ra như trên, ta có thể xây dựng chuỗi luật sau:
SecRule REQUEST_HEADERS:User-Agent “FlashGet” “deny,chain”
SecRule TIME_HOUR “@lt 16”
Một điều cần chú ý, đó là chỉ có luật đầu tiên trong chuỗi mới có thể chỉ
định các action có tính ngắt, ví dụ deny, nếu có luật nào khác luật đầu tiên chỉ
định các action này, sẽ có lỗi xẩy ra. Ngoài deny, các metadata action khác như
log, msg, id, rev, tag, severity, logdata, cũng chỉ có thể được chỉ định ở luật đầu
tiên trong chuỗi.
Có thể ghép nhiều luật thành chuỗi chứ không chỉ hai luật như ví dụ. Khi đó
chuỗi sẽ có đặc điểm sau:
Luật đầu tiên mô tả đầy đủ các hành động cần thiết để xử lý
request/response khớp, kèm theo action “chain”
Các luật tiếp theo trừ luật cuối cùng, chỉ chứa duy nhất action là “chain”
Luật cuối cùng trong chuỗi, không chứa action nào
Các chuỗi luật phức tạp hơn chúng ta sẽ xây dựng, đề cập đến trong những
nội dung mở rộng sau này.
2.2.7. Biểu thức chính quy
Biểu thức chính quy là một yếu tố căn bản được sử dụng để xây dựng nên
các luật trong ModSecurity. Toán tử @rx (regular expression) là một toán tử
mặc định, được sử dụng khi không có một toán tử nào khác được chỉ định.
Ngoài việc xây dựng trực tiếp mẫu so sánh hoàn toàn bằng biểu thức chính
quy, có thể tận dụng một số toán tử hỗ trợ để giảm nhẹ công việc, ví dụ:
Toán tử Tác dụng Ví dụ
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 83
@beginsWith Khớp các chuỗi bắt đầu
với chuỗi chỉ định
SecRule REQUEST_LINE
“!@beginsWith GET”
@containts Khớp các chuỗi có chứa
chuỗi chỉ định tại bất cứ vị
trí nào
SecRule REQUEST_LINE
“@contains select”
@containsWord Khớp xâu chứa từ được chỉ
định. “Từ” ở đây được
hiểu là đoạn xâu được
ngăn bởi một hoặc nhiều
ký tự không phải chữ,số
SecRule ARGS “@containsWord
from”
@endsWith Khớp xâu kết thúc bởi xâu
chỉ định
SecRule ARGS “@endsWith --”
@streq Khớp xâu giống hoàn toàn
xâu chỉ định
SecRule REMOTE_HOST
“@streq victim\.com”
@within Khá giống @contains, chỉ
khác là một so khớp xảy ra
khi biến cần so xuất hiện
bên trong xâu được chỉ
định
SecRule REMOTE_USER
“@within cuong,nam,an”
(sẽ khớp nếu remote user là cuong,
nam hoặc an)
Các phép khớp xâu ở trên nhạy cảm kiểu chữ với xâu được chỉ định, cụ thể,
kết quả sẽ khác với các xâu chỉ định là Select và seLect. Tuy nhiên, các toán tử
thì lại không phân biệt kiểu, tức là @within hay wiThin cũng vẫn hoạt động
giống nhau.
Ngoài việc so khớp các chuỗi ký tự, chúng ta cũng cần đề cập đến việc sử
dụng các toán tử để so sánh các số:
Toán tử Toán tử đại số
tương đương
Ví dụ
@eq = SecRule RESPONSE_STATUS “@eq 200”
@ge ≥ SecRule RESPONSE_STATUS “@ge 400”
@gt > SecRule RESPONSE_STATUS “@gt 399”
@le ≤ SecRule RESPONSE_STATUS “@le 199”
@lt < SecRule RESPONSE_STATUS “@lt 200”
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 84
2.2.8. Một số các thao tác nâng cao với biến tập
Đếm số lượng đối tượng trong một biến tập
Chúng ta có thể thực hiện đếm số các đối tượng trong một biến tập bằng
cách đặt dấu “&” vào trước biến tập đó. Giả sử chúng ta cần chặn các
request mà không gửi cookie:
SecRule &REQUEST_COOKIE “@eq 0”
Ngoài ra có thể sử dụng đặc tính này để chặn một loại hình qua mặt
WAF, đó là phương pháp có tên gọi “HTTP parameter pollution” đã được
đề cập ở chương . Phương pháp này sẽ tìm cách tách chuỗi giá trị tham số
thành nhiều cụm, lúc này sẽ xuất hiện ít nhất hai tham số có cùng tên, ví dụ
với URL:
có thể lập một luật để cản phương pháp này, ví dụ:
SecRule &ARGS:keyword “@ge 2”
Lọc các trường trong biến tập sử dụng biểu thức chính quy
Thay vì việc phải thao tác với tất cả các trường hoặc chỉ định đích danh
một trường, ta có thể sử dụng biểu thức chính quy để thao tác với một số
trường có tên tương đồng nhau. Giả sử client submit một form đăng kí tài
khoản, trong đó có các trường firstname, lastname, để ngăn ngừa nguy cơ
SQL Injection trong đó, ta có thể xây dựng một luật dạng như :
SecRule ARGS:/*name/ “select” deny
Luật trên sẽ chỉ bị vi phạm nếu một query string nào đó chứa tham số có
tên chứa “name” và giá trị chứa “select”, nếu không vi phạm hai điều kiện
này thì query string đó hợp lệ (đối với luật trên).
Cấu trúc tham chiếu đến trường trong biến tập sử dụng biểu thức chính
quy có khác so với thông thường ở cặp dấu sổ chéo / (forward slash). Ta
dùng cặp dấu này để thông báo cho engine luật rằng chuỗi bên trong cặp
dấu đó là một biểu thức chính quy. Nếu không có cặp dấu sổ chéo ấy thì chỉ
những trường nào có tên đúng “*name” mới được tham chiếu.
Các hàm chuyển đổi
ModSecurity cung cấp một số các hàm chuyển đổi (transformation) có
thể sử dụng cho các biến và biến tập. Các quá trình biến đổi dữ liệu được
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 85
thực hiện trên bản sao của dữ liệu cần thao tác, do đó các request/response
ban đầu hoàn toàn không bị chỉnh sửa.
Để áp dụng một hàm chuyển đổi, chúng ta cần chỉ định tiền tố t: sau đó
là tên hàm cần gọi, và đặt cụm này vào trong danh sách action của luật. Giả
sử muốn chuyển kiểu của tất cả các tham số trong querystring/POST sang
dạng chữ thường trước khi tiến hành khớp với biểu thức chính quy thì có
thể xây dựng luật như sau:
SecRule REQUEST_URI “<script” “deny,t:lowercase”
Luật trên sẽ chặn bất cứ URL nào chứa “<script”, không quan tâm tới
xâu ký tự đó viết hoa hay thường thế nào.
Có rất nhiều các hàm chuyển đổi được cung cấp sẵn (tham khảo tại:
(
apache/2.5.12/modsecurity2-apache-reference.html#transformation-
functions).
Chúng ta liệt kê một số hàm cơ bản sau:
Tên hàm Tác dụng
compressWhitespace Chuyển các ký tự tab, xuống dòng, carriage return,
form feed thành dấu cách, và chuyển nhiều dấu cách
liên tiếp thành một dấu cách
htmlEntityDecode Giải mã các thuộc tính HTML đã mã hóa, ví dụ
chuyển < thành <
length Chuyển một chuỗi thành giá trị độ dài của nó (kiểu số)
lowercase Chuyển tất cả ký tự của chuỗi về dạng viết thường
md5 Chuyển giá trị đầu vào thành mã băm md5 của nó
none Xóa tất cả các hàm chuyển đổi đang thao tác trên luật
hiện thời
removeNull Xóa các byte null trong chuỗi
removeWhitespace Xóa tất cả các khoảng trắng trong chuỗi
replaceComments Thay tất cả các comment kiểu C (/* … */) bằng một
ký tự dấu cách. Cụm ký tự mở khối comment /* cũng
sẽ được thay bằng một dấu cách ngay cả khi thiếu ký
tự */ tương ứng.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 86
replaceNulls Thay các byte null bằng một dấu cách
urlDecode Giải mã chuỗi có dạng mã hóa URL
urlEncode Mã hóa chuỗi dạng URL
urlDecodeUni Tương tự urlDecode nhưng thao tác giải mã cả với
những ký tự được mã hóa Unicode dạng %uxxx
sha1 Thay giá trị đầu vào bằng mã băm sha1 của nó
trimLeft Xóa mọi khoảng trắng phía bên phía đầu xâu
trimRight Xóa mọi khoảng trắng phía bên phía cuối xâu
trim Xóa mọi khoảng trắng phía đầu và cuối xâu
2.2.9. Các toán tử nâng cao
Các nội dung trước chúng ta đã đề cập đến các toán tử thao tác dữ liệu như
biểu thức chính quy, so sánh chuỗi, so sánh số. Ngoài các toán tử trên còn có
một số toán tử khác khá hữu ích trong những trường hợp cụ thể.
Khớp các mệnh đề với toán tử @pm và @pmFromFile
Chúng ta đã đề cập đến việc sử dụng biểu thức chính quy để khớp một
trong các từ khác nhau với việc sử dụng toán tử | (pipe). Ví dụ khớp select
hoặc update hoặc insert, ta có thể dùng biểu thức chính quy
(select|insert|update). Ngoài ra, ModSecurity cũng cung cấp hai toán tử
khớp theo mệnh đề (phrase matching) có thể sử dụng để thay thế cho biểu
thức chính quy như trên. Hai toán tử đó là @pm và pmFromFile.
Ta có hai luật sau, một sử dụng biểu thức chính quy, một sử dụng toán
tử @pm, đều cho kết quả tương đương:
SecRule ARGS “select|insert|update” “deny,t:lowercase”
SecRule ARGS “@pm select insert update” “deny,t:lowercase”
Các request gửi lên nếu chứa tham số chứa xâu “select”, ”insert”,
”update” (không phân biệt kiểu chữ hoa, thường) thì đều bị chặn.
Khi chúng ta có một danh sách dài các từ cần khớp, nếu liệt kê tất cả
chúng trong khai báo luật thì sẽ rất rối và bất tiện, ví dụ: “insert,
xp_enumdsn, infile, openrowset, nvarchar, autonomous_transaction, print,
data_type, or, outfile, inner, shutdown, tbcreator” hay thậm chí dài hơn như
ở đoạn luật minh họa ban đầu. Để khắc phục điều này, ModSecurity cho
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 87
phép chúng ta khai báo các từ trên trong một file riêng và tham chiếu đến
file đó với toán tử @pmFromFile.
Để thực hiện việc tham chiếu file trên, ta tạo một file, ví dụ
“/etc/modsecurity2/blacklist/keyword.txt”. Trong file trên ta nhập vào các
từ cần khớp, mỗi từ một dòng. Khi đó luật sẽ được mô tả như sau:
SecRule ARGS “@pmFromFile /etc/modsecurity2/blacklist/keyword.txt” deny
Toán tử @pmFromFile sẽ đọc danh sách từ trong file keyword.txt nêu
trên và thực hiện khớp tương tự như toán tử @pm. Có một điều khác biệt
nhỏ giữa @pm và @pmFromFile, đó là @pmFromFile cũng khớp với một
mệnh đề đơn. Tức là nếu ta thêm một cụm như “waitfor delay” vào file
keyword.txt thì luật sẽ khớp tham số với cả cụm “waitfor delay” chứ không
chỉ khớp với “waitfor”.
Ưu điểm của việc sử dụng hai toán tử @pm và @pmFromFile:
- Các luật dễ đọc, dễ viết hơn so với biểu thức chính quy
- Các toán tử này chạy thuật toán Aho-Corasick với độ phức tạp tuyến
tính, nhanh hơn nhiều so với việc sử dụng biểu thức chính quy, nhất
là trên một mẫu thử có nhiều chuỗi.
2.2.10. Các hành động – xử lý các sự kiện khớp luật
Khi một luật được khớp, chúng ta có một số tùy chọn để xử lý: cho phép, từ
chối, hoặc chuyển xử lý sang cho luật tiếp theo, ngoài ra cũng có một số hành
động khác có thể áp đặt như chuyển hướng (redirect) tới một địa chỉ khác hoặc
tới proxy server. Chúng ta sẽ xem xét tất cả các lựa chọn này.
Nhắc lại thứ tự 5 pha xử lý request của ModSecurity:
- Pha 1: REQUEST_HEADERS
- Pha 2: REQUEST_BODY
- Pha 3: RESPONSE_HEADERS
- Pha 4: RESPONSE_BODY
- Pha 5: LOGGING
Cho phép request
Hành động allow sẽ có thể
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 88
- Cho phép truy cập ngay lập tức, bỏ qua các pha xử lý còn lại (trừ phá
ghi log). Trường hợp này action allow được chỉ định theo cách riêng,
với cú pháp sau: SecAction allow
- Cho phép truy cập trong phạm vi pha hiện tại, rule engine có thể
chuyển ngay sang pha xử lý tiếp theo, tuy nhiên các luật trong pha
này hoặc pha sau có thể vô hiệu hóa action allow bằng action deny.
Cú pháp xử lý trong trường hợp này: allow:phase
- Chỉ cho phép truy cập trong các pha request
Nếu sử dụng chỉ định action: allow:request, thì tương đương với việc
request sẽ được cho phép truy cập trong hai pha 1 và 2. Rule engine
sẽ ngay lập tức chuyển sang pha 3 (response header). Các luật ở pha
này và các pha sau có thể vô hiệu hóa action allow bằng action deny.
Chặc các request
Để chặn một request, ta có thể chỉ cần dùng action deny, khi action này
được chỉ định, nó sẽ ngay lập tức dừng tất cả các hoạt động xử lý request
hiện tại, từ chối request này và trả về mã lỗi HTTP được định nghĩa ở
default action.
Ngoài action deny, còn có một action khác tên là block, có thể triển khai
thao tác tương tự deny. Tuy nhiên có rất nhiều điểm còn dễ nhầm lẫn trong
việc sử dụng block, do đó theo khuyến cáo là vẫn chưa nên triển khai các
action block vào các luật trong phiên bản hiện tại của ModSecurity.
Không xử lý, nhưng chuyển quyền xử lý cho luật tiếp theo
Khi một mẫu request khớp với luật, có dấu hiệu tình nghi, chúng ta
muốn thực hiện vài thao tác trên request đó nhưng vẫn chưa muốn chặn nó
lại ngay mà muốn xử lý thêm trong các luật sau đó thì chúng ta có thể sử
dụng action pass để thực hiện điều này. Ví dụ ta có luật sau:
SecRule ARGS|REQUEST_URI “or” “pass,log,logdata:’suspicious
input’,t:lowercase”
Ngắt kết nối với client
Trong một số trường hợp đã phát hiện âm mưu tấn công, nhất là các
dạng DOS, chúng ta có thể chủ động sử dụng action drop để đóng kết nối
TCP tới client. Khi một sự kiện khớp luật xảy ra kèm một action drop,
ModSecurity sẽ gửi một packet TCP fin để ngắt kết nối với client.
Chuyển hướng request
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 89
Khi nhận thấy cần chuyển request tới một server khác để xử lý đúng
theo thẩm quyền hoặc chức năng, ta có thể sử dụng action redirect để thực
hiện điều này. Khi nhận được action này, rule engine sẽ dừng việc xử lý
request này lại và trả về mã HTTP 302 (redirect) cho client. Ví dụ một luật
như sau:
SecRule REQUEST_BASENAME “search.php”
“redirect:”
Một điều chú ý ở đây, đó là nếu như địa chỉ được chuyển tới không phải
là server hiện tại thì luôn phải có http:// trong địa chỉ cung cấp cho action
redirect. Nếu không, giả sử địa chỉ trang web hiện tại là
thì địa chỉ sẽ được chuyển tới sẽ là
chứ không phải địa chỉ chúng ta muốn.
Ngoài việc chuyển hướng request, chúng ta còn có thể định hướng
request tới một proxy server được chỉ định. Trong ngữ cảnh chúng ta đang
nghiên cứu, thì proxy server này đảm nhận vai trò một mồi nhử (honeypot)
nhằm đánh lạc hướng kẻ tấn công. Trong Apache, để có thể hướng request
tới proxy, cần cài thêm module mod_proxy. Trong Mod_Security để định
hướng sang proxy server, chúng ta sử dụng action proxy, ví dụ một luật sau:
SecRule ARGS|REQUEST_URI “@pm waitfor benchmark sleep”
“proxy:”
Sử dụng chỉ thị SecAction
SecAction là một chỉ thị không kèm điều kiện. Tham số duy nhất của
chỉ thị này là danh sách các action cần thực thi. Chỉ thị này rất hữu ích cho
việc thực thi một action nào đó một cách vô điều kiện, ngoài ra đây cũng là
chỉ thị hữu ích có thể dùng khi chúng ta muốn chạy một action như initcol
để khởi tạo một biến tập.
Xét một chỉ thị:
SecAction “pass,log,logdata:’this is a test’”
Một điều quan trọng cần nhớ, đó là cần chỉ định một action pass trong
chỉ thị SecAction, nếu không các default action sẽ được thêm vào trong chỉ
thị này. Tai hại là ở chỗ, các default action thường là deny, và do đó nếu
thiếu action pass ở chỉ thị SecAction, mọi request sẽ bị deny bởi chỉ thị này
không áp dụng bất cứ điều kiện nào.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 90
2.2.11. Sử dụng ctl để điều khiển rule engine
Action ctl là một action được cung cấp đầy đủ sức mạnh để điều khiển được
rule engine của ModSecurity. Khi sử dụng action này, chúng ta có thể cấu hình
lại được rule engine trong vòng một vòng đời transaction. Các tham số sau có
thể được truyền cho action ctl để điều khiển cấu hình tương ứng của
ModSecurity.
Tham số Tác dụng Chỉ thị tương đương
auditEngine Tắt/bật audit
engine
SecAuditEngine
auditLogParts Định nghĩa dữ
liệu nào được
thêm vào audit
log
SecAuditLogParts
debugLogLevel Thay đổi cấp độ
log debug
SecDebugLogLevel
requestBodyAccess Tắt/bật chế độ
truy cập nội dung
thân request
SecRequestBodyAccess
requestBodyLimit Định mức giới
hạn cho thân
request
SecRequestBodyLimit
ruleRemoveById Xóa một luật
hoặc một số luật
liên quan
SecRuleRemoveById
requestBodyProcessor Cấu hình bộ xử
lý thân request
(không có)
responseBodyAccess Tắt/bật chế độ
truy cập vào thân
response
SecResponseBodyAccess
responseBodyLimit Đặt giới hạn cho
thân response
SecResponseBodyLimit
ruleEngine Bật tắt rule
engine hoặc
chuyển nó sang
SecRuleEngine
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 91
chế độ Detection
only
Giả sử ta sử dụng action ctl để chỉ định bộ xử lý thân request phải xử lý
thân truy vấn đó ở dạng XML đối với những request có nội dung thân là XML
như sau:
SecRule REQUEST_HEADERS:Content-Type “^text/xml$”
“nolog,pass,ctl:requestBodyProcessor=XML,ctl:requestBodyAccess=On”
2.2.12. Macro expansion
Macro expansion là khả năng thêm (include) dữ liệu từ các biến hoặc các
biến tập trong thông điệp log, hoặc sử dụng để khởi tạo một biến khác. Việc sử
dụng macro expansion được thực hiện bằng cách bao biến/biến tập trong cặp
ngoặc nhọn phía trước là dấu %. Ví dụ ta gán giá trị một biến :
SecAction “pass,setenv:ADDR=%{REMOTE_ADDR}”
Khi tham chiếu tới dữ liệu của trường trong biến tập, phải sử dụng dấu
chấm để ngăn cách tên trường và tên biến tập, ví dụ:
SecRule REQUEST_URI “admin” “log,msg:%{TX.0}”
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 92
Tài liệu tham khảo
[1] Chris Anley. “Advanced SQL”. NGSSoftware Insight Security Research
Publication 2002
[2] Chris Anley. “(more) Advanced SQL Injection”. NGSSoftware Insight Security
Research Publication 2002.
[3] Luca Carettoni. “HTTP Parameter Pollution”. The OWASP Foundation.
[4] Justin Clarke. “SQL Injection Attack and Defense”. Syngress Publishing, Inc
2009.
[5] Bernardo Damele A.G. “SQL Injection: Not Only AND 1=1”.
[6] Dmitri Evteev. “Methods to Bypass a Web Application Firewall”. Positive
Technology research.
[7] Dmitri Evteev. “Methods of quick exploitation of Blind SQL Injection”. Positive
Technology research.
SQL-Injection.pdf
[8] OWASP Foundation. “Securing WebGoat Using ModSecurity”.
Security_Project
[9] OWASP Foundation. “OWASP WebGoat and WebScarab Project”.
Khóa luận tốt nghiệp - 2010
SQL Injection – Tấn công và cách phòng tránh 93
[10] Cameron HotchKies. “Blind SQL Injection Automation Techniques”. Blackhat
Briefings USA 2004. https://www.blackhat.com/presentations/bh-usa-04/bh-us-04-
hotchkies/bh-us-04-hotchkies.pdf
[11] Stephen Kost. “An Introduction to SQL Injection Attacks for Oracle Developers -
Jan 2004”.
resources/whitepapers/Integrigy_Oracle_SQL_Injection_Attacks.pdf
[12] Alexander KornBrust. “Bypassing Oracle dbms_assert”. Red Database Security.
[13] David Litchfield. “Bypassing Oracle DBMS_ASSERT (in certain situation) July
2008”.
[14] David Litchfield. “Securing PL/SQL Application with DBMS_ASSERT Oct
2005”. NGSSoftware Insight Security Research Publication.
[15] David Litchfield. “Data-mining with SQL Injection and Inference Sep 2005”.
NGSSoftware Insight Security Research Publication.
[16] Magnus Mischel. “ModSecurity 2.5 Securing your Apache installation and Web
application”. Packt Publishing 2009. Tr 41-75.
Các file đính kèm theo tài liệu này:
- SQL Injection – tấn công và cách phòng tránh.pdf