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