Một số hình thức tấn công Web và giải pháp phòng chống

Một phần của tài liệu Mật mã và An toàn thông tin trên mạng máy tính (Trang 126)

II. An toàn dịch vụ Web

2.Một số hình thức tấn công Web và giải pháp phòng chống

a. Thao tác trên tham số truyền

Thao tác trên tham số truyền là kỹ thuật thay đổi thông tin quan trọng trên cookie, URL hay biến ẩn của Form. Các kỹ thuật khác như: Cross-Site-Scripting, SQL Injection, Buffer OverFlow,… cũng cần dùng đến các tham số này để Hacker hoàn

thiện các bước tấn công. Có thể nói tham số truyền là đầu mối cho mọi hoạt động của Hacker trong quá trình tấn công ứng dụng.

 Thao tác trên URL

Khi nhập một form HTML thì kết quả sẽ được gửi đi theo 2 cách: GET hoặc POST. Nếu dùng GET thì tất cả các tên biến và giá trị của nó sẽ xuất hiện trong chuỗi URL.

Khi người dùng thay đổi mật khẩu đăng nhập trên một website sử dụng phương thức GET, thì URL gửi lên Server sẽ có dạng:

Nếu Hacker nhìn thấy cấu trúc URL này, Hacker có thể nhập lại với mật khẩu bất kỳ mà Hacker muốn. Như vậy, tài khoản này đã thuộc về tay Hacker.

Ví dụ:

Để chống lại kiểu tấn công thay đổi nội dung một chuỗi URL, có thể áp dụng một số biện pháp sau:

- Sử dụng mã hàm băm để che dấu thông tin về username và password trên chuỗi URL khi người dùng đăng nhập;

- Với những thông tin có giá trị cũng cần mã hoá trước khi cho hiển thị trên trình duyệt để tránh Hacker có thể sửa đổi tuỳ ý.

 Thao tác trên biến ẩn Form

Thông tin có thể được trao đổi thông qua một biến ẩn của Form, gọi là “hidden form field”. Biến ẩn của Form không hiển thị trên màn hình trình duyệt nhưng người dùng có thể tìm thấy nội dung của nó trong “view source”. Vì thế đây là một điểm yếu để Hacker lợi dụng bằng cách tải trang web xuống trình duyệt, thay đổi nội dung trang và gửi đến trình chủ.

Ví dụ một Form có nội dung như sau:

Nếu không có sự thay đổi nào thì yêu cầu đến trình chủ có nội dung:

Thì yêu cầu gửi đến Server sẽ là:

Ngoài việc thay đổi nội dung biến ẩn, Hacker còn có thể thay đổi nội dung các thành phần khác trong Form, như chiều dài của một ô nhập dữ liệu để thực hiện việc tấn công Buffer OverFlow, …

Một số biện pháp khắc phục:

- Chỉ nên sử dụng biến ẩn của Form để hiển thị dữ liệu trên trình duyệt, không sử dụng giá trị của biến để thao tác trong xử lý ứng dụng ;

- Dùng biến HTTP-REFERER để kiểm tra nguồn gốc của yêu cầu gửi đến, tuy nhiên Hacker vẫn có thể sử dụng Proxy để che dấu nguồn gốc thực. Vì vậy cũng không nên quá tin tưởng vào HTTP-REFERER ;

- Ghép tên và giá trị của biến ẩn thành một chuỗi đơn, sử dụng thuật toán mã hoá MD5 hoặc một mã hàm băm (Hash) có chiều dài khác để tổng hợp chuỗi đó và lưu nó vào một hidden field gọi là “chuỗi mẫu”. Khi giá trị trong Form được gửi đi, các thao tác như trên được thực hiện lại với cùng một khoá mà ta định trước. Sau đó đem so sánh với “chuỗi mẫu”, nếu chúng không khớp nhau thì chứng tỏ giá trị trong biểu mẫu đã bị thay đổi ;

- Dùng một SessionID để tham chiếu đến thông tin được lưu trữ trên cơ sở dữ liệu.

 Thao tác trên Cookie

Cookie thường được dùng để lưu trữ trạng thái cho giao thức HTTP, một số thông tin của người dùng khi truy cập website và những dữ liệu khác của Session. Tất cả các loại cookies như: Persistent hay Non-Persistent, Secure hay Non-Secure đều có thể bị thay đổi bởi người dùng và được gửi về cho trình chủ. Do đó Hacker có thể thay đổi nội dung của Cookie để phá hoại ứng dụng.

Với những công cụ miễn phí như Winhex thì non-persistent cookie có thể bị thay đổi nội dung, còn SSL thì chỉ bảo vệ được Cookie trong quá trình truyền.

Ví dụ một Cookie lưu giữ thông tin của một ứng dụng Web:

