DDos
VIP Members
-
22/10/2013
-
524
-
2.189 bài viết
Một vài phương pháp vượt qua tường lửa ứng dụng web để tìm lỗ hổng XSS
Cross-Site Scripting (XSS) là một lỗ hổng ứng dụng web rất phổ biến. Lỗi XSS được thực hiện dựa trên việc chèn các đoạn script nguy hiểm vào trong mã nguồn ứng dụng web, nhằm thực thi các đoạn mã độc Javascript để chiếm phiên đăng nhập của người dùng. Theo thống kê từ hai nền tảng săn tìm lỗ hổng nổi tiếng HackerOne và BugCrowd, số lượng lỗ hổng XSS luôn ở vị trí đầu tiên.
Do mức độ phổ biến của lỗ hổng, một trong số biện pháp hữu hiệu nhất để ngăn ngừa đó là sử dụng tường lửa ứng dụng web (WAF). WAF cơ bản là tấm lá chắn giữa trình duyệt của bạn và ứng dụng web. WAF có thể được so sánh như một nhân viên bảo vệ của một tòa nhà nào đó, và nhân viên này có thể cho phép hoặc từ chối bất kỳ ai đi vào tòa nhà này. WAF có thể là chương trình phần mềm, hoặc thiết bị phần cứng mà nó lọc các yêu cầu tin đi từ trình duyệt tới ứng dụng web.
WAF có thể từ chối hoặc cho phép bất kỳ yêu cầu giữa các thiết bị dựa trên các nguyên tắc mà nó đã được cấu hình hoặc cài đặt bởi một người quản trị tường lửa. Rất nhiều WAF hoạt động trên một tập hợp các thiết lập (danh sách trắng hoặc danh sách đen) đã được cài đặt sẵn mà nó có thể ngăn ngừa các hiểm họa thông thường, người sử dụng không cần lo lắng về việc phải cấu hình firewall như thế nào.
Để vượt qua WAF, trước hết chúng ta cần tìm hiểu xem cách thức nó hoạt động. WAF thường hoạt động dựa trên 4 quy tắc dưới đây:
Một vài cách vượt qua tường lửa ứng dụng web (WAF) để tìm lỗ hổng XSS
1. Encoding bypass
Sử dụng các loại mã hóa đối với XSS Payload là một phương pháp đầu tiên được nghĩ tới. Đối với các WAF được cấu hình không đủ mạnh, phương pháp này rất hiệu quả. Một vài kiểu mã hóa có thể được sử dụng như:
Trong mã nguồn của ứng dụng web, do trình phân tích cú phát của nó, bất kỳ thẻ hay một hàm nào đều cần chạy với một cú pháp đúng. Do đó chỉ cần thêm các ký tự để kết thúc một hàm hoặc một thẻ html đồng thời chèn một XSS Payload sẽ giúp kích hoạt lỗi, ví dụ như:
"><script>alert(/123/)</script>
</script><script>alert(1)</script>
3. Case insensitive
Đối với WAF hoạt động theo cách thức danh sách đen hoặc danh sách trắng, việc tạo chữ ký không đầy đủ có thể dẫn đến thiếu xót trong việc ngăn chặn một XSS Payload độc hại. Việc thay đổi các dữ liệu đầo vào với các xáo trộn cũng có thể giúp vượt qua WAF, ví dụ như:
<ScRIpT>alert('123')</sCRIpT>
4. Sử dụng các thẻ HTML và sự kiện (event) JavaScript ít phổ biến:
Tương tự như phương pháp số 3, một WAF cấu hình không đủ mạnh có thể bỏ qua nhiều XSS Payload được cấu tạo bởi các thẻ HTML và sự kiện trong JavaScript ít phổ biến. Ví dụ như:
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a
<style/i=javascript:alert(1)’onload=’URL=i’>
5. Sử dụng các bình luận/mô tả
Các ngôn ngữ như HTML và JavaScript đều có các hàm/thẻ cho các nhà phát triển nhằm diễn giải mục đích của hàm được viết. Tận dụng những bình luận/mô tả này, kẻ tấn công có thể đưa XSS Payload vào ứng dụng web. Ví dụ như:
%0aalert(1);
/**/
%00
6. Sử dụng hai hoặc nhiều thẻ/sự kiện lặp lại:
Một số WAF sẽ phân tích XSS Payload từ dữ liệu đầu vào của người dùng, khi gặp một số Payload phổ biến, nó sẽ loại bỏ một số thành phần trong XSS Payload, nếu bạn lặp lại các thẻ hoặc sự kiện cũng có thể vượt qua WAF. Ví dụ như:
<img ononerrorerror="123">
<script><script>alalertert(123)</script>
7. Sử dụng các thủ thuật như:
Do mức độ phổ biến của lỗ hổng, một trong số biện pháp hữu hiệu nhất để ngăn ngừa đó là sử dụng tường lửa ứng dụng web (WAF). WAF cơ bản là tấm lá chắn giữa trình duyệt của bạn và ứng dụng web. WAF có thể được so sánh như một nhân viên bảo vệ của một tòa nhà nào đó, và nhân viên này có thể cho phép hoặc từ chối bất kỳ ai đi vào tòa nhà này. WAF có thể là chương trình phần mềm, hoặc thiết bị phần cứng mà nó lọc các yêu cầu tin đi từ trình duyệt tới ứng dụng web.
WAF có thể từ chối hoặc cho phép bất kỳ yêu cầu giữa các thiết bị dựa trên các nguyên tắc mà nó đã được cấu hình hoặc cài đặt bởi một người quản trị tường lửa. Rất nhiều WAF hoạt động trên một tập hợp các thiết lập (danh sách trắng hoặc danh sách đen) đã được cài đặt sẵn mà nó có thể ngăn ngừa các hiểm họa thông thường, người sử dụng không cần lo lắng về việc phải cấu hình firewall như thế nào.
Để vượt qua WAF, trước hết chúng ta cần tìm hiểu xem cách thức nó hoạt động. WAF thường hoạt động dựa trên 4 quy tắc dưới đây:
- Phát hiện các giao thức ngoại lệ, ví dụ như từ chối các yêu cầu không đáp ứng tiêu chuẩn HTTP
- Xác thực và kiểm tra dữ liệu đầu vào
- Danh sách trắng & danh sách đen (Whitelist & Blacklist )
- Ngoài ra còn có: Bảo vệ cookie, công nghệ tránh xâm nhập, giám sát phản hồi ...
Một vài cách vượt qua tường lửa ứng dụng web (WAF) để tìm lỗ hổng XSS
1. Encoding bypass
Sử dụng các loại mã hóa đối với XSS Payload là một phương pháp đầu tiên được nghĩ tới. Đối với các WAF được cấu hình không đủ mạnh, phương pháp này rất hiệu quả. Một vài kiểu mã hóa có thể được sử dụng như:
- Hex encode: <0x736372697074>alert('123')</0x736372697074>
- jsfuck
- Url encode: %3Cimg%20src%3Dx%20onerror%3Dprompt(1)%3E
- Unicode encode: +ADw-img src+AD0-x onerror+AD0-prompt(1)+AD4-
- magic_quotes_gpc <script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>
Trong mã nguồn của ứng dụng web, do trình phân tích cú phát của nó, bất kỳ thẻ hay một hàm nào đều cần chạy với một cú pháp đúng. Do đó chỉ cần thêm các ký tự để kết thúc một hàm hoặc một thẻ html đồng thời chèn một XSS Payload sẽ giúp kích hoạt lỗi, ví dụ như:
"><script>alert(/123/)</script>
</script><script>alert(1)</script>
3. Case insensitive
Đối với WAF hoạt động theo cách thức danh sách đen hoặc danh sách trắng, việc tạo chữ ký không đầy đủ có thể dẫn đến thiếu xót trong việc ngăn chặn một XSS Payload độc hại. Việc thay đổi các dữ liệu đầo vào với các xáo trộn cũng có thể giúp vượt qua WAF, ví dụ như:
<ScRIpT>alert('123')</sCRIpT>
4. Sử dụng các thẻ HTML và sự kiện (event) JavaScript ít phổ biến:
Tương tự như phương pháp số 3, một WAF cấu hình không đủ mạnh có thể bỏ qua nhiều XSS Payload được cấu tạo bởi các thẻ HTML và sự kiện trong JavaScript ít phổ biến. Ví dụ như:
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a
<style/i=javascript:alert(1)’onload=’URL=i’>
5. Sử dụng các bình luận/mô tả
Các ngôn ngữ như HTML và JavaScript đều có các hàm/thẻ cho các nhà phát triển nhằm diễn giải mục đích của hàm được viết. Tận dụng những bình luận/mô tả này, kẻ tấn công có thể đưa XSS Payload vào ứng dụng web. Ví dụ như:
%0aalert(1);
/**/
%00
6. Sử dụng hai hoặc nhiều thẻ/sự kiện lặp lại:
Một số WAF sẽ phân tích XSS Payload từ dữ liệu đầu vào của người dùng, khi gặp một số Payload phổ biến, nó sẽ loại bỏ một số thành phần trong XSS Payload, nếu bạn lặp lại các thẻ hoặc sự kiện cũng có thể vượt qua WAF. Ví dụ như:
<img ononerrorerror="123">
<script><script>alalertert(123)</script>
7. Sử dụng các thủ thuật như:
- sử dụng dấu `` thay vì dấu (). Ví dụ: <a style='color:red'onmouseover=this.onmouseover=alert`1`>aaa</a>
- sử dụng %2f thay vì /. Ví dụ: <body%2fonpageshow=confirm(1)
- không sử dụng khoảng trắng trong XSS Payload. Ví dụ: <style/onload=alert(1)>