Thursday, March 9, 2017

Lỗ hổng ứng dụng web phổ biến nhất SQL Injection

Bài viết này mình sẽ tổng hợp 1 cách khái quát về lỗ hổng bảo mật ứng dụng web dựa trên những kiến thức mình đã biết sưu tầm ở các diễn đàn khác để trình bày 1 cách đơn giản nhất. 

1. Khái niệm
SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update, v.v. trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy, lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase...

2. Các dạng tấn công SQL Injection
a. Dạng tấn công vượt qua kiểm tra lúc đăng nhập
Với dạng tấn công này, tin tặc có thể dễ dàng vượt qua các trang đăng nhập nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web. Thông thường để cho phép người dùng truy cập vào các trang web được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng nhập thông tin về tên đăng nhập và mật khẩu. Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp.
Ví dụ: Xét đoạn mã truy vấn SQL sau:
SELECT * FROM Users WHERE Username=’$username’ AND Password=’$password’
Đây là một câu truy vấn thường hay được dùng trong các trình ứng dụng nhằm xác thực người dùng. Nếu câu truy vấn trả về một giá trị nói rằng thông tin về người dùng đang đăng nhập là đúng và được lưu trong cơ sở dữ liệu, thì người dùng được phép đăng nhập vào hệ thống, ngược lại thì không đăng nhập được. Người dùng nhập thông tin đó vào các trường gọi là web form.

Thay vì nhập đúng tên đăng nhập và mật khẩu, thử nhập vào các ký tự đặc biệt như:
$username = 1′ or ‘1’ = ‘1
$password = 1′ or ‘1’ = ‘1
Khi đó câu truy vấn sẽ là:
SELECT * FROM Users WHERE Username=’1′ OR ‘1’ = ‘1’ AND Password=’1′ OR ‘1’ = ‘1’
Trong trường hợp này việc xác thực là thành công do mệnh đề WHERE luôn đúng.
b. Dạng tấn công sử dụng câu lệnh SELECT
Dạng tấn công này phức tạp hơn. Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng hiểu và lợi dụng các sơ hở trong các thông báo lỗi từ hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấn công. Ví dụ, trong các trang tìm kiems, các trang có hộp thoại textbox. Các trang này cho phép người dùng nhập vào các thông tin tìm kiếm như Họ, Tên ... Đoạn mã thường gặp để tìm kiếm. Tương tự như trên, tin tặc có thể lợi dụng sơ hở trong câu truy vấn SQL để nhập vào trường tên tác giả bằng chuỗi giá trị. Lúc này, ngoài câu truy vấn đầu không thành công, chương trình sẽ thực hiện thêm lệnh tiếp theo sau từ khóa union nữa. Câu truy ván này sẽ thực hiện việc mà hacker mong muốn trong câu lệnh của họ.
c. Dạng tấn công sử dụng câu lệnh Insert
Thông thường các ứng dụng web cho phép người dùng đăng kí một tài khoản để tham gia. Chức năng không thể thiếu là sau khi đăng kí thành công, người dùng có thể xem và hiệu chỉnh thông tin của mình. SQL injection có thể được dùng khi hệ thống không kiểm tra tính hợp lệ của thông tin nhập vào.
d. Dạng tấn công sử dụng Stored-Procedures
Việc tấn công bằng stored-procedures sẽ gây tác hại rất lớn nếu ứng dụng được thực thi với quyền quản trị hệ thống ‘sa’. Ví dụ, nếu ta thay đoạn mã tiêm vào dạng: ‘ ; EXEC xp_cmdshell ‘cmdd.exe dir C: ‘. Lúc này hệ thống sẽ thực hiện liệt kê thư mục trên ổ đĩa C:\ cài đặt server. Việc phá hoại kiểu nào tùy thuộc vào caau lệnh đằng sau cmd.exe.fg