Cookie xác định người dùng này không phải là một Admin (admin = no), Hacker có thể đổi lại như sau:

Lúc này Hacker sẽ trở thành một thành viên quản trị của ứng dụng Web. Một số giải pháp phòng chống:

- Sử dụng Session lưu trữ các thông tin quan trọng trên trình chủ. Khi ứng dụng cần kiểm tra thông tin của một người dùng, ứng dụng sẽ dùng SessionID của người

- Xây dựng một cơ chế kiểm tra nội dung của Cookie để tìm ra những giá trị không hợp lệ, từ đó có thể biết được Cookie đó là giả. Ví dụ nếu biến “ADMIN” được thiết lập bằng “yes” trong Cookie, nhưng số thứ tự người dùng trong Cookie lại không giống giá trị số thứ tự của người quản trị thì có thể khẳng định Cookie đó là giả;

- Dùng kỹ thuật mã hoá Cookie như symmetric (mã hoá đối xứng) hay asymmetric (mã hoá bất đối xứng). (adsbygoogle = window.adsbygoogle || []).push({});

 Theo tác trên HTTP Header

Tất cả các tham số URL, biến ẩn Form, Cookie đều được chuyển đi thông qua HTTP Header. Vì thế HTTP Header không phải là tham số truyền của một ứng dụng Web nhưng mọi thông tin đều được lưu trữ vào nó trước khi chuyển đi nên Hacker có thể tấn công thay đổi HTTP Header.

Cấu trúc một HTTP Header

Phần in đậm là nội dung Hacker có thể thay đổi.

Giải pháp phòng chống: đơn giản là không tin tưởng vào HTTP header nếu chưa có các biện pháp an toàn. Với những Header gửi từ trình chủ, chẳng hạn như cookie thì có thể được mã hoá. Còn với những Cookies gửi từ trình khách thì không nên dùng các tham số như Referer, … để thực hiện các biện pháp kiểm tra an toàn.

 Nhận xét:

Mọi thông tin quan trọng trao đổi giữa trình duyệt và trình chủ không nên lưu trữ dưới dạng chuỗi thông thường mà cần được mã hoá. Ngoài ra những thông tin này nên được kiểm tra, đối chiếu với dữ liệu trong cơ sở dữ liệu hay trong Cache của trình chủ, phòng tránh trường hợp nội dung thông tin bị sai lệch.

Bên cạnh đó việc kiểm tra sự đúng đắn của dữ liệu là cần thiết vì hầu hết các kỹ thuật tấn công tiếp theo đều dựa vào dữ liệu nhập trên URL, biến ẩn của Form hay Cookie.

b. Chèn mã lệnh thực thi trên trình duyệt nạn nhân (XSS)

XSS (Cross Site Scripting) là phương pháp tấn công bằng cách chèn thêm các đoạn mã có khả năng đánh cắp thông tin hay thiết lập được những thông tin quan trọng như cookies, mật khẩu, …vào mã nguồn ứng dụng web để từ đó chúng được chạy như

một phần của ứng dụng web và có chức năng cung cấp hoặc thực hiện những điều mà Hacker muốn.

Phương pháp này không nhằm vào hệ thống máy chủ mà chủ yếu tấn công trên chính máy người sử dụng. Hacker sẽ lợi dụng sự kiểm tra lỏng lẻo từ ứng dụng web và hiểu biết hạn chế của người dùng như đánh vào sự tò mò của họ để dẫn dụ người dùng đánh mất thông tin một cách dễ dàng.

Thông thường Hacker lợi dụng địa chỉ URL để đưa ra những liên kết (link) là tác nhân kích hoạt những đoạn chương trình được viết bằng ngôn ngữ máy khách như: VBScript, JavaScript, … được thực thi trên chính trình duyệt của nạn nhân.

Ví dụ: (phần in đậm là phần Hacker thêm vào)

 Hình thức tấn công XSS truyền thống

Ứng dụng web thường lưu trữ thông tin quan trọng ở Cookie, chỉ khi người dùng đang trong phiên làm việc thì Hacker mới có cơ hội đánh cắp cookie. Công việc đầu tiên của Hacker là tìm trang web có lỗ hổng để dụ người dùng đăng nhập.

Các bước thực hiện tấn công XSS truyền thống:

- Bước 1: Hacker tìm ra ứng dụng web có lỗ hổng XSS

- Bước 2: Gửi cho người dùng một liên kết thông qua email hay trên chính trang web (như trên guestbook, banner dễ dàng thêm vào một liên kết do chính Hacker tạo ra). Thông thường Hacker khiến người dùng chú ý bằng những câu kích thích sự tò mò như: “một phần thưởng hấp dẫn đang chờ bạn”, …

- Bước 3: Chuyển các thông tin (cookie, tên, mật khẩu, …) về máy chủ của Hacker.

