《Web安全攻防 滲透測試實戰指南 》 學習筆記 (五)


Web安全攻防 滲透測試實戰指南   學習筆記 (五)

 
 

第四章 Web安全原理解析  (一)


(一)SQL注入的原理

  1.web應用程序對用戶輸入數據的合法性沒有判斷。

  2.參數用戶可控:前端傳給后端的參數內容是用戶可以控制的。

  3.參數帶入數據庫查詢:傳入的參數拼接到SQL語句,且帶入數據庫查詢。

 

  舉個栗子:

   select * from users where id=1 and 1=1 

  當1=1為真,且where語句中id也為真,頁面會返回與id=1相同的結果。

  當傳入的id參數為and 1=2時,由於1=2為假,所以頁面就會返回與id=1不同的結果。

  (這樣就說明,你構造的sql語句是被執行了,由此可以初步判斷id參數存在sql注入漏洞~)
  

(二)Mysql注入

 

1.MySQL介紹

  Mysql5.0版本以后,mysql默認在數據庫中存放一個“information_schema”的數據庫。
  在該庫中,讀者需要記住三個表名,分別是SCHEMATA、TABLES、COLUMNS。

  SCHEMATA表存儲該用戶創建的所有數據庫的庫名,該表中記錄數據庫庫名的字段名為SCHEMA_NAME。

  TABLES表存儲該用戶創建的所有數據庫的庫名和表名,該表中記錄數據庫庫名和表名的字段名分別為TABLE_SCHEMA和TABLE_NAME。

  COLUMNS表存儲該用戶創建的所有數據庫的庫名、表名和字段名,該表中記錄數據庫庫名、表名和字段名的字段名為TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。


2.Mysql小知識點


  database() : 當前網站使用的數據庫
  version():當前mysql的版本
  user():當前mysql的用戶

 

3.MySQL查詢語句

  (1)在不知道任何條件下,你可以試試:

  select 要查詢的字段名  from  庫名.表名 

  (2)知道一條已知條件時,你可以試試:

  select 要查詢的字段名  from  庫名.表名 where 已知條件的字段名=‘已知條件的值’

  (多條已知條件的話,使用 and 連接~)

 

4.limit用法

  limit子句可以被用於強制 SELECT 語句返回指定的記錄數。limit 接受一個或兩個數字參數。參數必須是一個整數常量。

  如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 PostgreSQL 兼容,MySQL 也支持句法: limit # OFFSET #。

  舉幾個例子~

mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15   
//為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last. //如果只給定一個參數,它表示返回最大的記錄行數目: mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行 //換句話說,LIMIT n 等價於 LIMIT 0,n。

  

 

 

5.注釋符
 
  常見注釋符表示方法有  #、空格、/**/
 
  內聯注釋:
  /*!code*/
  舉例:  index.php?id=-15/*!union*//*!select*/1,2,3 
 
  注:
     必須記住一個庫 information_schema
      必須記住三個表 schemata、tables、columns
      schemata表中存儲該用戶創建的數據庫的庫名
      tables表中存儲該用戶創建的庫名和表名
      columns表中存儲該用戶創建的表名和字段名
 
 
 
(三)Union注入攻擊
 
由於本書的配套連接已經失效~
等筆者找到合適的環境再來補充實驗部分。
 
1.判斷方法
 
可以通過添加單引號再次訪問
頁面返回結果與之前不同
 
訪問id=1 and 1=1   
由於and 1=1為真,所以頁面返回與id=1相同,
訪問id=1 and 1=2
由於and 1=2為假,所以頁面返回與id=1不同。
因此有可能出現sql注入漏洞。
 
接着
使用order by 1-99 語句查詢該數據表的字段數量,即可以理解為order by=1-99
若訪問id=1 order by 3,頁面返回和id=1相同的結果,訪問id=1 order by 4,頁面返回和id=1不同的結果,則字段數為3.
 
在數據庫中查詢參數id對應的內容,然后將數據庫的內容輸出到頁面。
這時可以使用union注入,並且通過order by查詢結果:
union select 1,2,3
 
若只看到頁面執行成功,但沒有返回union select 的結果,因此獲取的結果沒有輸出到頁面
 
我們可以通過設置參數id值,讓服務器返回union select的結果
例如:把id的值設置為-1,因為數據庫沒有id=-1的數據,所以會返回union select的結果。
(這一步沒有很懂,大佬們多指教)
 
 
當設置id=-1,頁面返回結果,2:3時,意味union select 1,2,3中,2和3的位置可以輸入mysql語句,則可以嘗試在2的位置查詢當前數據庫名(使用 database()  函數),
訪問  id=1 union select 1,database(),3 
頁面返回數據庫信息
 
得知數據庫庫名后,查詢表名
使用下面語句:
  select table_name from information_schema.tables where table_schema='庫名' limit 0,1 
 
嘗試在 id=1 union select 1,2,3中的2處粘貼上述語句
 
id=-1+union select 1select table_name from information_schema.tables where table_schema='庫名' limit 0,13

 

 
執行,得到表名
 
這里查詢表名
命令:
select column_name from information_schema.columns  where table_schema='庫名' and table_name='表名'  limit 0,1

 

獲取該表的第一個字段名,使用 limit 1,1,獲取該表的第二個字段名
 
 
2.union注入代碼分析
 
 

 

 當訪問id=1 union select 1,2,3時,執行的sql語句為:

  select * from users where id=1 union select 123 

 因此,即可獲取數據庫中的數據~

 
 
 
 

參考資料:

 

《Web安全攻防 滲透測試實戰指南》

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM