SDriver được triển khải trên nền tảng ngôn ngữ Java, tuy vậy SDriver có thể triển khai trên các môi trường khác. Hình 2.5 dưới đây mô tả kiến trúc thực tế của SDriver khi triển khai [1, pp.8].
Hình 2. 5 Kiến trúc thực tế của SDriver.
Trong môi trường mô phỏng, trình điều khiển kết nối được sử dụng là JDBC. CSDL của ứng dụng web là MySQL. CSDL, ssql, lưu trữ khuôn mẫu hợp lệ của SDriver là MySQL. Ứng dụng web được sử dụng để mô phỏng được triển khai trên nền tảng JSP, Servlet.
SDriver không phụ thuộc vào ứng dụng web hay trình điều khiển kết nối (Connectivity Driver) mà sẽ được chèn vào chúng. Để làm được điều này, mã nguồn của ứng dụng cần phải được thay đổi ở phần kết nối tới trình điều khiển. Thay vì kết nối tới trình điều khiển kết nối, ứng dụng web sẽ kết nối tới SDriver và bản thân SDriver cần phải thiết lập kết nối tới trình điều khiển kết nối ở phía sau, trong mô phỏng là JDBC. Trong môi trường mô phỏng, ứng dụng web sẽ kết nối tới JDBC nên đoạn mã kết nối tới JDBC sẽ là:
Class.forName("com.mysql.jdbc.Driver");
String ConnectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;
Để ứng dụng web kết nối tới SDriver thì đoạn mã trên sẽ trở thành: Class.forName("org.SDriver");
String ConnectionURL =
"jdbc:SDriver:org.gjt.mm.mysql.Driver:mysql://" + hostName +
":3306/" + dbName;
CSDL ssql được thiết kế có một bảng duy nhất là bảng signatures. Bảng signatures cũng chỉ có một trường duy nhất là trường “ID” có kiểu chuỗi. Các
khuôn mẫu hợp lệ được lưu trữ vào ssql sẽ dưới dạng giá trị hàm băm MD5. Hai lý do chính cho việc sử dụng hàm băm cho khuôn mẫu hợp lệ là:
Thông tin stack strace của câu truy vấn có thể rất dài, việc sử dụng hàm băm sẽ rút gọn được thông tin lưu trữ nhưng vẫn đảm bảo được tính duy nhất.
Tốc độ SDriver truy vấn vào ssql để tìm kiếm khuôn mẫu hợp lệ sẽ được cải thiện đáng kể so với việc lưu trữ thông tin stack trace và câu truy vấn rút bỏ dữ liệu nguyên bản.
Như đã trình bày ở phần trên, SDriver có hai chế độ hoạt động là chế độ huấn luyện và chế độ thực thi. Để thay đổi chế độ hoạt động của SDriver ta thay đổi giá trị trong file mode.txt. Nếu dòng đầu tiên của file mode.txt là “training mode” thì SDriver sẽ hoạt động trong chế độ huấn luyện. Nếu là “production mode” thì SDriver sẽ hoạt động trong chế độ thực thi. Tùy vào môi trường chạy mà file mode.txt có thể đặt ở các nơi khác nhau, trong môi trường mô phỏng mode.txt có thể được đặt trong thư mục cài đặt eclipse.
2.4.2 Chạy mô phỏng hoạt động của SDriver.
Hình 2.6 dưới đây là giao diện ứng dụng web demo cho mô phỏng.
Hình 2. 6 Giao diện ứng dụng web demo
Ứng dụng web demo sẽ có các chứng năng cơ bản như login, liệt kê danh sách sản phẩm, thêm, sửa, xóa sản phẩm, mã nguồn của trang được lấy từ trang
Trước hết, SDriver cần được trải qua quá trình huấn luyện để xây dựng được CSDL các khuôn mẫu hợp lệ. Trong file mode.txt ta để giá trị dòng đầu tiên là “training mode”. Sau đó, ta lần lượt chạy các câu truy vấn của ứng dụng web bằng cách kích hoạt lần lượt các chức năng của nó.
Hình 2. 7 Một kết quả khi SDriver hoạt động ở chế độ huấn luyện.
Ở hình 2.7 trên là kết quả khi kích hoạt chức năng login của ứng dụng web demo. Câu truy vấn được gửi từ ứng dụng web là
“Select * from USER_ACCOUNT where USER_NAME = 'admin' and PASSWORD= 'admin123'” Sau khi được rút bỏ dữ liệu (stripped query) thì câu truy vấn trở thành
“Select * from USER_ACCOUNT where USER_NAME = and PASSWORD=” Thông tin stack trace của câu truy vấn là:
“org.SStatement.getStackID(SStatement.java:613)org.SStatement.manageQuery(SStateme nt.java:579)org.SStatement.executeQuery(SStatement.java:543)simplewebapp.utils.DBU tils.findUser(DBUtils.java:37)simplewebapp.servlet.DoLoginServlet.doGet(DoLoginSer vlet.java:52)simplewebapp.servlet.DoLoginServlet.doPost(DoLoginServlet.java:104)ja vax.servlet.http.HttpServlet.service(HttpServlet.java:648)javax.servlet.http.HttpS ervlet.service(HttpServlet.java:729)org.apache.catalina.core.ApplicationFilterChai n.internalDoFilter(ApplicationFilterChain.java:292)org.apache.catalina.core.Applic ationFilterChain.doFilter(ApplicationFilterChain.java:207)org.apache.tomcat.websoc ket.server.WsFilter.doFilter(WsFilter.java:52)org.apache.catalina.core.Application FilterChain.internalDoFilter(ApplicationFilterChain.java:240)org.apache.catalina.c ore.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)simplewebapp.f ilter.JDBCFilter.doFilter(JDBCFilter.java:96)org.apache.catalina.core.ApplicationF ilterChain.internalDoFilter(ApplicationFilterChain.java:240)org.apache.catalina.co re.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)org.apache.cata lina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)org.apache.cat alina.core.StandardContextValve.invoke(StandardContextValve.java:106)org.apache.ca talina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)org.apach e.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)org.apache.cat alina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)org.apache.catalina. valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)org.apache.ca talina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)org.apache.cata lina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)org.apache.coyote.http 11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)org.apache.co yote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500 )org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)jav a.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)org.ap ache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.l ang.Thread.run(Thread.java:745)”.
Sau khi kết hợp thông tin stack trace và câu truy vấn rút bỏ dữ liệu, giá trị MD5 của khuôn mẫu hợp lệ sẽ là “f1a948a9376fc0e695d984473bec6c0”.
Giá trị MD5 sẽ được chèn vào ssql, SDrive cũng sẽ đưa ra thong báo “Updating f1a948a9376fc0e695d984473bec6c0”.
Nếu trong trường hợp khâu mẫu hợp lệ đã tồn tại trong ssql thì SDriver sẽ đưa ra thông báo trùng lặp và sẽ không thực hiện thao tác chèn vào ssql.
Hình 2. 8 Thông báo trùng lặp của SDriver.
Khi tất cả câu truy vấn đã được cập nhật khuôn mẫu hợp lệ tương ứng trong ssql, bảng signatures của ssql sẽ như hình 2.9 bên dưới.
Hình 2. 9 Bảng signatures của ssql
Sau khi xây dựng được khuôn mẫu hợp lệ cho tất cả câu truy vấn, ta chuyển SDriver sang chế độ thực thi, chuyển dòng đầu tiên của file mode.txt sang “production mode”. Trong chế độ thực thi, SDriver sẽ hoạt động như một bộ lọc nhằm phát hiện và ngăn chặn tấn công tiêm nhiễm SQL. Khi nhận một câu truy vấn từ ứng dụng web, SDriver sẽ tìm kiếm khuôn mẫu hợp lệ tương ứng với câu truy vấn trong ssql. Câu truy vấn được xác định là hợp lệ khi tồn tại khuôn mẫu hợp lệ tương ứng với nó, khi đó SDriver sẽ đưa ra thông báo “NO NEED TO WORRY”, và nó sẽ chuyển câu truy vấn sang trình điều khiển kết nối để thực thi. Trong trường hợp không có khuôn mẫu hợp lệ tương ứng nào, câu truy vấn sẽ được coi là tấn công tiêm nhiễm SQL và bị từ chối thực thi. Đồng thời, SDriver sẽ đưa ra thông báo “ATTACKING!!! This 219e776510cf52ef4f1d68252298a262 does
not exists!!! NO RESULTS...YOU ARE ATTACKING!”. Dưới đây là một số ví dụ các kỹ thuật tấn công, SDriver sẽ phát hiện và ngăn chặn chúng.
Kỹ thuật tautologies: Chuỗi độc hại “admin' OR 1=1 --” sẽ được chèn vào trường User name trong form Login, trường Password nhập tùy ý. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = 'admin' OR 1=1 --' and PASSWORD= 'gvbcx'
SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = OR 1= gvbcx'
Stack trace = org.SStatement.getStackID(SStatement.java:613)org.SStatement… SDriver 666: ATTACKING!!! This e3ca49a454c3faadd5818b8aacb85c9 does not exists!!!
SDriver 562: NO RESULTS...YOU ARE ATTACKING!”.
Kỹ thuật chú thích cuối dòng (End-of-line comment): Chuỗi độc hại
“admin'--” sẽ được chèn vào trường User name trong from Login, trường Password nhập tùy ý. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = 'admin'--' and PASSWORD= 'abc'
SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = abc'
Stack trace =
org.SStatement.getStackID(SStatement.java:613)org.SStatement.manageQuer y(SStatement.java
ATTACKING!!! This 43f9a4cd8bb1b43fb71578cd568172 does not exists!!! SDriver 562: NO RESULTS...YOU ARE ATTACKING!”.
Kỹ thuật truy vấn Union: Chuỗi độc hại “' union select * from
USER_ACCOUNT --” sẽ được chèn vào trường User name trong form Login,
trường Password nhập tùy ý. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = '' union select * from USER_ACCOUNT --' and PASSWORD= 'abc'
SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = union select * from USER_ACCOUNT abc'
Stack trace =
org.SStatement.getStackID(SStatement.java:613)org.SStatement.manageQuer y(SStatement.java
SDriver 666: ATTACKING!!! This c4bd54e8854c3cc448dea46be98f9f1 does not exists!!!
SDriver 562: NO RESULTS...YOU ARE ATTACKING!”.
Kỹ thuật truy vấn Piggy-Backed: Chuỗi độc hại “';SHUTDOWN;--” sẽ được chèn vào trường Password, trường User name nhập tùy ý. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = 'admin' and PASSWORD= '';SHUTDOWN;--' SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = and PASSWORD= ;SHUTDOWN;'
Stack trace =
org.SStatement.getStackID(SStatement.java:613)org.SStatement.manageQuer y(SStatement.java
SDriver 666: ATTACKING!!! This 6fb255bd8c48bf49491b35cf4e341fc7 does not exists!!!
SDriver 562: NO RESULTS...YOU ARE ATTACKING!”.
Với các ví dụ về tấn công tiêm nhiễm SQL trên thì SDriver đều hoạt động tốt, nhưng SDriver có thực sự tốt không nếu hoạt động trong môi trường thực tế. Chương 3 sẽ phân tích và đánh giá chi tiết hoạt động của SDriver.
2.5. Tóm tắt.
Nội dung chương hai đã làm rõ được kỹ thuật chống tấn công tiêm nhiễm SQL sử dụng các khuôn mẫu hợp lệ theo bối cảnh về kiến trúc, cách thức hoạt động của SDriver.
SDriver là trình điều khiển được chèn vào giữa ứng dụng web và trình điều khiển kết nối. Bản thân SDriver không phải là một trình điều khiển kết nối mà nó đóng vai trò như một bộ lọc.
SDriver có hai chế độ hoạt động là chế độ huấn luyện và chế độ thực thi. Trong chế độ huấn luyện, SDriver sẽ xây dựng CSDL về các khuôn mẫu hợp lệ. Trong chế độ thực thi, SDriver sẽ đóng vai trò phát hiện và ngăn chặn tấn công tiêm nhiễm SQL.
SDriver sẽ rút bỏ dữ liệu đầu vào của câu truy vấn và thu thập thông tin về stack strace của câu truy vấn. Kết hợp hai đặc trưng trên sẽ thu được khuôn mẫu hợp lệ tương ứng của câu truy vấn.
Stack trace gồm thông tin chi tiết về tất cả phương thức và vị trí gọi (vị trí dòng lệnh), từ phương thức của ứng dụng nơi câu truy vấn được thực thi cho đến phương thức mục tiêu của trình điều khiển kết nối. Mỗi câu truy vấn sẽ có thông tin về stack trace riêng biệt.
Stack trace khiến việc giả mạo câu truy vấn hợp lệ trở nên vô cùng khó khăn.
CHƯƠNG 3 ĐỀ XUẤT CẢI TIẾN CHỐNG TẤN CÔNG TIÊM NHIỄM SQL SỬ DỤNG CÁC KHUÔN MẪU HỢP LỆ THEO BỐI CẢNH 3.1. Phân tích hoạt động của SDriver.
Như nội dung đã được trình bày ở mục 2.2, SDriver có hai chế độ hoạt động là huấn luyện và thực thi. SDriver xây dựng CSDL các khuôn mẫu hợp lệ trong chế độ huấn luyện và sử dụng CSDL đó để phát hiện và ngăn chặn tấn công tiêm nhiễm SQL trong chế độ thực thi. Hai chế độ hoạt động của SDriver đều sử dụng chung hai bước chính là trích xuất đặc trưng của câu truy vấn và so sánh với khuôn mẫu hợp lệ trong CSDL ssql. Cũng giống như các phương pháp chống tấn công tiêm nhiễm SQL sử dụng khuôn mẫu hợp lệ khác, quá trình trích xuất đặc trưng của câu truy vấn của SDriver rất quan trọng. Trong SDriver thì đặc trưng của câu truy vấn gồm có thông tin về stack trace và câu truy vấn rút bỏ dữ liệu. Thông tin của stack trace sẽ được thu thập bằng cách lần ngược lại các phương thức được gọi cho đến vị trí của mã nguồn thực thi câu truy vấn, xem ví dụ về stack trace ở tiểu mục 2.4.2 bên trên. Do vậy thông tin stack trace là không thể giả mạo được. Trong mục 2.3 bên trên cũng đã trình bày về việc kẻ tấn công không thể sử dụng một câu truy vấn hợp lệ này để giả mạo một câu truy vấn hợp lệ khác để đánh lừa SDriver. Kẻ tấn công muốn vượt qua được SDriver thì phải đánh lừa được SDriver trong quá trình rút bỏ dữ liệu của câu truy vấn, SDriver có thể sẽ loại bỏ nhầm chuỗi độc hại trong khi rút bỏ dữ liệu của câu truy vấn. Quá trình rút bỏ dữ liệu của câu truy vấn được xử lý qua các bước sau:
1. Xóa bỏ các ký tự được cho là thông thường: “+”, “-” và “.”. 2. Xóa bỏ các chữ số đằng sau các phép toán “< , = , >”.
3. Xóa bỏ thành phần chú thích “/* */”.
4. Xóa bỏ chuỗi nhập liệu nằm giữa cặp dấu ngoặc đơn “'”.
Hình 3. 2 Các mẫu được loại bỏ khỏi câu truy vấn.
Bước một và ba chủ yếu là loại bỏ các ký tự, chuỗi được cho là “thừa”, không phải là đặc trưng của câu truy vấn. Trong khi bước hai và bốn là loại bỏ các ký tự số, chuỗi nhập liệu của người dùng. Ví dụ:
Đầu vào là câu truy vấn
“SELECT a.OrderID, a.OrderDate, a.CusID, a.Amount FROM tblOrder a WHERE (datediff(curdate(),a.OrderDate)) < 30 AND a.CusID=’abc’ /* day la cau truy van select */”.
Thì câu truy vấn rút bỏ dữ liệu sẽ là
“SELECT aOrderID, aOrderDate, aCusID, aAmount FROM tblOrder a WHERE (datediff(curdate(),aOrderDate)) AND aCusID=”.
Quay lại ví dụ về kỹ thuật tấn công tiêm nhiễm SQL sử dụng chú thích cuối dòng ở mục 2.4 trên, ta có thể thấy dấu chú thích “--” đã được loại bỏ trong câu truy vấn rút bỏ dữ liệu. Thay vì nhập “admin'--”, nhập “admin'--'” vào trường Login, câu truy vấn rút bỏ dữ liệu lúc này sẽ là “Select * from USER_ACCOUNT where USER_NAME = and PASSWORD=” và SDriver đưa ra thông báo “NO NEED TO WORRY”. Tức là SDriver đã không phát hiện ra đây là một tấn công tiêm nhiễm SQL. Nguyên nhân của vấn đề này là tại bước một trong quá trình rút bỏ dữ liệu của câu truy vấn. Bản thân ký tự “-” là một ký tự thông thường, hay là ký tự dấu âm, nhưng nếu hai ký tự “-” đứng ngay cạnh nhau “--” thì nó sẽ trở thành dấu chú thích cuối dòng, toàn bộ chuỗi đứng sau nó cho đến cuối dòng sẽ được đánh dấu là chú thích và sẽ bị hệ quản trị CSDL bỏ qua khi thực thi câu truy vấn.
Một vấn đề nữa nằm ở bước ba khi loại bỏ thành phần chú thích nằm giữa “/*” và “*/”. Bản thân các dấu chú thích này nếu nằm trong cặp ngoặc đơn thì chúng sẽ được giải mã như những ký tự thông thường chứ không phải là dấu chú thích. Vậy nên nếu lồng ghép dấu “/*” và “*/” vào các cặp ngoặc đơn, ví dụ như “’/*’ AND ‘*/’” thì chuỗi “AND” sẽ không được tính như một thành phần chú thích mà là một toán tử của SQL. Do vậy ở bước ba, SDriver có thể sẽ loại bỏ những chuỗi mã độc hại.
Ở bước thứ bốn, SDriver chỉ chú tâm vào việc loại bỏ các chuỗi nằm trong cặp dấu ngoặc đơn mà không quan tâm đến việc có bao nhiêu chuỗi đã bị
loại bỏ. Như trong ví dụ về các kỹ thuật tấn công tiêm nhiễm SQL dưới đây, lẽ ra trong câu truy vấn hợp lệ chỉ có hai cặp ngoặc đơn, tức là có hai chuỗi bị loại bỏ, nhưng SDriver đã loại bỏ tất cả các chuỗi, chỉ cần nó nằm trong 1 cặp ngoặc đơn. Đây cũng là một lỗ hổng của SDriver mà kẻ tấn công có thể lợi dụng.
Sau đây là một số ví dụ về các kỹ thuật tấn công tiêm nhiễm SQL, bằng cách sử dụng các lỗ hổng trên của SDriver để vượt qua SDriver.
Kỹ thuật tautologies: Nhập “admin” vào trường User name trong form Login, trường Password chèn chuỗi độc hại “/*' OR 1=1 OR 'a'='*/”. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = 'admin' and PASSWORD= '/*' OR 1=1 OR 'a'='*/'
SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = and PASSWORD=
Stack trace =
org.SStatement.getStackID(SStatement.java:613)org.SStatement.manageQuery(SStat emen
SDriver 664: NO NEED TO WORRY”.
Hình 3. 3 Ví dụ kỹ thuật tấn công tautologies.
Kẻ tấn công dã giả dạng thành công câu truy vấn hợp lệ và vượt qua được SDriver, với điều kiện luôn đúng “OR 1=1” sẽ luôn có kết quả được trả về khi CSDL thực thi câu truy vấn độc hại trên.
Kỹ thuật chú thích cuối dòng: Chuỗi độc hại “admin'-- ” sẽ được chèn vào trường User name trong from Login, trường Password nhập “and PASSWORD= '”. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT where USER_NAME = 'admin'-- ' and PASSWORD= 'and PASSWORD= ''
SDriver: The stripped query: Select * from USER_ACCOUNT where USER_NAME = and
PASSWORD= Stack trace =
org.SStatement.getStackID(SStatement.java:613)org.SStatement.manageQuery(SStat emen
SDriver 664: NO NEED TO WORRY”.
Hình 3. 4 Ví dụ kỹ thuật tấn công chú thích cuối dòng.
Kẻ tấn công đã vượt qua được SDriver bằng cách giả dạng chính câu truy vấn hợp lệ. Với câu truy vấn đã được thay đổi, toàn bộ chuỗi đằng sau dấu chú thích “--” sẽ bị bỏ qua khi CSDL thực thi câu truy vấn. Từ đó kết quả sẽ luôn trả về bản ghi có USER_NAME là “admin”.
Kỹ thuật truy vấn Union: Chuỗi độc hại “abc/*’ union select * from USER_ACCOUNT union select * from USER_ACCOUNT WHERE
‘a’=’*/” sẽ được chèn vào trường User name trong form Login, trường
Password nhập tùy ý. Kết quả như sau:
“SDriver: This is the query the application sent: Select * from USER_ACCOUNT