Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để xử lý vệ sinh thoát khỏi các dấu ngoặc kép có thể bị đánh bại bởi SQL injection trong SQL Server?

Có một số trường hợp mà chức năng thoát này sẽ bị lỗi. Rõ ràng nhất là khi một trích dẫn duy nhất không được sử dụng:

string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index

Trong trường hợp này, bạn có thể "đột phá" bằng cách sử dụng dấu ngoặc kép, dấu tích ngược. Trong trường hợp cuối cùng, không có gì để "thoát ra", vì vậy bạn chỉ có thể viết 1 union select password from users-- hoặc bất kỳ tải trọng sql nào mà kẻ tấn công mong muốn.

Điều kiện tiếp theo mà hàm thoát này sẽ không thành công là nếu một chuỗi con được sử dụng sau khi chuỗi được thoát (và Tôi đã tìm thấy các lỗ hổng như thế này trong tự nhiên):

string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";

Trong trường hợp này, tên người dùng của abcdefgji' sẽ được chuyển thành abcdefgji'' bằng hàm thoát và sau đó quay lại thành abcdefgji' bằng cách lấy chuỗi con. Điều này có thể được khai thác bằng cách đặt giá trị mật khẩu cho bất kỳ câu lệnh sql nào, trong trường hợp này là or 1=1-- sẽ được hiểu là sql và tên người dùng sẽ được hiểu là abcdefgji'' and password= . Truy vấn kết quả như sau:

select * from users where name='abcdefgji'' and password=' or 1=1-- 

T-SQL và các kỹ thuật tiêm sql nâng cao khác đã được đề cập. Advanced SQL Injection In SQL Server Applications là một bài báo tuyệt vời và bạn nên đọc nó nếu bạn chưa đọc.

Vấn đề cuối cùng là các cuộc tấn công unicode. Lớp lỗ hổng này phát sinh do hàm thoát không biết mã hóa nhiều byte và điều này có thể bị kẻ tấn công sử dụng để "tiêu thụ" ký tự thoát. Việc thêm "N" vào chuỗi sẽ không hữu ích, vì điều này không ảnh hưởng đến giá trị của các ký tự nhiều byte sau này trong chuỗi. Tuy nhiên, kiểu tấn công này rất không phổ biến vì cơ sở dữ liệu phải được định cấu hình để chấp nhận chuỗi unicode GBK (và tôi không chắc rằng MS-SQL có thể thực hiện điều này).

Vẫn có thể tiêm mã Second-Order, kiểu tấn công này được tạo ra bằng cách tin tưởng vào các nguồn dữ liệu do kẻ tấn công kiểm soát. Thoát được sử dụng để biểu thị các ký tự điều khiển dưới dạng ký tự của chúng. Nếu nhà phát triển quên thoát giá trị thu được từ select và sau đó sử dụng giá trị này trong một truy vấn khác rồi đến bam kẻ tấn công sẽ có một câu trích dẫn đơn theo nghĩa đen của ký tự theo ý của họ.

Kiểm tra mọi thứ, không tin tưởng gì.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận ngày trong tuần trong SQL Server 2005/2008

  2. Sử dụng TYPEPROPERTY () để trả về thông tin về kiểu dữ liệu trong SQL Server

  3. nhận dạng từ chèn sql qua jdbctemplate

  4. Xem lại Cài đặt phiên của bạn với SESSIONPROPERTY () trong SQL Server

  5. Tạo công việc đại lý máy chủ SQL bằng T-SQL