Như chúng ta đã biết OWASP ZAP là 1 Tool Test Security hoàn toàn mạnh mẽ, giúp bạn dễ dàng scan và tìm ra lỗ hổng trong hệ thống ứng dụng của bạn. Bạn nào chưa biết về OWASP ZAP thì có thể tham khảo bài viết trước của mình.
https://blog.vietnamlab.vn/2018/08/08/owasp-zap-de-test-security-cho-web-application-va-api/
Thực tế là trong bài viết trước, mình chỉ test một chức năng nhỏ trong ứng dụng của mình, nên chưa gặp và lường trước được những vấn đề có thể xảy ra. Sau khi test một ứng dụng lớn chính mình cũng gặp phải những vấn đề không lường trước được, nay trong bài viết này mình sẽ trình bày những vấn đề đó và thêm một số mẹo vặt khi sủ dụng OWASP ZAP.
Tắt internet trước khi test
Tại sao lại phải làm như vậy, cơ chế của OWASP ZAP là nó sẽ ghi lại các link URL của ứng dụng khi mình thao tác trên Browser, dựa vào những link request đó, OWASP ZAP sẽ thêm các param, chèn script , giả lập hàng ngàn các query khác nhau đánh vào những link URL mà nó bắt được để tìm ra lổ hổng của ứng dụng.
Bạn thấy là nó chỉ đánh vào những link mà nó bắt được thôi thì mình chỉ cần kiểm soát những link đó thì việc gì phải tắt internet. Nhưng giả sử trong ứng dụng của bạn có chức năng send mail khi thay đổi password chẳng hạn, bạn không tắt internet thì nó sẽ send mail vô tội vạ, hoặc gửi mail thông báo đến bên thứ 3, trừ khi nào bạn nắm bắt và control được toàn bộ hệ thống ứng dụng của bạn thì bạn có thể tự tin không tắt internet. Nếu bạn mới join vào dự án và bị bắt test OWASP ZAP thì lời khuyên là nên tắt internet nếu không muốn ăn hành.
※ Có 2 cách để tắt internet
■ Cách 1:
Tắt internet trên máy PC mà bạn thực hiện chạy test. Với cách này thì bạn không thê sử dụng được internet để nghe nhạc hay xem phim được nữa, thật bất tiện phải không.
■ Cách 2:
Nếu ứng dụng của bạn chạy trên môi trường linux, bạn có thể thực hiện cách sau để ngắt kết nối từ môi trường ứng dụng local của bạn tới internet
- Kiểm tra default getway
root@vagrant:~# ip route list default
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100
- Xóa default getway
root@vagrant:~# ip route del default
- Kiểm tra xem môi trường local còn kết nối được với internet hay không
root@vagrant:~# ping www.google.com
connect: Network is unreachable
root@vagrant:~# ping 8.8.8.8
connect: Network is unreachable
- Sau khi test xong bạn muốn kết nối lại với internet
root@vagrant:~# ip route add default via 10.0.2.2
Với 2 cách tắt internet như trên bạn có thể thoải mái test ứng dụng của mình mà không sợ nó làm ảnh hưởng tới bên thứ 3 hoặc các ứng dụng khác, mọi hoạt động test chỉ thực hiện trong môi trường local máy tính của bạn.
Disable chức năng lock account và các chức năng xóa tài khoản
Tại sao lại phải làm như vậy, bạn đã cất công thiết lập user password để OWASP ZAP có thể đăng nhập lại mỗi khi nó quét tới chức năng logout, nếu ứng dụng của bạn có chức năng login sai 5 lần thì khóa tài khoản đi, thì OWASP ZAP nó giả lập request đăng nhập 5 lần sai thì tài khoản của bạn bị khóa mẹ rồi, nó đâu còn đăng nhập vô được nữa mà quét được các chức năng cần đăng nhập phải không, tương tự chức năng xóa tài khoản cũng vậy, nếu lỡ nó quét tới chức năng xóa tài khoản thì tài khoản bạn thiết lập cho OWASP ZAP bị xóa luôn nhé,và không test được các chức năng khác đâu.
Chức năng login phức tạp
Ở những hệ thống lớn, đòi hỏi việc bảo mật cao, chức năng login rất phức, nó không chỉ đơn giản là login rồi logout, mà nhiều hệ thống nó còn gửi token OTP tới điện thoại để mình nhập vô rồi mới cho Login. Khi test Zap nó login và nó không bắt được cái regex pattern vì tài khoản chưa thực sự login mà nó đang ở bước nhập token, dẫn đến ta không test được các chức năng cần login. Vậy khi test những hệ thống như thế ta phải làm sao???
Lời khuyên là ta phải disable cái chức năng đó đi, hoặc là sử dụng một tài khoản test đã được chứng thực
, đã được chứng thực nghĩa là sao, tức là tài khoản đã đăng nhập và thỏa mãn các yêu cầu của ứng dụng, thì hệ thống sẽ không yêu cầu phải nhâp token OTP nữa, thì lúc đó ta sẽ login trực tiếp mà không phải thông qua bước nhập token. Các bạn yên tâm là hệ thống bắt buộc phải có chức năng đó, chứ nếu mỗi lần đăng nhặp mà cứ bắt người dùng nhập token , thì người dùng ức chế không thèm sài đâu.
Bỏ sót các chức năng, các API của ứng dụng.
Bạn muốn test toàn bộ ứng dụng, nhưng thao tác của bạn trên browser chưa đủ hoặc thiếu sót, dẫn đến việc OWASP ZAP không bắt được các link để test, hoặc có những API chạy bằng ajax trong ứng dụng của bạn OWASP ZAP cũng không bắt được.
Để tránh việc bỏ sót các chức năng, bạn nên liệt kê ra hết tất cả các action của controller, và truy cập vào từng cái một, và bạn có thể dùng postman để đánh vào các API được chạy ngầm bên trong ứng dụng, những thiết lập đã được mình trình bày trong bài viết trước.
Kiểm tra bộ nhớ heap
Trong trường hợp khi test những trang web lớn sẽ dẫn đến tính trạng hết bộ nhớ heap, OWASP ZAP được set mặc định là 512MB cho bộ nhớ này, nếu lỗi này xảy ra, OWASP ZAP vẫn sẽ tiếp tục scan và tìm kiếm lỗ hổng, nhưng kết quả của việc tìm kiếm không được ghi vào report.
Caused by: java.lang.OutOfMemoryError: Java heap space
2019-01-24 08:26:01,823 [ZAP-ActiveScanner-0] ERROR ActiveScan-java.sql.SQLException: java.lang.OutOfMemoryError: Java heap space
org.parosproxy.paros.db.DatabaseException: java.sql.SQLException:java.lang.OutOfMemoryError: Java heap space
Như hình phía trên trong progress nó phát hiện ra 6 lỗi SQL injection mà trong alerts không được ghi lại. Thật là mất thời gian khi ngồi chờ Zap scan xong mà lại chẳng có report phải không, rất là ức chế. Chính vì vậy hãy chú ý đến phần này.
Cách giải quyết
- Trong option chọn JVM và điều chỉnh bộ nhớ heap.
Không lưu được Sessions quá lớn, và cũng không mở được Sessions quá lớn
Khi scan toàn bộ ứng dụng lớn, thời gian scan sẽ rất lâu, có thể mất cả tuần, trong thời gian đó đột nhiên bị cúp điện chẳng hạn mà quá trình scan chỉ mới dc 50%, dữ liệu scan được sẽ mất hết, mà ví dụ là có thể scan được 100% đi nhưng ta không thể lưu được session vì file session.data nó quá lớn, OWASP ZAP chỉ lưu được tối đa 16GB.
Chính vì những vấn đề trên ta nên chia nhỏ các ra các phần để test, sau đó sẽ tổng hợp các file report lại. Ví dụ như chỉ quét folder account, quét xong rồi quét tiếp các folder khác, như vậy thời gian quét sẽ không quá lâu và file session.data cũng không quá lớn.
Còn 1 cách nữa quét từng progress. Trong tab progress tích skip các progress khác và chỉ quét progress mà mình cần quét ví dụ SQL Injection chẳng hạn. Cách này cũng giống như cách trên, thời gian quét sẽ ngắn, và dữ liệu không quá lớn. Mình thích cách này hơn.
Kết luận:
OWASP ZAP là công cụ test security cực kì hữu ích, với rất nhiều tính năng, những tính năng chính thì hầu như đã có rất nhiều bài Blog đã trình bày, nhưng những thủ thuật hay những vấn đề gặp khi test thực tế, thì hầu như rất ít.
Đã ăn hành và đúc kết được những kinh nghiệm, viết bài blog này hy vọng có thể giúp ích được những thế hệ mai sau. Còn rất nhiều điều phải tìm hiểu viết thêm về OWASP ZAP, hy vọng sẽ có thêm ít kinh nghiệm khi test thực tế, để chia sẽ với mọi người ở bài blog tiếp theo.