SQL注入入門筆記
SQL注入入門筆記
注入判斷
數值型
方法:URL後面輸入 and 1=1 / and 1=2後頁面回顯不同(前提是頁面上有回顯的地方)
當輸入1=1時頁面正常,1=2時頁面出錯,說明為數值型注入
原理:後臺指令碼中提交的sql語句為類似 select * from <表名> where id = x 的語句,通過get方式提交使用者輸入的數值來改變語句中的x,沒有引號
字元型
方法:URL後面輸入正常值後,在後面加上用單引號、雙引號、括號等一個或兩個的組合(一般是單引號)
在後面加上單引號後頁面報錯,在後面再加上"--+"後頁面恢復正常,說明為字元型注入
原理:後臺指令碼中提交的sql語句為類似SELECT * FROM <表名> WHERE id=‘x’,可以看到id後面的內容是被引號包裹的,注入時需要輸入相應的引號來把原來的引號截胡,再把後面的多餘引號註釋掉
開始注入
判斷欄位數
欄位數,個人理解為返回結果中的列數,一般使用order by語句判斷,將語句直接拼接在使用者輸入的數值後面,當order by後面的數字最大且不報錯時即為欄位數,這裡使用sqli-labs做例子
http://127.0.0.1/sqli/Less-1/index.php?id=1 order by 3
當大於3時頁面報錯,可知欄位數為3
判斷顯示位
顯示位,就是頁面上顯示的資料是資料庫返回的資料中的第幾個,一般用聯合查詢判斷,以sqli-labs為例
http://127.0.0.1/sqli/Less-1/index.php?id=-1' union select 1,2,3--+
- union select,聯合查詢,條件是前面的條件是錯的,才會執行後面的語句,如示例中id=-1,這是一條不可能成立的條件;後面的"1,2,3"前面已經判斷得欄位數為3,所以此處也有三個
- 後面的"--+"作用為將後面內容註釋掉
如圖,頁面將2和3顯示出來了,說明返回的資料中的3個欄位只顯示後兩個,所以聯合查詢語句中的2和3處可以替換為需要查詢的內容了
獲取資料
常用sql語句
- 聯合查詢union select,注意應構造一個絕對錯誤的條件才會執行後面的內容
- group_concat(列名),將這一列的內容拼接在一個字串裡
- select user() / version() / database() / @@datadir / @@basedir:檢視使用者名稱/MySQL版本/資料庫名/資料庫路徑/資料庫安裝目錄
- concat(str1,str2,...):無分隔符地連線字串
- group_concat(str1,str2,...):有分隔符地連線字串
- concat_ws(separator,str1,str2):用分隔符連線兩個欄位的字元
- group_concat(concat_ws(seperator,str1,str2)):將多行查詢結果以逗號分隔全部輸出,每一行的結果可用設定的分隔符作欄位的間隔
更多語句可以看看這位大佬的部落格點選傳送
常用MySQL位置
information_schema資料庫,存放MySQL中的一切引數
- Tables表,存放資料表資訊
- 表中常用列:table_schema , table_name
- Columns表,存放所有列的資訊
- 表中常用列:table_schema , table_name , colomn_name
報錯注入
前提:頁面無顯示位但有執行錯誤資訊輸出位,且伺服器端開啟錯誤顯示
常用函式:
- extractvalue(目標xml文件,xml路徑):第一個引數隨意填,第二個引數寫查詢語句
- updatexml(目標xml文件,xml路徑,更新的內容):在第二個引數中寫查詢語句
l文件,xml路徑):第一個引數隨意填,第二個引數寫查詢語句
2. updatexml(目標xml文件,xml路徑,更新的內容):在第二個引數中寫查詢語句
報錯注入還有很多方法,我個人知之甚少,可以搜搜大佬的帖子