聊一聊bypass information_schema
前言
聊一聊mysql在被waf禁掉了information_schema庫后還能有哪些利用思路,這個想法是前一段時間想到的,這次趁著安全客活動就在這里記錄一下吧~
# 實驗環境windows 2008 r2 phpstudy (mysql 5.7) 某waf(原因是該waf可以設置非法訪問information_schema數據庫)前置任務
進行bypass之前先了解一下mysql中的information_schma這個庫是干嘛的,在SQL注入中它的作用是什么,那么有沒有可以替代這個庫的方法呢?
information_schema
簡單來說,這個庫在mysql中就是個信息數據庫,它保存著mysql服務器所維護的 所有其他數據庫的信息,包括了數據庫名,表名,字段名等。在注入中,information_schema庫的作用無非就是可以獲取到table_schema,table_name,column_name這些數據庫內的信息。
MySQL5.7的新特性
由于performance_schema過于發雜,所以mysql在5.7版本中新增了sys schemma,基礎數據來自于performance_chema和information_schema兩個庫,本身數據庫不存儲數據。
*注*: 這里說一下,現在網絡上能搜索到的文章大部分都是利用innoDB引擎繞過對information_schema的過濾,但是mysql默認是關閉InnoDB存儲引擎的,所以在本文中不討論該方法,若想了解可自行搜索,網絡上有很多分析文章了。sys.schema_auto_increment_columns
? 開始了解這個視圖之前,希望你可以想一下當你利用Mysql設計數據庫時,是否會給每個表加一個自增的id(或其他名字)字段呢?如果是,那么我們發現了一個注入中在mysql默認情況下就可以替代information_schema庫的方法。
schema_auto_increment_columns,該視圖的作用簡單來說就是用來對表自增ID的監控。
? 這里我通過security(sqli-labs)和fortest(我自建庫)兩個庫來熟悉一下schema_auto_increment_columns視圖的結構組成,以及特性。
# fortest庫data 表存在自增idno_a_i_table 表不存在自增idtest 表存在自增id # security庫//該庫為sqli-labs自動建立emails,referers,uagents,users?
? 可以發現,fortest庫中的no_a_i_table并不在這里存在,然而其他非系統庫的表信息全部在這里。根據前面介紹的schema_auto_increment_columns視圖的作用,也可以發現我們可以通過該視圖獲取數據庫的表名信息,也就是說找到了一種可以替代information_schema在注入中的作用的方法。
? 當然了,如果你說我們就是想想通過注入獲取到沒有自增主鍵的表的數據怎么辦?通過翻閱sys中的視圖文檔,我又發現了一個視圖也許可以實現這種需求?。
schema_table_statistics_with_buffer,x$schema_table_statistics_with_buffer
查詢表的統計信息,其中還包括InnoDB緩沖池統計信息,默認情況下按照增刪改查操作的總表I/O延遲時間(執行時間,即也可以理解為是存在最多表I/O爭用的表)降序排序,數據來源:performance_schema.table_io_waits_summary_by_table、sys.x$ps_schema_table_statistics_io、sys.x$innodb_buffer_stats_by_table
? 通過介紹的內容我們可以很容易的發現,利用“數據來源”同樣可以獲取到我們需要的信息,所以說這樣的話我們的繞過information_schema的思路就更廣了。加下來依次看一下各個視圖的結構:
# sys.schema_table_statistics_with_buffer可以看到,在上一個視圖中并沒有出現的表名在這里出現了。?
# sys.x$schema_table_statistics_with_buffer?
# 在從`數據來源`中隨便選取一個視圖為例(想查看視圖詳細結構等信息可自行測試) # sys.x$ps_schema_table_statistics_io # 可忽略table_name='db',默認的并非我創建。?
注:?類似的視圖等還有很多,若有興趣可自行翻閱,這里僅拋磚引玉吧,記錄一下自己之前的想法思路。
?
Bypass information_schema
? 上面的方法的確可以獲取數據庫中表名信息了,但是并沒有找到類似于information_schema中COLUMNS的視圖,也就是說我們并不能獲取數據?
join
這個思路在ctf中比較常見吧,利用join進行無列名注入,如何利用到這里就顯而易見了。
join … using(xx)
? 簡單的記錄一下payload吧。以本文開頭的環境為例,這里的waf會完全過濾掉information_schema庫。
由于開啟防護后會攔截正常注入,所以圖中payload可能會有些亂,我會將簡單的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()--+?
其他的就不測試了,都是一個payload。
獲取字段名
# 獲取第一列的列名?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版本。繞過的方法可能還有很多,希望各位表哥可以不吝賜教。文中可能還有哪些視圖并沒有全部指出,可以自行查找類似的功能點。
總結
以上是生活随笔為你收集整理的聊一聊bypass information_schema的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 渗透测试中dns log的使用
- 下一篇: mysql中的get_lock锁机制解析