SQL injection – Wikipedia tiếng Việt

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. SQL injection thường được biết đến như là một vật trung gian tấn công 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…

Các dạng lỗi thường gặp[sửa|sửa mã nguồn]

Không kiểm tra ký tự thoát truy vấn[sửa|sửa mã nguồn]

Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra tài liệu nguồn vào trong câu truy vấn SQL. Kết quả là người dùng cuối hoàn toàn có thể triển khai một số ít truy vấn không mong ước so với cơ sở tài liệu của ứng dụng. Dòng mã sau sẽ minh họa lỗi này :

statement

= " SELECT * FROM users WHERE name = ' " + userName + " ' ; "

Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể từ bảng những người dùng. Tuy nhiên, nếu biến “userName” được nhập chính xác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục đích khác hẳn so với mong muốn của tác giả đoạn mã trên. Ví dụ, ta nhập vào giá trị của biến userName như sau:

a' or 't'='t

Khiến câu truy vấn hoàn toàn có thể được hiểu như sau :

SELECT * FROM users WHERE name = ' a ' or ' t '=' t ';

Nếu đoạn mã trên được sử dụng trong một thủ tục xác nhận thì ví dụ trên hoàn toàn có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi ‘ t ‘ = ‘ t ‘ luôn đúng. Trong khi hầu hết những SQL server được cho phép triển khai nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số ít SQL API như mysql_query của php lại không được cho phép điều đó vì nguyên do bảo mật thông tin. Điều này chỉ ngăn cản tin tặc tiến công bằng cách sử dụng những câu lệnh riêng rẽ mà không ngăn cản tin tặc đổi khác những từ trong cú pháp truy vấn. Các giá trị của biến ” userName ” trong câu truy vấn dưới đây sẽ gây ra việc xoá những người dùng từ bảng người dùng cũng tương tự như như việc lựa chọn tổng thể những tài liệu từ bảng tài liệu ( về thực chất là bật mý những thông tin của mọi người dùng ), ví dụ này minh họa bằng một API được cho phép triển khai nhiều truy vấn cùng lúc :

a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't

Điều này đưa tới cú pháp ở đầu cuối của câu truy vấn trên như sau :

SELECT * FROM users WHERE name = ' a ';DROP TABLE users; SELECT * FROM data WHERE ' t ' = ' t ';

Xử lý không đúng kiểu[sửa|sửa mã nguồn]

Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay người dùng định nghĩa đầu vào tài liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu tài liệu nguồn vào. Điều này hoàn toàn có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra tài liệu nguồn vào để xác định kiểu của tài liệu mà người dùng nhập vào có phải là số hay không. Ví dụ như sau :

statement: = "SELECT * FROM data WHERE id = " + a_variable + ";"

Ta hoàn toàn có thể nhận thấy một cách rõ ràng dự tính của tác giả đoạn mã trên là nhập vào một số ít tương ứng với trường id – trường số. Tuy nhiên, người dùng cuối, thay vì nhập vào 1 số ít, họ hoàn toàn có thể nhập vào một chuỗi ký tự, và do vậy hoàn toàn có thể trở thành một câu truy vấn SQL hoàn hảo mới mà bỏ lỡ ký tự thoát. Ví dụ, ta thiết lập giá trị của biến a_variable là :

1;DROP TABLE users

khi đó, nó sẽ thực thi thao tác xóa người dùng có id tương ứng khỏi cơ sở tài liệu, vì câu truy vấn hoàn hảo đã được hiểu là :

SELECT * FROM data WHERE id=1;DROP TABLE users;

Lỗi bảo mật thông tin bên trong sever cơ sở tài liệu[sửa|sửa mã nguồn]

Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, như là trường hợp hàm mysql_real_escape_string() của các máy chủ MySQL. Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc 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 ngay cả khi đầu nhập vào đang được thoát.
Chữ đậm

Blind SQL injection[sửa|sửa mã nguồn]

