Tuy nhiên sql server không chú ý cẩn thận tới loại của một biểu thức mà nó nhận được,miễn là nó thực sự là một loại có liên quan.Hành vi này đã cho kẻ tấn công cách xác định một lỗi có thực sự là sql hay không liên quan một cách tốt nhất.Với những giá trị số,cách dễ nhất để xử lí điều này là sử dụng các thao tác số học cơ bản.Để minh họa,hãy nhìn yêu cầu sau đây: http://victimsite/proddetails.asp?ProdID=4 Việc kiểm tra điều này cho SI là rất dễ.Một sự cố gắng bởi tiêm nhiễm 4' như một tham số.Một yêu cầu khác thực hiện với 3+1 như một tham số.Giả thiết tham số này thực sự được chuyển cho một yêu cầu sql,kết quả của 2 sự thử này sẽ là hai câu truy vấn sql sau: (1) SELECT * FROM Products WHERE ProdID = 4' (2) SELECT * FROM Products WHERE ProdID = 3 + 1 Cái đầu tiên sẽ phát sinh một lỗi ,như đây là một cú pháp sql tồi.Cái thứ hai,tuy vậy sẽ thực hiện một cách êm ái,trả lại sản phẩm tương tự như yêu cầu nguyên bản chính xác( với 4 là ProdID ) ,chỉ định rằng tham số này thực sự là chỗ yếu cho SI. Một kĩ thuật SI tương tự có thể dùng thay thế cho tham số với một biểu thức chuỗi cú pháp sql.Chỉ có 2 sự khác nhau ở đây.Trước hết,những tham số string được giữ bên trong những lời trích dẫn,vì vậy sự ngắt ra khỏi các lời trích dẫn là cần thiết.Thứ hai là ,các sql server khác nhau sử dụng cú pháp khác nhau cho chuỗi ghép nối.Một minh họa,Microsoft sql server sử dụng + biểu hiện cho chuỗi ghép nối,trong khi mà Oracle sử dụng || cho công việc tương tự.Khác hơn cái đó,một kĩ thuật tương tự được sử dụng.Minh họa: /victimsite/proddetails.asp?ProdName=Book Việc kiểm tra điều này cho SI kéo theo sự thay thế tham số ProdName,một lần với một chuỗi không hợp lệ như B',một cái khác với cái này sẽ phát sinh một biểu thức chuỗi hợp lệ,như B' +'ook ( hoặc B' || 'ook với Oracle ).Kết quả này với 2 truy vấn sau: (1) SELECT * FROM Products WHERE ProdName = 'Book'' (2) SELECT * FROM Products WHERE ProdID = 'B' + 'ook' Một lần nữa ,câu truy vấn đầu tiên có vẻ sẽ phát sinh một lỗi sql ,trong khi cái thứ hai được chờ đợi trả lại một sản phẩm tương tự như yêu cầu nguyên bản ,với Book là giá trị . Một cách tương tự,vài biểu thức khác có thể sử dụng để thay thế một tham số nguyên bản.Những hàm hệ thống có thể được sử dụng để trả lại hoặc một số hoặc là một chuỗi hoặc một ngày ( ví dụ như trong Oracle,sysdate trả lại một biểu thức ngày,trong khi trong sql server getdate() thực hiện công việc tương tự).Các kĩ thuật khác cũng có thể sử dụng để xác định xem có lỗi sql hay không . Như đã thấy,sự xác định SI có xảy ra không là rất đơn giản thậm chí không có các thông báo lỗi cụ thể,cho phép kẻ tấn công dễ dàng tiếp tục công việc tấn công. Thực hiện sự tiêm nhiễm: Một lần sự tiêm nhiễm đã được xác định bởi kẻ tấn công ,bước tiếp theo sẽ cố gắng khai thác nó.Cho điều này,kẻ tấn công phải có khả năng tạo ra các cú pháp hợp lệ ,xác định database server đặc trưng và xây dựng yêu cầu khai thác. Getting the Syntax Right Đây thông thường là phần khó khăn nhất trong quá trình tiêm nhiễm sql.Nếu các truy vấn đặc trưng là đơn giản ,thì nó đơn giản nữa.Tuy nhiên ,nếu câu truy vấn nguyên bản là phức tạp thì sự bắt đầu đột ngột của nó có thể yêu cầu nhiều sự thử và lỗi.Trong vài trường hợp ,chỉ một ít kĩ thuật cơ bản được yêu cầu thực hiện những sự thử này. Quá trình xác định cú pháp cơ bản diễn ra cho phát biểu chuẩn SELECT WHERE ,với tham số bị tiêm nhiễm là một phần của mềnh đề WHERE.Trong thứ tự tạo ra một cú pháp hợp lệ,kẻ tấn công phải có khả năng nối thêm dữ liệu vào biểu thức chuẩn của WHERE để nó sẽ trả lại dữ liệu khác dữ liệu nó phải trả.Trong các ứng dụng , thêm OR 1=1 thường là một mánh khoé.Tuy nhiên trong nhiều trường hợp điều này sẽ không đủ cho một sự khai thác thành công.Thông thường,dấu ngoặc đơn phải được đóng,vì vậy chúng phù hợp với cái nguyên bản mở.Một vấn đề khác có thể xuất hiện là một câu truy vấn lục lọi sẽ khiến ứng dụng tạo ra một lỗi,cái mà không thể được phân biệt từ một lỗi sql( ví dụ,nếu chỉ một bản ghi là được chờ đợi và OR 1=1 là nguyên nhân khiến cơ sở dữ liệu trả lại 1000 bản ghi,ứng dụng có thể tạo ra một lỗi). Từ đó mỗi mệnh đề WHERE về cơ bản là một tập hợp của những biểu thức ước lượng như TRUE hoặc FALSE,tham gia cùng với OR ,AND và dấu ngoặc đơn,việc học các cú pháp đúng cái mà nhảy ra bên ngoài các dấu ngoặc và kết thúc đúng mức câu truy vấn được làm bởi một sự cố gắng những sự kết hợp khác nhau.Ví dụ,thêm 'and 1=2' đổi hướng toàn bộ mệnh đề tới một mệnh đề sai,trong khi mà sự thêm 'or 1=2' không có ảnh hưởng gì,ngoại trừ mức ưu tiên thực hiện. Với vài sự tiêm nhiễm, việc dễ dàng thay đổi mệnh đề WHERE có thể là đủ.Với các cái khác,như UNION SELECT injection,hoặc là cất giữ các thủ tục tiêm nhiễm,nó là không đủ để thay đổi mệnh đề WHERE.Toàn bộ biểu thức sql phải được kết thúc đúng mức,để việc thêm cú pháp có thể được sử dụng.Cho điều này,một kĩ thuật rất đơn giản có thể được sủ dụng.Sau đó kẻ tấn công thiết lập một sự kết hợp hợp lệ của các mệnh đề and,or,1=2 ,dấu hiệu biểu hiện sql có thể được sử dụng. Sự biểu hiện này,giới thiệu lại bởi 2 nét liên tiếp ( ),chỉ dẫn cho sql server lờ đi phần còn lại của đầu vào trong hàng.Cho ví dụ.chúng ta hãy nhìn vào trong login đơn giản,đặt cả Username và Password trong câu truy vấn như: SELECT Username, UserID, Password FROM Users WHERE Username = 'user' AND Password = 'pass bằng việc gửi victim' như user,mệnh đề WHERE sau được tạo ra: WHERE Username = 'victim' 'AND Password = 'pass' Trong trường hợp này,không chỉ cú pháp phải đúng ,nhưng sự chứng thực được đi vòng qua.Tuy nhiên ,chúng ta hãy nhìn vào sự hơi khác nhau trong biểu thức WHERE: WHERE (Username = 'user' AND Password = 'pass') Chú ý dấu ngoặc đơn xung quanh phát biểu.Với cùng sự tiêm nhiễm (victim' ),câu truy vấn bây giờ sẽ thất bại: WHERE (Username = 'victim' ' AND Password = 'pass') Câu truy vấn có dấu ngoặc đơn lẻ bộ và bởi vậy không thể chạy. Ví dụ này,do đó trình diễn rằng làm sao để bình luận biểu hiện có thể sử dụng để xác định liệu có phải câu hỏi đã đúng mức được kết thúc.Nếu bình luận biểu hiện được thêm và không có lỗi nào xuất hiện thì nó có nghĩa là nó kết thúc đúng mức ngay trước lời dẫn giải.Trường hợp còn lại,thử thêm các sự thử và các lỗi được yêu cầu. Xác định cơ sở dữ liệu: Bước tiếp theo mà kẻ tấn công cần làm để bắt đầu khai thác SI,là xác định loại cơ sở dữ liệu được dùng.Thật may ( ít nhất là cho kẻ tấn công),có nhiều công việc dễ dàng hơn là tìm cú pháp đúng. Một vài mánh khóe cho phép kẻ tấn công xác định loại cơ sở dữ liệu,hoàn toàn dựa vào những sự khác nhau tồn tại giữa sự thực hiện đặc biệt của các bộ máy cơ sở dữ liệu.Ví dụ sau tập trung vào sự khác nhau giữa Oracle và Microsoft sql server.Các kĩ thuật tương tự,tuy nhiên là dễ sử dụng để xác định các bộ máy cơ sở dữ liệu khác. Một mánh khóe rất đơn giản ,mà được đề cập sớm hơn là chuỗi ghép nối khác nhau.Giả thiết rằng cú pháp là đã biết,và kẻ tấn công có khả năng thêm các biểu thức bổ sung vào mệnh đề WHERE ,một chuỗi so sánh đơn giản có thể đang sử dụng sự ghép nối này,ví dụ: AND 'xxx' = 'x' + 'xx' Bằng việc thay thế + với ||,Oracle có thể dễ dàng được phân biệt với MS sql server,hoặc các cơ sơ dữ liệu khác. Kĩ thuật khác sử dụng đặc tính dấu chấm phẩy.Trong sql,một dấu chấm phẩy đước sử dụng để nối vài câu lệnh sql trong cùng hang đó.Trong khi với SI cái này có thể được sử dụng bên trong mã tiêm nhiễm,trình điều khiển Oracle không cho phép sửdụng những dấu chấm phẩy trong kiểu này.Giả thiết rằng lời chú giải đúng mức đang làm việc ( nghĩa là nó không tạo ra lỗi),việc thêm một dấu chấm phẩy trước nó không có ảnh hưởng trên Ms sql server,tuy thế phát sinh lỗi với Oracle.Đồng thời,kiểm tra có phải những lệnh bổ sung là có thể chạy sau khi dấu chấm phẩy được thêm biểu thức COMMIT ( ví dụ,tiêm nhiễm xxx'; COMMIT ).Giả thiết biểu thức có thể tiêm nhiễm ở đây,điều này phải không tạo ra một lỗi. Dần dần,vài biểu thức có thể được thay thế với những hàm hệ thống mà trả lại giá trị đúng.Một khi mỗi cơ sở dữ liệu sử dụng những hàm hơi khác nhau,thật dễ dàng xác định kiểu cơ sở dữ liệu theo cách này ( nhiều như những hàm date nêu trên,getdate() với ms sql server thay vì sysdate với Oracle). Khai thác sự tiêm nhiễm: Với tất cả thông tin thích đáng trong tay ,kể tấn công giờ đây có thể tiến hành chính sự tiêm nhiễm.Trong khi xây dựng mã khai thác,kẻ tấn công không còn cần các thông tin từ thông báo lỗi,và có thể xây dựng các khai thác dựa trên tất cả các hiểu biết kĩ thuật SI. Bài viết này không bàn về các kĩ thuật khai thác bình thường ,trong khi chúng đã được bàn luận một cách chi tiết trong các tài liệu khác.Kĩ thuật khai thác chúng ta sẽ đi sâu hơn trong tài liệu này chỉ là tiêm nhiễm các biểu thức UNION SELECT,điều mà sẽ được mô tả trong phần tiếp. Các tiêm nhiễm UNION SELECT Mặc dù sự lục lọi với các biểu thức SELECT WHERE có thể rất đáng được lưu tâm trong nhiều ứng dụng,kẻ tấn công thường muốn có khả năng thực hiện một sự tiêm nhiễm UNION SELECT. Không giống với các thao tác trong mệnh đề WHERE ,sự thực hiện thành công một lệnh tiêm nhiễm UNION SELECT khiến cho kẻ tấn công có thể truy cập tới tất cả các bảng trong hệ thống, điều mà trong các trường hợp còn lại là không thể được . Vì thực hiện một biểu thức UNION SELECT yêu cầu kiến thức về số trường trong câu truy vấn cũng như loại của mỗi trường,nó thường coi là không thể thực hiện được mà không có các thông báo lỗi chi tiết,đặc biệt khi số các trường trong câu truy vấn cơ bản là lớn.Phần tiếp theo đây sẽ bác bỏ quan điểm này bằng việc trình bày một sự thiết đặt của một kĩ thuật rất đơn giản cho phép dễ dàng tìm ra lỗi. Trước khi tiến hành,rõ ràng kẻ tấn công phải có những cú pháp đúng.Tuy nhiên phần trước đã xác minh rằng điều này là có thể ,và đã giải thích nó chạy thế nào.Chỉ có một chú ý quan trọng lưu tâm về cú pháp là với UNION SELECT ,cú pháp nhận dạng phải ở mức độ quét sạch tất cả các dấu ngoặc của yêu cầu,và cho phép sự tiêm nhiễm tự do với UNION hoặc các lệnh khác.( như lời giải thích trước đây ,điều này có thể được kiểm tra bởi nối thêm lời chú giải tượng trưng cho sự tiêm nhiễm). Khi một cú pháp là đúng ,một biểu thức UNION SELECT có thể được nối thêm vào sau một câu truy vấn cơ bản.Biểu thức UNION SELECT phải có cùng số cột và loại cột với câu truy vấn cơ bản,hoặc là một lỗi sẽ được tạo ra. Đếm các cột: Việc đếm các cột không hoàn toàn có thể xuất hiện với các kĩ thuật 'UNION SELECT' sql injection bình thường.Cách mà điều này được thực hiện,với các