Tấn công SQL Injection
SQL Injection là những thiếu sót trong quá trình xây dựng ứng dụng phần mềm (cả ứng dụng web và ứng dụng chạy trực tiếp trên hệ điều hành - hay được gọi là "ứng dụng win"), hacker sử dụng lỗi này để thực hiện các câu truy vấn SQL bất hợp pháp nhằm tấn công vào hệ thống ứng dụng phần mềm của chúng ta.
Sẽ hơi mơ hồ, khó hiểu nếu như không đi từ lý thuyết. Vì vậy chúng ta sẽ đi từ lý thuyết kèm theo ví dụ minh hoạ. Để hiểu về kỹ thuật SQL Injection này đòi hỏi bạn phải biết thao tác với SQL, ít nhất là với 1 loại DB nào đó. Tester biết SQL là một lợi thế vì bạn có thể test về khía cạnh security testing này.
SQL Injection:
Như đã nói ở trên, đến đây yêu cầu bạn phải hiểu SQL là gì, thì bạn mới có thể đi tiếp được. Nếu chưa biết về SQL bạn có thể tự học SQL thông qua nhiều trang online và tài liệu trên mạng hoặc tham khảo khoá học SQL dành cho tester ở đây (khoá học SQL cơ bản dành cho Testers được thiết kế gói gọn trong 6 tiếng thực hành trên máy. Vui lòng tham khảo thông tin chi tiết Nội dung khoá học SQL for Testers ở đây).
Bạn đã từng học môn Hệ Quản Trị Cơ Sở Dữ Liệu (DBMS) và một số DBMS như SQL Server, Oracle, DB2, mongoDB, v.v. Nên bạn đã biết được cú pháp, thao tác select, from, having, group by, where, inner join, v.v. và thao tác các bảng dữ liệu với nhau.
SQL Injection là kỹ thuật cho phép hacker lợi dụng các sơ hở trong việc kiểm tra dữ liệu đầu vào và khi thực thi các câu lệnh truy vấn và các thao tác khác trong DBMS. Để hiểu rõ cách mà lỗi SQL Injection có thể xảy ra, chúng ta đi qua một số ví dụ sau đây.
Đây là một số lỗi SQL Injection cơ bản thường gặp
1. Không kiểm tra kí tự thoát truy vấn:
SQL Injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu truy vấn SQL. Kết quả là người dùng cuối có thể thực hiện 1 số truy vấn không mong muốn với CSDL:
Code: Select all
statement = "SELECT * FROM users
WHERE name = '" + userName+ "' ;"
Code: Select all
"SELECT * FROM users
WHERE name = 'a' OR 't' = 't';"
Ở ví dụ trên cho thấy các giá trị của biến userName sẽ gây ra việc xóa thông tin người dùng từ bảng users cũng tương tự từ việc xóa tất cả dữ liệu từ bảng dữ liệu ( bản chất là tiết lộ thông tin người dùng) . Minh hoạ cụ thể bằng câu truy vấn dưới đây để hiểu rõ được bản chất hơn:
Code: Select all
"DROP TABLE users;
SELECT * FROM data
WHERE 't' = 't'
Code: Select all
DROP TABLE users
SELECT * FROM data
WHERE 't' = 't';
Điều thứ 2 liên quan tới SQL injection đó là Xử lý không đúng kiểu.
Do DEV định nghĩa dữ liệu đầu vào không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào (ví dụ kiểm tra dữ liệu nhập vào từ user là kiểu số hay chuỗi
Code: Select all
state = "SELECT * FROM data WHERE id = "+ a_variable +" ;"
Điều thứ 3 xảy ra là lỗi bảo mật bên trong máy chủ CSDL
Đôi khi lỗ hổng bảo mật nằm ngay chính máy chủ CSDL, VD hàm mysql_real_escape_string() hacker có thể thực hiện tấn công SQL injection thành công dựa trên những ký tự unicode không thông thường, lấy 1 số VD minh hoạ:
Code: Select all
$user ="<div> user </div>
$password = "<div> password</div>
$query = sprintf( "SELECT * FROM users
WHERE username ='%s' AND password = '%s'")
mysql_real_escape_string($username)
mysql_real_escape_string($password)
echo $query;
Code: Select all
SELECT * FROM users WHERE user = ' ' AND password = ' '
Code: Select all
<?php
$query = "SELECT * FROM users
WHERE username = '{$_POST['username']}' AND password = '{$_POST['password']}'";
mysql_query($query);
$_POST['username'] = ' your's name';
$_POST['password'] = " OR "=";
echo $query;
?>
Code: Select all
SELECT * FROM users WHERE username = 'yours name' AND password = " OR "="
Lỗi SQL injection dạng Blind SQL injection xảy ra ngay trong ứng dụng web, hậu quả của chúng không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai khác khi hiển thị nội dung của 1 trang chứa lỗi bảo mật này. Hậu quả của sự tấn công SQL injection dạng Blind SQL injection này khiến cho dev phải mất nhiều thời gian để phục hồi chính xác từng bit dữ liệu. Những kẻ tấn công còn sử dụng 1 số tool tìm dò lỗi và tấn công với những thông tin đã thiết lập sẵn.
Còn rất nhiều các dạng tấn công khác xảy ra khi mà hacker sử dụng kỹ thuật SQL injection và lỗi sơ hở trong các câu truy vấn để đột nhập lấy cắp dữ liệu.
Cập nhật thêm các dạng tấn công thường gặp với ứng dụng web
1. 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ụ, trong trường hợp sử dụng ASP, người ta có thể dùng 2 trang: 1 trang HTML để hiển thị Form nhập liệu và 1 trang ASP để xử lý thông tin nhập vào từ phía người dùng như sau:
- Trang nhập liệu: login.htm
Code: Select all
<form action="ExecLogin.asp" method="post">
Username: <input type="text" name="fUSRNAME"><br />
Password: <input type="password" name="fPASSWORD"><br />
<input type="submit">
</form>
- Trang xử lý nhập liệu: execlogin.asp
<%
Dim vUsrName, vPassword, objRS, strSQL
vUsrName = Request.Form("fUSRNAME")
vPassword = Request.Form("fPASSWORD")
strSQL = "SELECT * FROM T_USERS " & _
"WHERE USR_NAME=' " & vUsrName & _
" ' and USR_PASSWORD=' " & vPassword & " ' "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
If (objRS.EOF) Then
Response.Write "Invalid login."
Else
Response.Write "You are logged in as " & objRS("USR_NAME")
End If
Set objRS = Nothing %>
Code: Select all
SELECT * FROM T_USERS WHERE USR_NAME =''OR''='' AND USR_PASSWORD= ''OR''=''
2. 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 kiếm. 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 là:
Code: Select all
<%
Dim vAuthorName, objRS, strSQL
vAuthorName = Request("fAUTHOR_NAME")
strSQL = "SELECT * FROM T_AUTHORS WHERE AUTHOR_NAME =' " & _ vAuthorName & " ' "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
…
[b][/b] Set objRS = Nothing %>
Code: Select all
' UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '=' (*)
Code: Select all
' DROP TABLE T_AUTHORS --
3. Dạng tấn công sử dụng câu lệnh INSERT
Ví dụ điển hình nhất ở thao tác đăng ký thông tin người dùng, sau khi đăng ký thành công, người dùng có thể xem thông tin của mình. Ngay lúc này 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. Ví dụ, một câu lệnh INSERT có thể có cú pháp dạng:
Code: Select all
INSERT INTO TableName VALUES('Value One', 'Value Two', 'Value Three')
Code: Select all
<%
strSQL = "INSERT INTO TableName VALUES(' " & strValueOne & " ', ' " _ & strValueTwo & " ', ' " & strValueThree & " ') "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
…
Set objRS = Nothing %>
Code: Select all
' + (SELECT TOP 1 FieldName FROM TableName) + '
Code: Select all
INSERT INTO TableName VALUES(' ' + (SELECT TOP 1 FieldName FROM TableName) + ' ', 'abc', 'def')
Code: Select all
SELECT TOP 1 FieldName FROM TableName
Sưu tầm và biên soạn bởi Thuý Phạm, biên tập và chỉnh sửa bởi tvn.
Nguồn: http://thuypham910.blogspot.com/2014/11 ... ester.html