Lỗi SQL injection dạng này là dạng lỗi sống sót ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tiến công. Nó hoàn toàn có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật thông tin này, hậu quả của sự tiến công SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời hạn để hồi sinh đúng mực từng bit tài liệu. Những kẻ tiến công còn hoàn toàn có thể sử dụng một số ít công cụ để dò tìm lỗi dạng này và tiến công với những thông tin đã được thiết lập sẵn .

Thay đổi giá trị điều kiện kèm theo truy vấn[sửa|sửa mã nguồn]

Dạng lỗi này khiến cho kẻ tiến công hoàn toàn có thể đổi khác giá trị điều kiện kèm theo trong câu truy vấn, làm xô lệch sự hiển thị của một ứng dụng chứa lỗi này .

SELECT booktitle from booklist where bookId = ' OOk14cd ' AND 1=1;

Sẽ hiển thị một trang một cách thông thường, trong khi :

SELECT booktitle from booklist where bookId = ' OOk14cd ' AND 1=2;

sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web có chứa lỗi SQL injection dạng này. Lỗ hổng dạng này còn được cho phép tin tặc không chỉ gây ảnh hưởng tác động tới bảng hay tài liệu hiện tại mà còn tác động ảnh hưởng tới những tài liệu hay bảng khác nhờ vào vào nội dung của tài liệu hay bảng hiện tại .

Điều kiện lỗi[sửa|sửa mã nguồn]

Lỗi SQL injection dạng này dẫn tới việc buộc cơ sở tài liệu chỉ được phép nhìn nhận khi mà giá trị của câu lệnh WHERE là đúng. Ví dụ :

SELECT 1/0 from users where username=' Ralph ';

Phép chia cho 0 chỉ được nhìn nhận là lỗi khi mà người dùng có tên ” Ralph ” sống sót trong cơ sở tài liệu .

Thời gian trễ[sửa|sửa mã nguồn]

Lỗi SQL injection dạng này sống sót khi thời hạn giải quyết và xử lý của một hay nhiều truy vấn SQL nhờ vào vào tài liệu logic được nhập vào hoặc quy trình giải quyết và xử lý truy vấn của SQL engine cần nhiều thời hạn. Tin tặc hoàn toàn có thể sử dụng lỗi SQL injection dạng này để xác lập thời hạn đúng mực mà trang cần tải khi giá trị nhập vào là đúng .

Một số dạng tiến công thường gặp với những ứng dụng web[sửa|sửa mã nguồn]

Có bốn dạng tiến công thường gặp gồm có : vượt qua kiểm tra lúc đăng nhập, sử dụng câu lệnh SELECT, sử dụng câu lệnh INSERT, sử dụng những stored-procedures .

Dạng tiến công vượt qua kiểm tra lúc đăng nhập[sửa|sửa mã nguồn]

Với dạng tiến công này, tin tặc hoàn toàn có thể thuận tiện vượt qua những trang đăng nhập nhờ vào lỗi khi dùng những câu lệnh SQL thao tác trên cơ sở tài liệu của ứng dụng web. Thông thường để cho phép người dùng truy vấn vào những website được bảo mật thông tin, mạng lưới hệ thống thường thiết kế xây dựng trang đăng nhập để nhu yế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, mạng lưới 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 hành động được cho phép hay khước từ triển khai tiếp. Ví dụ, trong trường hợp sử dụng ASP, người ta hoàn toàn có thể dùng 2 trang : 1 trang HTML để hiển thị Form nhập liệu và 1 trang ASP để giải quyết và xử lý thông tin nhập vào từ phía người dùng như sau :

- Trang nhập liệu: login.html

Username

:
Password:

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 " và _
" WHERE USR_NAME = ' " và vUsrName và _
" ' and USR_PASSWORD = ' " và vPassword và " ' "
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 " và objRS(" USR_NAME ")
End If
Set objRS = Nothing % >

