SQL注入是WEB應用程序在利用用戶輸入構造SQL語句時,沒有對用戶輸入進行限制和過濾,導致執行額外的SQL語句查詢。
以下環境均爲mySQL數據庫
一、知識點
1、select * from ta where id=1 === select * from ta where id=’1’ === select * from ta where id=”1”(目前只測試id爲varchar和int的情況下)
2、select * from ta where age=’’’’,返回結果爲0(‘’’’爲四個單引號)
3、select * from ta where id=''or 1=1 --sdf 與 select * from ta where id=''or 1=1 -- sdf不同,註釋內容需要在--之後有個空格
4、union連接的兩個SQL語句,查詢的列數和數據類型必須相同。可以將額外查詢的語句放在union語句後面
5、SELECT 2 , 4 FROM ta WHERE id =1,結果顯示(2, 4),個數爲滿足條件的個數
6、information_schema:mysql數據庫默認數據庫,保存了MySQL服務器所有數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。這臺MySQL服務器上,到底有哪些數據庫、各個數據庫有哪些表,每張表的字段類型是什麼,各個數據庫要什麼權限才能訪問,等等信息都保存在information_schema數據庫裏面。
(1)tables數據表中保存了TABLE_SCHEMA(數據庫名)TABLE_NAME(數據表名)
(2)Columns數據表中保存了TABLE_SCHEMA(數據庫名),TABLE_NAME(數據表名),COLUMN_NAME(列名),DATA_TYPE(數據類型)(注:有些數據庫用戶沒有權限訪問該數據表...)
7、select password, concat(first_name, last_name, ‘user_name’) from... Concat函數將三列變爲一列。
8、SELECT id, version() from ta 顯示數據庫版本,另外,database()當前查詢數據庫的名稱,user()顯示數據庫登陸用戶名,Loadfile(),讀取文件
二、過程
1、找到注入點
2、利用union select 1, 2,......找到查詢的列數
3、利用mysql數據庫中INFROMATION_SCHEMA系統表進行數據查詢
(1)union select 1, ..... table_name from INFORMATION_SCHEMA.tables 獲取所有表名(union select 1, ..... table_schema,table_name from INFORMATION_SCHEMA.tables獲取所有表以及表所屬的數據庫) 找到感興趣的數據庫和數據表
(2)Union select 1,....table_schema, table_name, column_name, data_type from INFORMATION_SCHEMA.tables where table_name=敢興趣的數據表,例如users數據表 找到感興趣的數據表的列名和數據類型
(3)Union select null, password from users 查詢感興趣的數據表中的數據
拜了個拜!