1. 程式人生 > 其它 >SQL注入入門筆記

SQL注入入門筆記

技術標籤:mysql資訊保安

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--+
  1. union select,聯合查詢,條件是前面的條件是錯的,才會執行後面的語句,如示例中id=-1,這是一條不可能成立的條件;後面的"1,2,3"前面已經判斷得欄位數為3,所以此處也有三個
  2. 後面的"--+"作用為將後面內容註釋掉

sqli-labs

如圖,頁面將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

報錯注入

前提:頁面無顯示位但有執行錯誤資訊輸出位,且伺服器端開啟錯誤顯示

常用函式:

  1. extractvalue(目標xml文件,xml路徑):第一個引數隨意填,第二個引數寫查詢語句
  2. updatexml(目標xml文件,xml路徑,更新的內容):在第二個引數中寫查詢語句

l文件,xml路徑):第一個引數隨意填,第二個引數寫查詢語句
2. updatexml(目標xml文件,xml路徑,更新的內容):在第二個引數中寫查詢語句

報錯注入還有很多方法,我個人知之甚少,可以搜搜大佬的帖子