Phương pháp tấn công và phòng thủ sql injection và local attack

17 1.2K 2
Phương pháp tấn công và phòng thủ sql injection và local attack

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA TPHCM TRƯỜNG ĐẠI HỌC KINH TẾ LUẬT KHOA TIN HỌC QUẢN LÝ Lớp K09406 Giảng viên hướng dẫn : Ths. Trương Hoài Phan Sinh viên thực hiện : PHƯƠNG PHÁP TẤN CÔNG VÀ PHÒNG THỦ SQL INJECTION VÀ LOCAL ATTACK Mục lục Chương I: Cách tấn công và phòng thủ SQL Injection 1. SQL Injection là gì? SQL injection là một kĩ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng trong việc kiểm tra dữ liệu nhập trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu để "tiêm vào" (inject) và thi hành các câu lệnh SQL bất hợp pháp (không được người phát triển ứng dụng lường trước). Hậu quả của nó rất tai hại vì nó cho phép những kẻ tấn công có thể thực hiện các thao tác xóa, hiệu chỉnh, … Do có toàn quyền trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. Lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lí bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase. 2. Các Dạng Tấn Công SQL Injection Có bốn dạng thông thường bao gồm: vượt qua kiểm tra lúc đăng nhập (authorization bypass), sử dụng câu lện SELECT, sử dụng câu lệnh INSERT, sử dụng các stored-procedures. Để biết website nào dính lỗi SQL Injection ta thêm dấu “ ’ ” vào sau thanh địa chỉ. Ví dụ: http://quatangsv.vn/Chitietsanpham.aspx?masp=HRDN' 1.1. Dạng tấn công vượt qua kiểm tra đăng nhập - Với dạng tấn công này, tin tặc có thể dễ dàng vượt qua các trang đăng nhập nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web. - Xét một ví dụ điển hình, thông thường để cho phép người dùng truy cập vào các trang web được 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 về tên đăng nhập và mật khẩu. Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp. Trong trường hợp này, tràn web thường được thiết kế như sau. Mẫu form yêu cầu người dùng nhập tên đăng nhập và mật khẩu: Code xử lí yêu cầu đăng nhập của người dùng: cnn.Open(); SqlCommand cmdangnhap = new SqlCommand(); cmdangnhap.Connection = cnn; cmdangnhap.CommandText = "Select * from Users where (Tendangnhap = '" + tendn.Value.ToString() + "') and (Matkhau = '" + Password.Value.ToString() + "')"; temp = cmdangnhap.ExecuteReader(); if (temp.Read() == true) { Session["dadangnhap"] = 1; Session["tendn"] = temp[0].ToString(); Session["hoten"] = temp[2].ToString(); Session["landangnhap"] = (int)temp[9] + 1; Session["role"] = temp[10].ToString(); temp.Close(); //Tăng số lần đăng nhập thêm 1; SqlCommand cmlandangnhap = new SqlCommand("solandangnhap"); cmlandangnhap.Connection = cnn; cmlandangnhap.CommandType = CommandType.StoredProcedure; cmlandangnhap.Parameters.Add(new SqlParameter("@tendn", SqlDbType.VarChar)).Value = tendn.Value.ToString(); cmlandangnhap.ExecuteNonQuery(); Response.Redirect("index.aspx"); } else { Response.Write("<Script Language='javascript'>"); Response.Write("alert('Tên đăng nhập hoặc mật khẩu không chính xác!')"); Response.Write("</script>"); } } - Thoạt nhìn, đoạn code xử lí trên có vẻ như không chứa bất cứ một lỗ hổng về an toàn nào. Người dùng không thể đăng nhập mà không có tên đăng nhập và mật khẩu hợp lệ. Tuy nhiên, đoạn mã này thực sự không an toàn và là tiền đề cho một lỗi SQL injection. Đặc biệt, chỗ sơ hở nằm ở chỗ dữ liệu nhập vào từ người dùng được dùng để xây dựng trực tiếp câu lệnh SQL. Chính điều này cho phép những kẻ tấn công có thể điều khiển câu truy vấn sẽ được thực hiện. Ví dụ nếu người dùng nhập vào ô tên đăng nhập và mật khẩu là: ' OR '' = ' . Lúc này, câu truy vấn sẽ được gọi thực hiện là: SELECT * FROM USERS WHERE TENDANGNHAP ='' OR ''='' and MATKHAU = '' OR ''=''  Kết quả là câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của bảng USERS và đoạn mã tiếp theo xử lí người dùng đăng nhập bất hợp pháp này như là người dùng đăng nhập hợp lệ. 1.2. Dạng tấn công sử dụng câu lệnh SELECT - Dạng tấn công này phức tạp hơn. Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng hiểu và lợi dụng các sơ hở trong các thông báo lỗi từ hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấn công. Xét một ví dụ rất thường gặp trong các website về bán sản phẩm. Thông thường, sẽ có một trang nhận ID của sản phẩm cần hiển thị rồi sau đó truy vấn nội dung của chi tiết sản phẩm có ID này. Ví dụ: http://quatangsv.vn/Chitietsanpham.aspx?masp=HRDN . Code xử lí cho chức năng hiển thị thông tin sản phẩm này thường được viết khá đơn giản theo dạng: masp = Request.QueryString.Get("masp"); if (masp != null) { cm.CommandText = "select * from sanpham inner join loaisp on sanpham.maloai = loaisp.maloai where sanpham.masp='" + masp + "'"; cm.Connection = cnn; float lanxem = 0; if (cnn.State.ToString() == "Closed") { cnn.Open(); } dr = cm.ExecuteReader(); dr.Read(); try { gia = float.Parse(dr.GetValue(4).ToString()); luotxem = float.Parse(dr.GetValue(8).ToString()); hinh = dr.GetString(5); tensp = dr.GetString(1); thongtin = dr.GetString(2); keyword = dr.GetString(9); description = dr.GetString(10); tenloai = " | " + dr.GetString(12); lanxem = float.Parse(dr.GetValue(8).ToString()) + 1; cm.CommandText = "update sanpham set solanxem=" + lanxem + " where masp ='" + dr.GetValue(0).ToString() + "'"; dr.Close(); cm.ExecuteNonQuery(); } catch { } } else { Response.Redirect("index.aspx"); } - Trong các tình huống thông thường, đoạn mã này hiển thị nội dung của tin có masp trùng với masp đã chỉ định và hầu như không thấy có lỗi. Tuy nhiên, giống như ví dụ đăng nhập ở trước, đoạn mã này để lộ sơ hở cho một lỗi SQL injection khác. Kẻ tấn công có thể thay thế một masp hợp lệ bằng cách gán masp cho một giá trị khác, và từ đó, khởi đầu cho một cuộc tấn công bất hợp pháp, ví dụ như: HRBD’ ORDER BY 16— Lúc này câu truy vấn sẽ trở thành: “ SELECT * FROM SanPham WHERE Masp = ‘HRBD’ ORDER BY 16—‘ ” Dấu “—“ trong SQL có nghĩa là chú thích giống như “//” trong asp.net. Mục đích là dùng để loại bỏ các lệnh SQL nằm phía sau dấu “ “. - Bằng cách này hacker có thể chèn bất cứ câu lệnh sql nào vào để website thực hiện bằng cách thêm dấu “ ‘ “ và các câu lệnh SQL muốn thực hiện sau địa chỉ url của website. - Ta xét 1 ví dụ sau: để xem thông tin về phiên bản của hệ quản trị CSDL mà website đang dùng ta chèn thêm vào url chuỗi giá trị như sau: -'UNION ALL SELECT '1',@@version,'3','4',5,'6',7,'8','9','10','11','12','13','14','15','16'— Lúc này câu lệnh truy vấn ban đầu không thành công (vì masp lúc này sẽ là “HRBD-“ mã sản phẩm này không tồn tại) chương trình sẽ thực hiện thêm câu lệnh SELECT phía sau từ khóa UNION (từ khóa này dùng để hợp kết quả của 2 câu lệnh SELECT thành 1). Dưới đây là kết quả khi thực hiện yêu cầu tới địa chỉ http://quatangsv.vn/Chitietsanpham.aspx?masp=-HRDN' UNION ALL SELECT '1',@@version,'3','4',5,'6',7,'8','9','10','11','12','13','14','15','16' - Tất nhiên các ví dụ nói trên, dường như không có gì nguy hiểm, nhưng hãy thử tưởng tượng kẻ tấn công có thể xóa toàn bộ cơ sở dữ liệu bằng cách chèn vào các đoạn lệnh nguy hiểm như lệnh DROP TABLE. Ví dụ như: ' DROP TABLE USER – - Chắc các bạn sẽ thắc mắc là làm sao biết được ứng dụng web bị lỗi dạng này được. Rất đơn giản, hãy nhập vào chuỗi (*) như trên, nếu hệ thống báo lỗi về cú pháp dạng: Invalid object name “OtherTable”; Ta có thể biết chắc là hệ thống đã thực hiện câu SELECT sau từ khóa UNION, vì như vậy mới có thể trả về lỗi mà ta đã cố tình tạo ra trong câu lệnh SELECT. - Cũng sẽ có thắc mắc là làm thế nào có thể biết được tên của các bảng dữ liệu mà thực hiện các thao tác phá hoại khi ứng dụng web bị lỗi SQL injection. Cũng rất đơn giản, bởi vì trong SQL Server, có hai đối tượng là sysobjects và syscolumns cho phép liệt kê tất cả các tên bảng và cột có trong hệ thống. Ta chỉ cần chỉnh lại câu lệnh SELECT, ví dụ như: ' UNION SELECT name FROM sysobjects WHERE xtype = 'U' là có thể liệt kê được tên tất cả các bảng dữ liệu. 1.3. Dạng tấn công sử dụng câu lệnh INSERT: - Thông thường các ứng dụng web cho phép người dùng đăng kí một tài khoản để tham gia. Chức năng không thể thiếu là sau khi đăng kí thành công, người dùng có thể xem và hiệu chỉnh thông tin của mình. SQL injection có thể được dùng khi hệ thống không kiểm tra tính hợp lệ của thông tin nhập vào. Xét ví dụ sau: mẫu form dùng để đăng kí tài khoản như sau: Nếu code xử lí lúc đăng kí có dạng: cnn.Open(); cmdangki.CommandText = "insert into Users(HoTen, Tendangnhap, Matkhau, Email, Gioitinh, NgayDangKi, Solandangnhap) values ('" + hoten.Value.ToString() + "', '" + tentruycap.Value.ToString() + "', '" + matkhau.Value.ToString() + "','" + email.Value.ToString() + "',0 ,1/1/2012, 0)"; cmdangki.Connection = cnn; try { cmdangki.ExecuteNonQuery(); Session["dadangnhap"] = 1; Session["tendn"] = tentruycap.Value.ToString(); Session["hoten"] = hoten.Value.ToString(); Response.Write("<Script Language='javascript'>"); Response.Write("alert('Quá trình đăng kí thành công!');"); Response.Write("window.location= 'index.aspx';"); Response.Write("</script>"); } catch { Response.Write("<Script Language='javascript'>"); Response.Write("alert('loi');"); Response.Write("</script>"); } - Thì chắc chắn sẽ bị lỗi SQL injection, bởi vì nếu ta nhập vào trường thứ nhất ví dụ như: ' + (SELECT TOP 1 Tendn FROM Users) + '. Lúc này câu truy vấn sẽ là: INSERT INTO Users VALUES(' ' + (SELECT TOP 1 Tendn FROM Users) + ' ', 'abc', 'def'). Khi đó, lúc thực hiện lệnh xem thông tin, xem như bạn đã yêu cầu thực hiện thêm một lệnh nữa đó là: SELECT TOP 1 Tendn FROM Users. 1.4. Dạng tấn công sử dụng stored-procedures Trong SQL Sever có các databae master và trong các database này có các store procude system được lập trình sẵn để thực hiện các công việc cụ thể nào đó. Nếu như hack chiếm được quyền điều khiển hệ quản trị này và thực hiện truy vấn đến các store này hoặc nguy hiểm hơn là xóa đi database master thì toàn bộ database sẽ bị ảnh hưởng và không hoạt động được. - Việc tấn công bằng stored-procedures sẽ gây tác hại rất lớn nếu ứng dụng được thực thi với quyền quản trị hệ thống 'sa'. - Ví dụ: nếu ta thay đoạn mã tiêm vào dạng: ' ; EXEC xp_cmdshell ‘cmd.exe dir C: '. - Lúc này hệ thống sẽ thực hiện lệnh liệt kê thư mục trên ổ đĩa C:\ cài đặt server. - Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe. Nếu cài SQL Server ở chế độ mặc định thì SQL Server chạy trên nền SYSTEM, tương đương mức truy cập ở Windows. Có thể dùng master xp_cmdshell để thi hành lệnh từ xa:  ; exec master xp_cmdshell 'ping 10.10.1.2'  Thử dùng dấu nháy đôi (") nếu dấu nháy đơn (') không làm việc.  Dưới đây là một số extended stored procedure mà hacker thường hay sử dụng để thực thi những câu lệnh xem nội dung thông tin trong máy nạn nhân:  Xp_availablemedia: Hiển thị những ổ đĩa hiện hành trên máy  Xp_dirtree: Hiển thị tất cả các thư mục kể cả thư mục con  Xp_loginconfig: Lấy thông tin về chế độ bảo mật trên server  Xp_makecab: Cho phép người sử dụng tạo các tập tin lưu trữ trên Server (hay bất cứ tập tin nào mà server có thể truy xuất  Xp_ntsec_enumdomain: liệt kê những domain mà server có thể truy vấn.  Xp_terminate_process: chấm dứt một tiến trình với tham số PID của nó. 3. Cách Phòng Tránh: - Kiểm tra chặt chẽ các kí tự nhập vào trước khi thực hiện các lệnh truy vẫn SQL. Viết các hàm xóa bỏ các kí tự đặc biệt từ chuỗi nhập vào như: ‘, “”, , @@, SELECT, UNION, DROP, INSERT, xp_ [...]... Chương II: Cách tấn công và phòng thủ local attack 1 Cách tấn công local attack 1.1 Khái niệm về local attack - là tấn công từ nội bộ bên trong Server Dùng website bị lỗi bảo mật và dùng các phương pháp tấn công để để tấn công sang các website khác trong cùng một Server 1.2 Các công cụ hỗ trợ local attack 1.2.1 Khái niêm về shell: Shell là chương trình giữa bạn và Linux (hay nói chính xác hơn là giữa bạn... với SQL Sever nên dùng các store procdure để thực hiện truy vấn vì trong SQL Sever có các - hàm tự động lọc các dữ liệu nhập vào Hạn chế sử dụng đến quyền ‘sa’ hay ‘dbo’ trên database Tắt thông báo lỗi từ hệ quản trị CSDL Điều này hạn chế việc tấn công của hacker tuy nhiên website chúng ta vẫn bị lỗi việc này không giúp chúng ta chống lại hoàn toàn sự tấn công Chương II: Cách tấn công và phòng thủ local. .. cat /home/tên user cần local/ public_html/index.php - Ngoài ra còn một số câu lệnh khác liên quan tới truy vấn sql, các câu lệnh được tích hợp sẵn trong webshell ta chỉ cần chọn hoặc bấm vào các button 1.4 Các bước local attack Bước 1: Xác định các website cần tấn công - Khi đã xác đinh được website cần tấn công trước hết ta lân lượt dò tìm lỗi website đó bằng các phương pháp sql injection như đã trình... website có dấu hiệu lỗi ta có thể tấn website một cách trực tiếp mà không cần phải sử dụng đền phương pháp tấn công local attack - Nếu ta không tìm được lỗi trên website đó thì ta bắt đầu bước 2 Bước 2: Xác định các website đặt cùng server với mục tiêu - Ta sử dụng trang web http://domainsbyip.com/ để tra cứu những website nào đặt cùng server với website mà mình muốn tấn công Bước 3: Tìm cách khai thác... upload webshell hoặc thực thi shell code - Ta lần lượt kiểm tra các website cùng với website mà mình muốn tấn công bằng các phương pháp ở chương I Khi đã xác định được một website nào đó có các lỗi ta bắt đầu xâm nhập vào website này và sử dụng quền quản trị upload shell code lên website đó Bước 4: Thành công có webshell, kiểm tra quyền của user hiện tại - Kiểm tra quyền thực thi câu lệnh của shell trên... quyền, tiến hành đọc file config, tìm user/password, deface mục tiêu - Khi đọc được file config.php của website đó ta biết được username và password của database nên ta có thể lấy dữ liệu, xem dữ liệu hoặc thậm chí có thể xóa dữ liệu một cách dễ dàng 2 Cách phòng thủ local attack 2.1 Thường xuyên backup dữ liệu - Thường xuyên backup dữ liệu để giảm thiệt hại khi ta bị xóa mất cơ sở dữ liệu 2.2 Bỏ quyền... này mọi người dùng sẽ không thể nào xóa bỏ cơ sở dữ liệu của bạn - 2.3 Đặt safemode on và disable 1 số hàm nguy hiểm Tạo file php.ini với nội dung sau: safe-mode = on display_errors = Off 2.4 Phân quyền cho các tập tin, thư mục của website một cách hợp lý - Thông thường chúng ta cần thiết lập CHMOD 755 cho các thư mục và CHMOD 644 cho các file - Ý nghĩ của Chmode “Read” (Đọc): viết tắt là “r”, r = 4 “Write”... bạn với nhân Linux) Mỗi lệnh bạn gõ ra sẽ được Shell diễn dịch rồi chuyển tới nhân Linux Nói một cách dễ hiểu Shell là bộ diễn dịch ngôn ngữ lệnh, ngoài ra nó còn tận dụng triệt để các trình tiện ích và chương trình ứng dụng có trên hệ thống 1.2.2 Một số webshell được sử dụng phổ biến - Shell C99: • - R57: • - Tính năng của shell C99: Sử dụng các thao tác có sẵn mà không cần phải sử dụng các câu lệnh... “r”, r = 4 “Write” (Ghi / Chỉnh sửa): viết tắt là “w”, w = 2 “Execute” (Thực thi): viết tắt là “x”, x = 1 Với số 0 thì sẽ không có bất kì quyền hạn nào! 2.5 Thường xuyên dò tìm shellcode trong website và cơ sở dữ liệu - Ta có thể sự nhiều phần mềm kiểm tra shell trên các máy chủ giúp chúng ta có thể loại bỏ các mã độc hại của shell được hacker upload lên website như nikio, scan shell, wenscarab vv -... Khi dùng những phần mềm này quét trên thư mục website của mình thì phần mềm này sẽ cảnh báo cho chúng ta bieeset các file nào có nguy cơ có mã nguy hiểm (bao gồm các shell) Khi đó chúng ta sẽ kiểm tra và tiến hành xóa chúng khi nó gây hại cho website của chúng ta Hết Tài liệu tham khảo - Nguồn thông tin từ các website: http://athena.edu.vn , http://m4v.me/forum/ - Qua các bài giảng của anh Xang

Ngày đăng: 02/11/2014, 15:22

Từ khóa liên quan

Mục lục

  • Chương I: Cách tấn công và phòng thủ SQL Injection

    • 1. SQL Injection là gì?

    • 2. Các Dạng Tấn Công SQL Injection

    • Chương II: Cách tấn công và phòng thủ local attack

      • Tài liệu tham khảo

Tài liệu cùng người dùng

Tài liệu liên quan