- Bước 4: Hacker tạo một chương trình CGI hoặc một trang web để ghi nhận những thông tin đánh cắp vào một tập tin.

- Bước 5: Sử dụng các thông tin thu thập được để đăng nhập bằng tài khoản người dùng.

Ngoài cách đưa một đoạn mã nguy hiểm thì Hacker có thể lợi dụng những tập tin flash để đánh cắp thông tin. Macromedia flash cho phép lập trình bằng một ngôn ngữ kịch bản đã được xây dựng sẵn là ActionScript. ActionScript có cú pháp đơn giản và tương tự như JavaScript, C hay Perl.

Ví dụ hàm GetURL() để gọi một trang web khác

Tuy nhiên có thể thay thế URL bằng JavaScript

Thao tác trên sẽ làm xuất hiện bảng thông báo chứa cookie của trang web chứa tập tin flash đó. Như vậy là trang web đó đã bị tấn công bằng cách chèn một đoạn JavaScript vào ứng dụng web thông qua tập tin flash.

 Một số giải pháp phòng chống tấn công XSS

Với những dữ liệu, thông tin do người dùng nhập vào, người thiết kế ứng dụng web cần phải thực hiện các bước cơ bản sau:

- Tạo ra danh sách những thẻ HTML được phép sử dụng;

- Xoá bỏ thẻ <Script>; (adsbygoogle = window.adsbygoogle || []).push({});

- Lọc ra bất kỳ một đoạn mã JavaScript/Java/VBScript/ActiveX/Flash Related nào;

- Lọc dấu nháy đơn hay kép

- Lọc ký tự Null (vì khả năng thêm một đoạn mã bất kỳ sau ký tự Null khiến cho ứng dụng dù đã bỏ thẻ <Script> vẫn không nhận ra do ứng dụng nghĩ rằng chuỗi đã kết thúc từ ký tự null này);

- Xoá những ký tự “<” và “>”;

- Vẫn cho phép nhập những ký tự đặc biệt nhưng sẽ được mã hoá theo chuẩn riêng.

Đối với người dùng, cần cấu hình lại trình duyệt nhắc nhở khi muốn thực thi ngôn ngữ kịch bản trên máy khách.

Kỹ thuật XSS khá phổ biến và dễ dàng áp dụng, tuy nhiên chỉ thực hiện được ở máy nạn nhân thông qua những liên kết hay form lừa đảo mà Hacker đưa đến cho nạn nhân. Vì thế ngoài việc ứng dụng kiểm tra tính đúng đắn của dữ liệu trước khi sử dụng thì việc cần nhất là người dùng nên cảnh giác trước khi bước vào một trang web mới. Có thể nói, nhờ vào sự cảnh giác của người dùng thì đã đạt được 90% sự bảo mật đối với kỹ thuật tấn công này.

c. Chèn câu truy vấn SQL (SQL Injection)

SQL Injection là cách lợi dụng những lỗ hổng trong quá trình lập trình web về phần truy xuất dữ liệu. Đây không phải là vấn đề của riêng SQL Sever mà còn là vấn đề chung cho toàn bộ các cơ sở dữ liệu khác như Ms Access, Oracle hay IBM DB2,…

cơ sở dữ liệu. Nhờ những thông tin này mà Hacker biết được nội dung cơ sở dữ liệu và từ đó có thể điều khiển toàn bộ hệ thống ứng dụng.

Ví dụ: một website có Form yêu cầu người dùng đăng nhập bằng tài khoản được cấp để sử dụng. Mã code kiểm tra tính hợp lệ của tài khoản như sau:

Đoạn mã trên kiểm tra chuỗi Username và Password. Nếu tồn tại trong bảng User thì check = true, còn ngược lại thì check = false. Tuy nhiên Hacker có thể nhập vào giá trị là:

Khi đó đoạn mã sẽ thực hiện câu truy vấn:

Vì điều kiện trong câu truy vấn luôn đúng (‘’ luôn bằng ‘’), nên giá trị tên người sử dụng ở dòng đầu tiên trong bảng sẽ được chọn và Hacker có thể sử dụng được ứng dụng web với quyền hạn của tài khoản này.

Một số câu truy vấn có thể bị Hacker lợi dụng để tấn công SQL Injection:  Tấn công dựa vào câu lệnh “Select”

Đây là kỹ thuật Hacker sử dụng để lấy thông tin về các bảng và những trường trong bảng của cơ sở dữ liệu. Để làm được việc này, Hacker dựa vào các thông báo lỗi của hệ quản trị cơ sở dữ liệu sau đó chỉnh sửa nội dung nhập cho phù hợp. Những đối số mà Hacker tiêm vào câu truy vấn có thể đứng độc lập (direct injection) hoặc nằm giữa hai dấu nháy đơn, nháy kép (quote injection).