3. Cách thức và phương pháp tấn công
a. Các con đường khai thác
+ Qua user Input: User input điển hình thường đến từ các form nhập liệu, form search hay link... Những dữ liệu này được web browser gửi đến server thông qua phương thức HTTP GET hay POST và trở thành các tham số cho ứng dụng web truy cập tới cơ sở dữ liệu.
+ Qua cookies: Cookies là những tập tin lưu trữ thông tin trạng thái của người dùng khi truy cập các ứng dụng web. Những thông tin này do người lập trình quyết định, được tao ra ở server và lưu trữ tại client. Khi người dùng truy cập lại ứng dụng web, cookies được browser gửi lên server giúp phục hồi lại những trạng thái của người dùng trong những lần truy cập trước đó. Do được lưu trữ ở client nên người dùng có thể chỉnh sửa tùy ý, vì vậy nếu ứng dụng web sử dụng những thông tin lưu trong cookies để xây dựng các truy vấn tới cơ sở dữ liệu thì hacker hoàn toàn có thể chèn vào cookies những script sql để thực hiện một cuộc tấn công SQL Injection.
+ Qua các biến server: Biến server có thể là một khái niệm tương đối lạ lẫm nhưng nó không hề mới. Một số ví dụ của biến server là http header, network header... Không phổ biến lắm nhưng các giá trị được lưu trong biến server có thể được ứng dụng web sử dụng như trong việc logging truy cập hay thống kê truy cập theo user agent ... Những công việc này đều có sự tương tác với cơ sở dữ liệu nên các hacker hoàn toàn có thể sử dụng các biến server trong việc khai thác SQL Injection.
b. Kỹ thuật khai thác
+ Boolean Based và Time Based Blind SQL Injection
- Boolean based: Cơ sở của kỹ thuật này là việc so sánh đúng sai để tìm ra từng ký tự của những thông tin như tên bảng, tên cột ... Do đó, với dải giá trị chữ số, chữ cái (bao gồm cả hoa, thường) và một số ký tự đặc biệt, việc so khớp trở nên rất khó khăn và đòi hỏi nhiều thời gian. Do đó việc khai thác lỗi chủ yếu được tiến hành bằng tools.
- Trong kỹ thuật Blind SQL Injection chúng ta cũng có nhiều phương pháp khác nhau.
Điểm khác biệt giữa hai phương pháp này là sự tối ưu thời gian.
+ Union Query Based
Đây là phương pháp phổ biến khi khai thác SQL Injection. Cơ sở của nó là sử dụng từ khóa UNION để gộp các kết quả của các mệnh đề select, qua đó lấy được thông tin từ cơ sở dữ liệu, cụ thể nó dùng để ghép nối các kết quả của hai hay nhiều câu lệnh select lại với nhau thành một tập kết quả duy nhất.
+ Batched Query
Đây là phương pháp áp dụng khả năng thực thi cùng lúc nhiều câu lệnh SQL của môt số hệ quản trị cơ sở dữ liệu và khả năng hỗ trợ của ngôn ngữ lập trình. Phương pháp này rất mạnh mẽ và gây nguy hiểm ngay với hệ thống. Bằng cách thêm vào một dòng lệnh Update, Insert hay Delete, dữ liệu trong cơ sở dữ liệu của ứng dụng web không còn toàn vẹn nữa.
+ Order by clause:
Không giống như các phương pháp trên, nội dung inject nằm trong mệnh đề điều kiện where. Trong phương pháp này, chúng ta sẽ cố gắng tiêm mã script vào mệnh đề order.
c. Các công cụ khai thác
Có nhiều công cụ hỗ trợ khai thác lỗ hổng ứng dụng web SQL Injection phổ biến như: sqlmap, havij, hay hackbar trên firefox, với một vài câu lệnh đơn giản các bạn có thể sẽ lấy được tài khoản, mật khẩu của người dùng trong database đó.

4. Cách phòng chống và bảo mật
SQL Injection  là lỗ hổng ứng dụng web nguy hiểm trong top 10 OWASP, sẽ là rất nguy hiểm nếu những dữ liệu nhạy cảm của những cơ quan, tổ chức bị lộ gây ảnh hưởng đến uy tín hay thiệt hại về vật chất. Sau đây là những các để hạn chế lỗ hổng SQL Injection: 
a. Sử dụng ràng buộc hay giới hạn tham số truy vấn, kiểu tham số, thủ tục khi lưu trữ tham số

b. Set quyền cho các kết nối: Quyền tối thiểu cần thiết, quyền càng hạn chế thiệt hại càng ít.
Mình sẽ trình bày chi tiết về cách phòng chống SQL Injection trong bài tiếp theo.

No comments:

Post a Comment