|
||||||||
|
||||||||
|
|
Công Cụ | Xếp Bài |
20-01-2010, 09:21 PM | #1 |
Guest
Trả Lời: n/a
|
Chống SQL Injection
Chống SQL Injection Ai cũng bít sử dụng SQL Injection để hack vô datbase rùi thì tha hồ hack shop lấy CC việc cuối cùng chỉ là ship .. Vậy thì chống SQL Injection như thế nào, làm sao đoạn code SQL của mình trở thành an toàn ... BẢO VỆ ỨNG DỤNG WEB CHỐNG TẤN CÔNG KIỂU SQL INJECTION Nguồn gốc : Sưu Tầm 1. SQL Injection là gì? Việc thiết kế và đưa vào hoạt động một website luôn đòi hỏi các nhà phát triển phải quan tâm đến các vấn đề về an toàn, bảo mật nhằm giảm thiểu tối đa khả năng bị tấn công từ các tin tặc. Tuy nhiên, thông thường các nhà phát triển đa số tập trung vào các vấn đề an toàn trong việc chọn hệ điều hành, hệ quản trị CSDL, webserver sẽ chạy ứng dụng, ... Ví dụ, người ta thường quan tâm nhiều đến các lỗ hổng về an toàn trên IIS hơn là quan tâm đến các đoạn mã của ứng dụng có tiềm ẩn các lỗ hổng nghiêm trọng hay không. Một trong số các lỗ hổng này đó là SQL injection attack. SQL injection là một kĩ thuật cho phép những kẻ tấn công thi hành các câu lệnh truy vấn SQL bất hợp pháp (không được người phát triển lường trước) bằng cách 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. 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. 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ị CSDL như SQL Server, Oracle, DB2, Sysbase. 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, người ta có thể dùng 2 trang, một trang HTML để hiển thị form nhập liệu và một trang ASP dùng để xử lí thông tin nhập từ phía người dùng. Ví dụ: Login.htm <form action="ExecLogin.asp" method="post"> Username: <input type="text" name="txtUsername"><br> Password: <input type="password" name="txtPassword"><br> <input type="submit"> </form> ExecLogin.asp <% Dim p_strUsername, p_strPassword, objRS, strSQL p_strUsername = Request.Form("txtUsername") p_strPassword = Request.Form("txtPassword") strSQL = "SELECT * FROM tblUsers " & _ "WHERE Username='" & p_strUsername & _ "' and Password='" & p_strPassword & "'" Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (objRS.EOF) Then Response.Write "Invalid login." Else Response.Write "You are logged in as " & objRS("Username") End If Set objRS = Nothing %> Thoạt nhìn, đoạn mã trong trang ExecLogin.asp dường 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 SQL injection attack. Đặ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 truy vấn 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 chuỗi sau vào trong cả 2 ô nhập liệu username/password của trang Login.htm: ‘ or ‘’ = ‘ . Lúc này, câu truy vấn sẽ được gọi thực hiện là: SELECT * FROM tblUsers WHERE Username='' or ''='' and Password = '' or ''='' 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 tblUsers 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ệ. Một ví dụ khác của SQL injection attack nữa là khi các trang web sử dụng dữ liệu nhập vào theo dạng querystring (bằng cách gõ cặp tham số và giá trị trực tiếp trên thanh địa chỉ hoặc dùng form với thuộc tính ACTION là GET). Ví dụ sau minh họa một trang ASP nhận dữ liệu cho biến ID thông qua querystring và phát sinh nội dung của trang đó dựa trên ID: <% Dim p_lngID, objRS, strSQL p_lngID = Request("ID") strSQL = "SELECT * FROM tblArticles WHERE ID=" & p_lngID Set objRS = Server.CreateObject("ADODB.Recordset") objRS.Open strSQL, "DSN=..." If (Not objRS.EOF) Then Response.Write objRS("ArticleContent") Set objRS = Nothing %> Trong các tình huống thông thường, đoạn mã này hiển thị nội dung của article có ID trùng với ID được chuyển đến cho nó dưới dạng querystring. Ví dụ, trang này có thể được gọi như sau: http://www.example.com/Article.asp?ID=1055, để hiển thị nội dung của article có ID là 1055. Giống như ví dụ đăng nhập ở trước, đoạn mã này để lộ sơ hở cho một SQL injection attack. Kẻ tấn công có thể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, để thực hiện một lệnh SQL bất hợp pháp, ví dụ như: 0 or 1=1 (nghĩa là, http://www.example.com/Article.asp?ID=0 or 1=1). Câu truy vấn SQL lúc này sẽ trả về tất cả các article từ bảng dữ liệu vì nó sẽ thực hiện câu lệnh: SELECT * FROM tblArticles WHERE ID=0 or 1=1 Tất nhiên ví dụ này 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ộ CSDL bằng cách chèn vào các đoạn lệnh nguy hiểm như lệnh DELETE. Tất cả chỉ là đơn giản thay đổi chuỗi gán dữ liệu cho ID, ví dụ như: http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles. 2. Các tác hại và cách phòng tránh Tác hại từ SQL Injection attack tùy thuộc vào môi trường và cách cấu hình hệ thống. Nếu ứng dụng sử dụng quyền dbo (quyền của người sở hữu CSDL - owner) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng dữ liệu mới, … Nếu ứng dụng sử dụng quyền sa (quyền quản trị hệ thống), nó có thể điều khiển toàn bộ hệ quản trị CSDL và với quyền hạn rộng lớn như vậy nó có thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của bạn. Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu truy vấn SQL là bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ đối tượng Request (Request, Request.QueryString, Request.Form, Request.Cookies, and Request.ServerVariables). - Trong trường hợp dữ liệu nhập vào là chuỗi, như trong ví dụ 1, lỗi xuất phát từ việc có dấu nháy đơn trong dữ liệu. Để tránh điều này, thay thế các dấu nháy đơn bằng hàm Replace để thay thế bằng 2 dấu nháy đơn: p_strUsername = Replace(Request.Form("txtUsername"), "'", "''") p_strPassword = Replace(Request.Form("txtPassword"), "'", "''") - Trong trường hợp dữ liệu nhập vào là số, như trong ví dụ 2, lỗi xuất phát từ việc thay thế một giá trị được tiên đoán là dữ liệu số bằng chuỗi chứa câu lệnh SQL bất hợp pháp. Để tránh điều này, đơn giản hãy kiểm tra dữ liệu có đúng kiểu hay không: p_lngID = CLng(Request("ID")) Như vậy, nếu người dùng truyền vào một chuỗi, hàm này sẽ trả về lỗi ngay lập tức. Ngoài ra để tránh các nguy cơ từ SQL Injection attack, nên chú ý loại bỏ bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển xuống cho người dùng khi ứng dụng có lỗi. Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có thể cho phép kẻ tấn công biết được điểm yếu của hệ thống. Cuối cùng, để giới hạn mức độ của SQL Injection attack, nên kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu đến tài khoản người dùng mà ứng dụng web đang sử dụng. Các ứng dụng thông thường nên tránh dùng đến các quyền như dbo hay sa. Quyền càng bị hạn chế, thiệt hại càng ít. Các tài liệu tham khảo SQL Injection FAQ: http://www.sqlsecurity.com/DesktopDe...ndex=2&tabid=3 Advanced SQL Injection : http://www.nextgenss.com/papers/adva..._injection.pdf Preventing SQL Injection: http://www.owasp.org/asac/input_validation/sql.shtml __________________________________________________ ________ Vậy chống thế nào nhỉ, các anh có thế thấy SQL Injection mãnh thế nào rùi đấy __________________________________________________ ________ Việc thiết kế và đưa website vào hoạt động luôn đòi hỏI nhà phát triển phảI quan tâm đến vấn đề an toàn ,bảo mật nhằm giảm tốI đa kha năng bị hacker tấn công .Thường các nhà phát triển phảI tập trung vào vấn đề an toàn của hệ điều hành ,hệ quản trị CSDL websever ….Tuy nhiên có một nguy cơ tiềm ẩn ít được quan tâm đó là các đoạn mã của ứng dụng một trong số đó là tấn công băng SQL injection .SQL injection là một kỹ thuật cho phép những kẽ tấn công thi hành các câu lệnh truy vấn SQL bất hợp pháp bằng cách lợI dụng lỗ hõng trong việc kiểm tra dũ liệu nhận từ các ứng dụng web hậu quả này rất tai haij vì nó cho phép kẻ tấn công có toàn quyền hiệu chỉnh trên CSDL của ứng dụng lỗI này thường xáy ra trên các ứng dụng web có dữ liệu được quản trị bằng các hệ quản trị CSDL như SQL sever, Oracle,DB2,sysbase. Xét một thí dụ điển hình ,thông thương để cho phép ngườI truy cập vaò 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à pass .sau khi đăng nhập thông tin vào hệ thống sẽ kiểm tra tên vào mật khẩu có hợp lệ hay không để quyết đinhj cho phép hay từ chốI . Trong trường hợp này ngườI ta có thể xây dụng 2 trang một trang HTML để thực hiện form nhập liệu và một trang ASP để xủ lý thông tin từ phía ngườI dùng. VD: Login.html <form action=”Execlogin. Asp”method=”post”> username:<input type=”text”name=”txtusername”><br> password:<input type=”password”name”txtpassword”><br> <input type=”submit”></form> ExecLogin. Asp <% Dim p_strausername,p_strPassword,objRS,serSQL P_serUsername= Request,Form(“txtusername”) P_serPassword= Request.Form(“txtpassword”) serSQL=”SELECT*FORMtblusers”&_”WHEREUsername =’” &_strUsername&_ “and Password=’”&p-strPassword&”” Set objRS= SeverCreateObject(“ADOB.Recordset”) objRS.open strSQL,”DSN=…” if(objRS.EOF) Then Reponse.write”invalid login” Reponse.write”you are logged in as”& objRS(“Username”) End If Set objRS=nothing %> thoạt nhìn đoạn mã trong trang ASP không chứa bất kỳ lỗ hỗng bảo mật nào.NgườI dùng không thể đăng nhập khi không có tên và pass.Tuy nhiên đoạn mã này thật sự không an toàn và là tiềm đề cho tấn công SQL injection đặc biệt sơ hơ nằm ở chổ dữ liệu ngườI dùng nhập vào dùng để xây dựng trực tiếp câu lệnh truy vấn SQL chính điều này cho phép những kẽ tấn công có thể điều khiển được câu truy vấn sẽ thực hiện ví dụ ngườI dùng nhập chuỗI sau vào trong cả hai ô nhập liệu user /pass của trang login.html” ‘or”=’.Lúc này câu truy vấn sẻ được gọI thực hiện là SELECT*FORM tblUsers WHERE Username=’’’ or”=”and password=”or”=” Câu truy vấn này là hoàn toàn hợp lệ và sẽ trả tất cả các bản ghi của tbUsers,và đoạn mã gián tiêp sử lý ngườI đăng nhập hợp lệ . Tác hạI và cách phòng chống: Tác hạI là phụ thuộc vào môi trường và các cấu hình hệ thống nếu ngườI sủ dụng dùng quyền cuar ngườI sở hứu CSDL khi thao tác dữ liệu .Nó có thể sữa toàn bộ đữ liệu ,tạo các bản đữ liệu mớI …..còn nếu ngườI dùng quyền quản trị hệ thống thì có thể điều khiển toàn bộ hệ thống Để tránh điều này thay thế các dấu nháy đơn bằng hàm replace để thay thế bằng 2 dấu nháy đơn: P_strUsername= Replace(Request.Form(“txtusername”),”’”, ”’”) P_strpassword= Replace(Request.Form(“txtpassword”),”’”, ”’”) Một ví dụ khác của tấn công SQL Injection nữa là khi các trang Web sử dụng dữ liệu nhập vào theo dạng querystring (bằng cách gõ cặp tham số và giá trị trực tiếp trên thanh địa chỉ hoặc dùng form với thuộc tính ACTION là GET). Ví dụ sau minh họa một trang ASP nhận dữ liệu cho biến ID thông qua querystring và phát sinh nội dung của trang đó dựa trên ID: <% Dim p_lngID, objRS, strSQL p_lngID = Request(“ID”) strSQL = “SELECT * FROM tblArticles WHERE ID=” & p_lngID Set objRS = Server.CreateObject(“ADODB.Recordset”) objRS.Open strSQL, “DSN=...” If (Not objRS.EOF) Then Response.Write objRS(“ArticleContent”) Set objRS = Nothing %> Trong các tình huống thông thường, đoạn mã này hiển thị nội dung của article có ID trùng với ID được chuyển đến cho nó dưới dạng querystring. Ví dụ, trang này có thể được gọi như sau: http://www.example.com/Article.asp?ID=1055, để hiển thị nội dung của article có ID là 1055. Giống như ví dụ đăng nhập ở trên, đoạn mã này để lộ sơ hở cho khả năng tấn công SQL Injection. Kẻ tấn công có thể thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác, để thực hiện một lệnh SQL bất hợp pháp, ví dụ như: 0 or 1=1 (nghĩa là, http://www.example.com/Article.asp?ID=0 or 1=1). Câu truy vấn SQL lúc này sẽ trả về tất cả các article từ bảng dữ liệu vì nó sẽ thực hiện câu lệnh: SELECT * FROM tblArticles WHERE ID=0 or 1=1 Tất nhiên ví dụ này 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ộ CSDL bằng cách chèn vào các đoạn lệnh nguy hiểm như lệnh DELETE. Tất cả chỉ là đơn giản thay đổi chuỗi gán dữ liệu cho ID, ví dụ như: http://www.example.com/Article.asp?ID=1055; DELETE FROM tblArticles. Tác Hại Và Cách Phòng Tránh Tác hại của dạng tấn công SQL Injection tùy thuộc vào môi trường và cách cấu hình hệ thống. Nếu ứng dụng sử dụng quyền dbo (quyền của người sở hữu CSDL) khi thao tác dữ liệu, nó có thể xóa toàn bộ các bảng dữ liệu, tạo các bảng dữ liệu mới... Nếu ứng dụng sử dụng quyền sa (quyền quản trị hệ thống), nó có thể điều khiển toàn bộ hệ CSDL và thậm chí có thể tạo ra các tài khoản người dùng bất hợp pháp để điều khiển hệ thống của bạn. Để phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu truy vấn SQL bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ đối tượng Request (Request, Request. QueryString, Request.Form, Request. Cookies, và Request.Server Variables). Trong trường hợp dữ liệu nhập vào là chuỗi, như trong ví dụ 1, lỗi xuất phát từ việc có dấu nháy đơn trong dữ liệu. Để tránh điều này, thay thế các dấu nháy đơn bằng hàm Replace để thay thế bằng 2 dấu nháy đơn: p_strUsername = Replace(Request.Form(“txtUsername”), “‘“, “‘’”) p_strPassword = Replace(Request.Form(“txtPassword”), “‘“, “‘’”) Trong trường hợp dữ liệu nhập vào là số, như trong ví dụ 2, lỗi xuất phát từ việc thay thế một giá trị được tiên đoán là dữ liệu số bằng chuỗi chứa câu lệnh SQL bất hợp pháp. Để tránh điều này, đơn giản hãy kiểm tra dữ liệu có đúng kiểu hay không: p_lngID = CLng(Request(“ID”)) Như vậy, nếu người dùng truyền vào một chuỗi, hàm này sẽ trả về lỗi ngay lập tức. Ngoài ra để tránh các nguy cơ từ tấn công SQL Injection, nên chú ý loại bỏ bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển tới cho người dùng khi ứng dụng có lỗi. Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có thể cho phép kẻ tấn công biết được điểm yếu của hệ thống. Bạn có thể tham khảo thêm thông tin về cách thức tạo ra các trang báo lỗi tùy ý trong “Tạo ra các trang báo lỗi ASP được tùy biến”. Cuối cùng, để hạn chế thiệt hại do tấn công SQL Injection, nên kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu của tài khoản người dùng mà ứng dụng web đang sử dụng. Các ứng dụng thông thường nên tránh dùng các quyền như dbo hay sa. Quyền càng hạn chế, thiệt hại càng ít. Đa số các trang web hiện nay,tuỳ thuộc vào nội dung mà thiết kế cho riêng mình 1 giao diện bắt mắt.Để làm việc này họ chỉ cần download database từ trên Internet về và sữa đổi dữ liệu đã được cập nhật từ 1 database.Một trong những nền phổ biến cho web datastores là SQL.Một hay nhiều ứng dụng web thì được đơn giản toàn bộ những script đầu vào bằng cách truy vấn 1 SQL database,bản thân web server hoặc 1 hệ thống đầu cuối riêng biệt.Một trong những cuộc tấn công xảo quyệt nhất ứng dụng web bao gồm việc đánh cắp queries sử dụng bởi bản thân những scripts đầu vào để tước quyền điều khiển những ứng dụng hoặc dữ liệu của nó.Một trong những cơ cấu có hiệu quả nhất để thực hiên điều này là kĩ thuật được mang tên "SQL Injection". SQL Injection chỉ việc đưa vào những đoạn truy vấn nguy hiểm TransacSQL vào 1 vị trí để thực hiện những hoạt động không ngờ.Thường thì những đoạn truy vấn hiện có đơn giản là Edit để hoàn thành những kết quả tương tự. TransactSQL thì dễ dàng vận dụng bằng sự thay thế 1 kí tự đơn,tuỳ thuộc vào sự sáng suốt có kẻ tấn công để đưa ra những đoạn truy vấn nguy hiểm. Một số các kí tự thường được sử dụng để chèn dữ lịêu vào hợp lệ trong bao gồm (');(--);và ;.Chúng có những ý nghĩa đặc biệt trong Transact SQL. Chúng ta sẽ tự hỏi là khi hacker đánh cắp được SQL query chúng sẽ làm gì?.Ban đầu họ có thể xâm nhập trái phép các dữ liệu.Với những kĩ thuật kín đáo,họ có thể truy cập 1 cách hợp pháp,hoặc thậm chí là tìm cách hoàn toàn điều khiển toàn bộ webserver hoặc hệ thống SQL đầu cuối. Ví dụ về SQL Injection:Để tìm vị trí bị lỗi SQL Injection,ta gõ 1 số từ khoá trong Form field như sau: +Đăng nhập hợp pháp: -Xác nhận đúng mà không cần bất kì điều kiện nào: USER:' OR "=' PASS:' OR "=' -Xác nhận đúng chỉ với username: USER:admin'-- -Xác nhận đúng như là người dùng đầu tiên trong user table: USER:' or 1=1-- -Xác nhận đúng như là 1 người dùng giả tạo: USER:' union select 1,'user','passwd' 1-- +Phá hoại: -Bỏ 1 bảng dữ liệu: USER:';drop table users-- -Shutdown dữ liệu từ xa: USER:aaaaaaaaaaaaaaa' PASS:';shutdown-- +Thực thi chức năng yêu cầu lấy và lưu trữ những thủ tục: -Thi hành xp_cmdshell để lấy 1 danh sách thư mục: http://localhost/script?0';EXEC+master...#39;dir';-- -Thi hành xp_service control để chiếm đoạt service: http://localhost/script?0';EXECT+maste...;server';-- Không phải cú pháp trên đều làm việc hầu hết trên các dữ liệu.Thông tin sau sẽ cho biết những phương pháp chúng ta đã sơ lược phía trên sẽ làm việc hay không trong những nền chứa dữ liệu.Vì không kẻ bảng được nên mình gõ như sau cho dễ so sánh: Datapase specific Information:---My SQL----Oracle-----DB2------Postgre-----MSSQL UNION possible:----------------------Y------------Y---------Y----- -------Y------------Y--- Subselects possible:-----------------N------------Y---------Y---------- --Y------------Y--- Multiple statements:-----------------N(mostly)---N---------N--------- -Y-------------Y-- Default stored procedures:---------_--Many(utf-file)------_----------_----- --M(cmdshell) Other Comments:----------Supports"intooutfile"-_-------_---------- -_-------------_---- +Các công cụ tự động tìm lỗi SQL injection: SQL Injection thường được thực hiện bằng kĩ thuật của hacker,nhưng 1 vài công cụ có thể tự động quá trình nhận dạng và khai thac chỗ yếu.Wpoison là công cụ có thể phát hiện lỗi SQLInjection trong các trang web.Những đoạn string tìm lỗi SQL thì được lưu trữ trong 1 file từ điển,và vì thế nó trở lên dễ dàng cho bất kì ai thêm vào danh sách từ điển cho riêng mình.Wpoison chạy trên Linux,có thể download tại: http://wpoison.sourceforge.net Ngoài ra còn có công cụ SPIKE Proxy,nó có các chức năng khá tốt-tự động thực hiện SQL Injection -những d0oạn string sẽ được Inject tuỳ vào thói quen người sử dụng .SPIKE Proxy là 1 Python và OpenSSL-công cụ đánh giá ứng dụng web cơ bản có các chức năng như HTTP và HTTPS Proxy...Nó cho phép người phát triển web hoặc người quản trị ứng dụng web cấp thấp truy cập vào tòan bộ phương tiện ứng dụng web,trong khi nó cũng cung cấp 1 nhóm các công cụ tự động và những kĩ năng khám phá ra những lỗi thông thường,các công cụ đó bao gồm:SQL Injection,Website Crawler,Login Form Brute Forcer,Automated Overflow Detection..v.vSpike Proxy chạy trên Win32 và Linux,các bạn có thể Download tại: http://www.immunitysec.com/spike.htm....com/spike.htm l Chú ý là phần mềm này nặng khoảng 13M và máy tính của bạn phải có sẵn Python và OpenSSL.Trong WinXP công cụ này không hoạt động. Mieliekoek.pl là 1 SQL Insertion Crawler,có chức năng kiểm tra các form liên quan đến lỗi SQL.Scrip này cung cấp 1 công cụ Web mirroring như là dữ liệu vào,xem xét từng file và nhân diện sự tồn tại các form trong file.Các chuỗi được Inject có thể dễ dàng thay đổi trong file cấu hình.Download Mieliekoek tại: http://packetstormsecurity.nl/UNIX/s.../mieliekoek.pl Công cụ này chỉ hoạt động khi máy bạn đã cài PERL.Sau đây là 1 ví dụ của dữ liệu xuất từ mieliekoek: $badstring="blah'''; #$badstring="blah' or 1=1 --"; $badstring="blah' exec master..xp_cmdshell 'nslookup a.com 196.30.67.5' - '; Tự tạo các trang báo lỗi ASP tùy biến Một trong những cách để chống tấn công SQL Injection là vô hiệu hóa các thông báo lỗi chi tiết trong IIS và bằng cách tạo ra các thông báo lỗi tùy ý không mang tính chất kĩ thuật. Thông tin trong bài báo này áp dụng cho Microsoft Internet Information Services version 5.0.Microsoft Internet Information Services (IIS) version 5.0 có khả năng tạo các trang báo lỗi Active Server Pages (ASP) tùy biến thông qua một phương thức mới cho đối tượng ASP Server dựng sẵn có tên là Server.GetLastError(), phương thức này trả lại một đối tượng ASPError mới. Điều Gì Đã Xảy Ra Khi một lỗi xuất hiện trong quá trình bạn biên dịch hay chạy một trang ASP, IIS sẽ đưa ra thông báo lỗi 500;100 và thực thi phương thức Server.Transfer() để chuyển quyền kiểm soát đến trang báo lỗi tùy biến được định nghĩa hiện thời. (Theo mặc định trang này là /iishelp/common/500-100.asp.) Để có thêm thông tin về phương thức Server.Transfer(), hãy xem bài sau đây trong Microsoft Knowledge Base: Q219294 Làm thế nào để sử dụng phương thức Server.Transfer. Khi IIS chuuyển lỗi đến trang báo lỗi tùy biến, ta có thể sử dụng phương thức Server.GetLastError() có thể được sử dụng để thu nhận các thông tin chi tiết liên quan đến lỗi xuất hiện. Phương thức Server.GetLastError() trả lại một đối tượng ASPError, đối tượng này có các thuộc tính được liệt kê trong bảng sau đây.(Bảng này cũng có thể tìm thấy trong phần tài liệu kĩ thuật của IIS 5.0 có trên mạng.)Các bước được liệt kê dưới đây sẽ chỉ cho bạn thấy các bước cần tiến hành để tạo ra một trang báo lỗi ASP tùy biến. 1. Lưu mã ASP dưới đây vào thư mục Scripts của bạn dưới tên tệp là “My500.asp”: <%@Language=”VBSCRIPT”%> <% Option Explicit On Error Resume Next Response.Clear Dim objError Set objError = Server.GetLastError() %> <html> <head> <title>ASP 500 Error</title> <style> BODY { FONT-FAMILY: Arial; FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: #000000; MARGIN: 15px; } H2 { FONT-SIZE: 16pt; COLOR: #ff0000; } TABLE { BACKGROUND: #000000; PADDING: 5px; } TH { BACKGROUND: #0000ff; COLOR: #ffffff; } TR { BACKGROUND: #cccccc; COLOR: #000000; } </style> </head> <body> <h2 align=”center”>ASP 500 Error</h2> <p align=”center”>Một lỗi xuất hiện trong quá trình xử lý trang bạn yêu cầu.<br> Đề nghị hãy xem chi tiết dưới đây.</p> <div align=”center”><center> <table> <% If Len(CStr(objError.ASPCode)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Số hiệu lỗi IIS</th> <td align=”left” valign=”top”><%=objError.ASPCode%></td> </tr> <% End If %> <% If Len(CStr(objError.Number)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Số hiệu lỗi COM</th> <td align=”left” valign=”top”><%=objError.Number%> <%=” (0x” & Hex(objError.Number) & “)”%></td> </tr> <% End If %> <% If Len(CStr(objError.Source)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Nguồn gây lỗi</th> <td align=”left” valign=”top”><%=objError.Source%></td> </tr> <% End If %> <% If Len(CStr(objError.File)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Tên file</th> <td align=”left” valign=”top”><%=objError.File%></td> </tr> <% End If %> <% If Len(CStr(objError.Line)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Số của dòng gây lỗi</th> <td align=”left” valign=”top”><%=objError.Line%></td> </tr> <% End If %> <% If Len(CStr(objError.Description)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Mô tả ngắn gọn</th> <td align=”left” valign=”top”><%=objError.Description%></td> </tr> <% End If %> <% If Len(CStr(objError.ASPDescription)) > 0 Then %> <tr> <th nowrap align=”left” valign=”top”>Mô tả đầy đủ</th> <td align=”left” valign=”top”><%=objError.ASPDescription%></td> ; ; </tr> <% End If %> </table> </center></div> </body> </html> 2.Thiết lập trang ASP báo lỗi tùy biến: 1. Mở trình Internet Services Manager trong MMC. 2. Mở rộng phạm vi theo dõi Default Web Site của bạn. 3. Kích chuột phải vào thư mục Scripts và chọn Properties. 4. Kích vào tab Custom Errors. 5. Cuộn xuống và kích chọn vào 500;100 HTTP error và kích vào Edit Properties. 6. Thiết lập Message Type thành URL. 7. Thay đổi URL thành “/scripts/my500.asp” (không để dấu trích kép). 8. Kích OK để trở lại MMC. 3. Kiểm tra trang báo lỗi mới: • Lưu tất cả các trang sau đây vào thư mục Scripts của bạn: Lưu trang này với cái tên Badpage1.asp: <%@Language=”VBSCRIPT”%> <html> <head> <title>Trang có lỗi 1</title> </head> <body> <% Response.Write 1/0 %> </body> </html> Lưu trang này dưới cái tên Badpage2.asp: <%@Language=”VBSCRIPT”%> <html> <head> <title>Trang có lỗi 2</title> </head> <body> <% Response.BadMethod “Hello” %> </body> </html> Lưu trang này dưới cái tên Badpage3.asp: <%@Language=”VBSCRIPT”%> <html> <head> <title>Trang có lỗi 3</title> </head> <body> <% Dim objBad Set objBad = Server.CreateObject(“BAD.OBJECT.CLASS”) %> </body> </html> • Khi bạn duyệt bất cứ một trang nào ở trên, nếu như các bước trên bạn tiến hành thành công thì bạn sẽ trông thấy các trang báo lỗi đã được tùy biến hiển thị trên trình duyệt. Chú ý: Khi sử dụng Internet Explorer 5.0 và các phiên bản sau đó để xem các trang báo lỗi ASP được tùy biến, rất có thể bạn sẽ nhận được những kết quả không mong muốn. IE5 đã đưa ra một tính năng để thay thế cho trang HTML mẫu dùng cho lỗi HTTP 500, và một số các trang khác thường được sử dụng để trả lại các mã trạng thái, bằng các thông điệp không cụ thể và chuẩn. Để bỏ qua tính năng này và hiển thị kết quả kiểm tra chính xác của mã trạng thái được trả lại cho trình duyệt, bạn hãy mở Internet Explorer và chuyển tới: Tools | Internet Options | Advanced và sau đó bỏ dấu kiểm trên hộp có dán nhãn Show friendly HTTP error messages - Thủ thuật khử nháy đơn (') - Thủ thuật khử trích dẫn - Thủ thuật ràng buộc nhập password --------------------------------------------- Sử dụng VBScript xây dựng các hàm sau: - Khử nháy đơn function escape(input) input = replace(input,"'",""") escape = input end function - Khử trích dẫn function validate_string( input) known_bad = array("select","insert","update","delete","drop","--","'","@ @","%%") validate_string = true for i = lbound( known_bad ) to ubound( known_bad ) if (instr(1, input, known_bad(i),vbtextcompare)<>0) then validate_string = false exit function end if next end function - Ràng buộc nhập password function validatepassword( input ) good_password_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS TUVW XYZ0123456 789" validatepassword = true for i = 1 to len (input) c = mid( input, i, 1) if (Instr(good_password_chars,c) = 0) then validatepassword =false end if next end function |
|
|