在之前的博文中曾介紹過如何對ASP網站進行手工注入,ASP網站大都是採用ACCESS或MSSQL資料庫,因而所謂針對ASP的SQL隱碼攻擊其實也就是根據ACCESS或MSSQL資料庫的特點來構造查詢語句。除此之外,對於PHP網站則大都是採用MySQL資料庫,這裡要進行手工注入時所使用的查詢語句與之前就不相同了,而且相對比較複雜。為了更好地理解,在進行鍼對PHP網站的注入之前,有必要先了解一些MySQL的基本特點和常用操作語句。
首先需要搭建一個MySQL的實驗環境,這裡推薦在Linux系統中安裝MySQL服務。
掛載光碟並設定yum源之後,安裝執行mysql服務。
# yum install mysql 安裝mysql
# service mysqld start 執行mysql
MySQL的預設管理員賬號是root,沒有設定密碼,所以可以執行“mysql –u root”命令,以root使用者身份登入MySQL。不過建議最好先用mysqladmin命令工具為root使用者設定一個密碼,然後用密碼登入MySQL。
登入MySQL之後,可以在帶有提示符“mysql>”的互動式命令環境中進行操作。在該操作環境中,輸入的每一條資料庫管理命令必須以分號“;”表示結束,可以不區分大小寫。
(1) 檢視基本資訊
執行“select version();”命令檢視MySQL版本,可以看到當前版本為5.0.77。
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.77 |
+-----------+
1 row in set (0.00 sec)
執行“select @@version_compile_os;”命令檢視作業系統版本,可以看到當前系統為redhat linux。
mysql> select @@version_compile_os;
+----------------------+
| @@version_compile_os |
+----------------------+
| redhat-linux-gnu |
+----------------------+
1 row in set (0.00 sec)
執行“select user();”命令檢視當前使用者,可以看到當前使用者為root。
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.07 sec)
執行“select database();”命令檢視當前開啟的資料庫,可以看到當前沒有開啟任何資料庫(NULL)。
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set (0.01 sec)
(2) 檢視資料庫列表
執行“show databases;”命令可以檢視MySQL中共包含了哪些資料庫,預設情況下MySQL中內建了3個資料庫:information_schema、mysql、test。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
(3)切換資料庫
執行“use information_schema;”命令,可以開啟information_schema資料庫。
mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
information_schema是MySQL5以後的版本中預設自帶的一個資料庫,它裡面存放了由使用者在MySQL中建立的所有其它資料庫的資訊。因而在進行PHP注入時,主要也就是針對這個資料庫進行操作。
(4)顯示資料庫中的表
開啟資料庫之後,執行“show tables;”命令可以顯示資料庫中所包含的表。在information_schema中共包含了17個表。
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| PROFILING |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+---------------------------------------+
17 rows in set (0.00 sec)
在這些表中比較重要的有:
-
schemata:用於存放其它所有資料庫的名字。
-
tables:用於存放MySQL中所有資料庫的表的名字。
-
columns:用於存放MySQL中所有資料庫的所有表中的所有欄位的名字。
(5)顯示錶中的內容
執行“select * from schemata;”命令可以顯示schemata表中的所有內容:
從命令顯示的結果中可以看到,當前系統中共包含了3個資料庫,這與之前檢視到的結果一致。
(6)利用information_schema資料庫檢視其他所有資料庫的內容
在瞭解了上述基礎知識之後,我們就可以通過information_schema資料庫來檢視到其他所有資料庫中我們所關心的內容。
為了更好的演示,我們先執行“exit”命令退出MySQL環境,然後再重新登入。
登入之後,我們先不開啟任何資料庫。
假如我們想知道mysql資料庫中都包含了哪些表,可以執行命令:
由於當前我們並沒有開啟任何資料庫,因而“information_schema.tables”就表示information_shema資料庫中的tables表,前面介紹過,這個表中存放了其他所有資料庫的表的名字。
“table_name”是tables中用於存放表名的欄位,“tables_schema”是tables中用於存放資料庫名的欄位。
再如我們想知道mysql資料庫的user表中包含哪些欄位,可以執行命令:
掌握了這些知識之後,接下來我們就可以進行手工PHP注入了
本文轉自 yttitan 51CTO部落格,原文連結:http://blog.51cto.com/yttitan/1570620