在進行sql注入時,一般都是使用 information_schema 庫來獲取表名與列名,因此有一種場景是傳入參數時會將 information_schema 過濾
在這種情況下,由于 information_schema 無法使用,我們無法獲取表名與列名。
表名獲取方式
- InnoDb引擎
????????從 MYSQL5.5.8 開始,InnoDB成為其默認存儲引擎。而在MYSQL5.6以上的版本中,inndb增加了 innodb_index_stats 和 innodb_table_stats 兩張表,這兩張表中都存儲了數據庫和其數據表的信息,但是沒有存儲列名。
- sys數據庫
????????在 5.7 以上的 MYSQL 中,新增了 sys數據庫,該庫的基礎數據來自 information_schema 和performance_schema ,其本身不存儲數據。可以通過其中的 schema_auto_increment_columns 或 x$schema_table_statistics 等等數據表(都含有 table_schema 和 table_name)來獲取表名。
列名獲取方式
基于 union select 的無列名注入(子查詢)
使用 join 與 using
在使用 join 來拼接表時,有一個語法錯誤為兩張表中的列名重復,因此可以顯示該語法錯誤來找到該表的列名(如果兩張表為同一張表需要給兩張表以及拼接后的表都起一個別名)
語法:
select * from (select * from tableName as a join tableName as b) as c;
select * from (select * from tableName as a join tableName as b using(colunmName) ) as c;
在sql注入時,我們一般是傳入參數并將后面的語句注釋掉后重新編寫語句,因此在實際的sql應用中我們一般在傳入參數后使用union select來聯合該錯誤。