Ví dụ:

 Tấn công dựa vào câu lệnh “Union”

Hacker có thể thay đổi điều kiện sau “where” bằng Union Select để trả về nhiều dòng thông tin trong bảng.

Câu lệnh trên trả về một tập kết quả là sự kết hợp giữa tkUsername và tkPassword trong bảng User. Ngoài ra dựa vào thông báo lỗi cú pháp sau khi chèn thêm câu lệnh Union, Hacker có thể biết được kiểu của mỗi trường.

Ví dụ: Để biết tên bảng, tên trường, Hacker nhập vào form đăng nhập trên trang web như sau:

Phát sinh lỗi

Nhờ vào thông báo lỗi này mà Hacker biết được bảng sử dụng trong câu truy vấn là User và trong bảng tồn tại một trường tên là tkUsername. Sau đó có thể sử dụng cú pháp Group by

Lỗi phát sinh

Như vậy tkPassword là một trường trong bảng User và được sử dụng trong câu truy vấn. Tiếp tục sử dụng GROUP BY cho đến khi biết được tất cả các trường trong bảng User tham gia vào câu truy vấn.

Khi không còn thông báo lỗi cú pháp GROUP BY nữa thì chuyển qua công đoạn kiểm tra kiểu của từng trường trong bảng sử dụng “UNION”

Lệnh “sum” là lệnh tính tổng cho đối số bên trong dấu ngoặc. Đối số phải là kiểu số. Nếu đối số không phải là kiểu số thì phát sinh lỗi như sau:

Như vậy Hacker có thể khẳng định trường tkUsername chắc chắn phải là kiểu “varchar”. Với phương pháp này, Hacker sẽ có được kiểu dữ liệu của tất cả các trường trong bảng User. Sau khi có đầy đủ thông tin, Hacker sẽ dễ dàng thêm thông tin vào trong bảng User và có thể trở thành quản trị viên mà không cần mật khẩu để chứng thực.

 Tấn công dựa vào câu lệnh “Insert”

Từ khoá “Insert” dùng để đưa thêm thông tin vào cơ sở dữ liệu. Thông thường câu lệnh INSERT được dùng trong các trường hợp như: thêm thông tin đăng ký người sử dụng, guestbook, … (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ:

Hacker có thể dùng cú pháp lệnh INSERT để thêm thông tin vào cơ sở dữ liệu (như một tài khoản của Hacker) để tấn công hệ thống.

 Tấn công dựa vào Stored Procedure

Stored Procedure được sử dụng trong lập trình web với mục đích giảm sự phức tạp trong ứng dụng và tránh các kiểu tấn công SQL Injection vừa nghiên cứu. Tuy nhiên Hacker vẫn có thể lợi dụng những Stored Procedure để tấn công vào hệ thống.

Ví dụ Stored procedure sp_login gồm hai tham số là username và password. Nếu nhập:

Lệnh gọi Stored procedure như sau:

Lệnh “Shutdown” thực hiện dùng SQL Server ngay lập tức.

Hình thức tấn công SQL Injection là một hình thức tấn công hết sức nguy hiểm bởi bằng cách này, Hacker có thể can thiệp sâu vào cơ sở dữ liệu của ứng dụng, từ đó có thể kiểm soát hệ thống hoặc thậm chí là xoá sạch cơ sở dữ liệu của ứng dụng.

Để phòng chống có hiệu quả hình thức tấn công này cần áp dụng đồng bộ một số giải pháp sau:

- Trong hầu hết các trình duyệt, những ký tự nên được mã hoá trên địa chỉ URL trước khi được sử dụng ;

- Việc tấn công SQL Injection dựa vào những câu thông báo lỗi, do đó biện pháp phòng chống hay nhất là không cho hiển thị những thông điệp lỗi cho người dùng (cấu hình trên hệ quản trị cơ sở dữ liệu) bằng cách thay thế những lỗi thông báo

- Kiểm tra kỹ giá trị nhập vào của người dùng, thay thế những ký tự: ‘, --,..

- Loại bỏ các ký tự meta như: ‘, ”, /, \, ; và các ký tự extend như: Null, CR, LF, … trong các chuỗi nhận được từ: người dùng nhập, tham số URL, giá trị từ cookie;

- Đối với giá trị numeric hãy chuyển sang integer trước khi thực hiện câu truy vấn SQL, hoặc dùng hàm ISNUMERIC để chắc chắn nó là một số Integer;

- Dùng thuật toán để mã hoá dữ liệu.

d. Chiếm hữu phiên làm việc (Session Hijacking)

Như đã đề cập trong phần trước của giáo trình này, Session dùng để lưu trữ trạng

Một phần của tài liệu Mật mã và An toàn thông tin trên mạng máy tính (Trang 126)