在之前的博文中曾介紹過如何對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。

image

登入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表中的所有內容:

image

從命令顯示的結果中可以看到,當前系統中共包含了3個資料庫,這與之前檢視到的結果一致。

(6)利用information_schema資料庫檢視其他所有資料庫的內容

在瞭解了上述基礎知識之後,我們就可以通過information_schema資料庫來檢視到其他所有資料庫中我們所關心的內容。

為了更好的演示,我們先執行“exit”命令退出MySQL環境,然後再重新登入。

登入之後,我們先不開啟任何資料庫。

假如我們想知道mysql資料庫中都包含了哪些表,可以執行命令:

image

由於當前我們並沒有開啟任何資料庫,因而“information_schema.tables”就表示information_shema資料庫中的tables表,前面介紹過,這個表中存放了其他所有資料庫的表的名字。

“table_name”是tables中用於存放表名的欄位,“tables_schema”是tables中用於存放資料庫名的欄位。

再如我們想知道mysql資料庫的user表中包含哪些欄位,可以執行命令:

image

掌握了這些知識之後,接下來我們就可以進行手工PHP注入了



本文轉自 yttitan 51CTO部落格,原文連結:http://blog.51cto.com/yttitan/1570620