Chỗ sơ hở trong đoạn mã xử lý nhập liệu trên nằm ở chỗ dữ liệu nhập vào từ người dùng được dùng để xây dựng trực tiếp câu lệnh SQL. Chính điều này cho phép tin tặc có thể điều khiển câu truy vấn sẽ được thực hiện. Ví dụ, nếu người dùng nhập chuỗi trong ngoặc sau vào trong cả hai ô nhập liệu username/password của trang login.htm là:(‘OR=’). Lúc này, câu truy vấn sẽ được gọi thực hiện là:

SELECT * FROM T_USERS WHERE USR_NAME =' 'OR' '=' ' and USR_PASSWORD= ' 'OR' '=' '

Câu truy vấn này là hợp lệ và sẽ trả về toàn bộ những bản ghi của T_USERS và đoạn mã tiếp theo giải quyết và xử lý người dùng đăng nhập phạm pháp này như là người dùng đăng nhập hợp lệ .

Dạng tiến công sử dụng câu lệnh SELECT[sửa|sửa mã nguồn]

Dạng tiến công này phức tạp hơn. Để triển khai được kiểu tiến công này, kẻ tiến công phải có năng lực hiểu và tận dụng những sơ hở trong những thông tin lỗi từ mạng lưới hệ thống để dò tìm những điểm yếu khởi đầu cho việc tiến công. Ví dụ, trong những trang tìm kiếm. Các trang này được cho phép người dùng nhập vào những thông tin tìm kiếm như Họ, Tên, … Đoạn mã thường gặp là :

    <%
    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=..."
    …
    Set objRS = Nothing %> 

Tương tự như trên, tin tặc hoàn toàn có thể tận 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ị :

' UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '=' (*)

Lúc này, ngoài câu truy vấn đầu không thành công xuất sắc, chương trình sẽ triển khai thêm lệnh tiếp theo sau từ khóa UNION nữa. Giả sử đoạn mã nhập vào là :

' DROP TABLE T_AUTHORS --

Câu truy vấn sẽ thực thi việc xóa bảng .

Dạng tiến công sử dụng câu lệnh INSERT[sửa|sửa mã nguồn]

Thông thường những ứng dụng web được cho phép người dùng ĐK một thông tin tài khoản để tham gia. Chức năng không hề thiếu là sau khi ĐK thành công xuất sắc, người dùng hoàn toàn có thể xem và hiệu chỉnh thông tin của mình. SQL injection hoàn toàn có thể được dùng khi mạng lưới 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 hoàn toàn có thể có cú pháp dạng như thể :

    INSERT INTO TableName VALUES('Value One', 'Value Two', 'Value Three')

Nếu đoạn mã thiết kế xây dựng câu lệnh SQL có dạng :

<%
    strSQL = "INSERT INTO TableName VALUES(' " & strValueOne & " ', ' " _ & strValueTwo & " ', ' " & strValueThree & " ') "
    Set objRS = Server.CreateObject("ADODB.Recordset")
    objRS.Open strSQL, "DSN=..."
    …
    Set objRS = Nothing %> 

Thì chắc chắn sẽ bị lỗi SQLi, bởi vì nếu ta nhập vào trường thứ nhất ví dụ như:

    ' + (SELECT TOP 1 FieldName FROM TableName) + '

Lúc này câu truy vấn sẽ là :

    INSERT INTO TableName VALUES(' ' + (SELECT TOP 1 FieldName FROM TableName) + ' ', 'abc', 'def')

Khi đó, lúc triển khai lệnh xem thông tin, xem như bạn đã nhu yếu thực thi thêm một lệnh nữa đó là :

    SELECT TOP 1 FieldName FROM TableName 

Dạng tiến công sử dụng stored-procedures[sửa|sửa mã nguồn]

Việc tiến công bằng stored-procedures sẽ gây tai hại rất lớn nếu ứng dụng được thực thi với quyền quản trị mạng lưới 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 mạng lưới hệ thống sẽ triển khai lệnh liệt kê thư mục trên ổ đĩa C : \ thiết lập server. Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe .

Tài liệu về SQL injection[sửa|sửa mã nguồn]

Rate this post