sql注入總結(1)--------分類和基礎思路方法以及防護

一,注入分類

(1)基於從服務器接收到的響應

  • ①基於報錯的 SQL 注入
  • ②聯合查詢的類型
  • ③堆疊4 查詢注射
  • ④SQL 盲注
  • 基於布爾SQL 盲注
  • 基於時間的SQL 盲注
  • 基於報錯的SQL 盲注

(2)基於如何處理輸入的 SQL 查詢(數據類型)

  • ①基於字符串
  • ②數字型
  • ③搜索型

(3)基於程度和順序的注入(哪裏發生了影響)

  • ①一階注射
  • ②二階注射
  一階注射是指輸入的注射語句對 WEB 直接產生了影響,出現了結果
  二階注入類似存儲型 XSS,是指輸入提交的語句,無法直接對 WEB 應用程序產生影響,通過其它的輔助間接的對 WEB 產生危害,這樣的就被稱爲是二階注入.

(4)基於注入點的位置上的

  • ①通過用戶輸入的表單域的注射。
  • ②通過 cookie 注射。
  • ③通過服務器變量注射。(基於頭部信息的注射)

二,注入思路和一般方法

(0)常用的顯示信息的函數

  • database()
  • user()
  • version()

可以配合內聯註釋繞過 eg(union select database/*!()*/


(0)用系統變量顯示信息

系統變量:數據庫配置文件中定義的變量
注入中的作用:用來顯示配置文件中的信息來確定可進行的操
.

  • @@version ----版本
  • @@basedir-----數據庫安裝目錄
  • @@datadir-----數據庫文件所在處
  • @@port-------設置的端口
  • @@secure_file_priv-----mysql對文件導入導出的設置(爲NULL則爲不允許)

在這裏插入圖片描述
在這裏插入圖片描述

(1)判斷是否存在注入點和類型

常常使用閉合單引號的操作來判斷注入點
常用的嘗試語句
?id=1’’ (兩個單引號閉合前後法)
?id=1" (一個雙引號閉合法)
or 1=1 --+
'or 1=1 --+
"or 1=1 --+
)or 1=1 --+
')or 1=1 --+
") or 1=1 --+
"))or 1=1 --+

--+      -- 爲註釋的意思 |    + 爲空格 

就是# 註釋符的用處    在URL編碼中爲%23

根據後端的代碼判斷閉合方法{若存在注入點,服務器會返回sql語法錯誤提示}


(2)盲注中基於布爾的思路

2.1 猜測長度

length (str)

1' and length(database())=4#

  • 在這裏插入圖片描述
    在這裏插入圖片描述

count() -----------可用來推測表和字段的規個數

1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1
2.2 截斷字符(提取)

盲注不回顯,一般爲判斷長度,要用到截斷字符和編碼判斷字符

sql階段字符方法

三大法寶:mid(),substr(),left()

MID(str,start[,length])

MID(DATABASE(),1,1)>’a’,查看數據庫名第一位,MID(DATABASE(),2,1)查看數據庫名第二位,依次查看各位字符。

substr(str, start, length)

substr(DATABASE(),1,1)>’a’,查看數據庫名第一位

Left(str, n )

Left()得到字符串左部指定個數的字符
left(database(),1)>’a’,查看數據庫名第一位

2.3 對截斷的字符進行判斷

ascii(str)

結合ASCII編碼表判斷

1' and ascii(substr(database(),1,1))>97 #
  • 在這裏插入圖片描述

MYSQL 5+中 information_schema庫中存儲了所有的 庫名,表明以及字段名信息,所有還可以使用正則和like進行猜解
用法


(3)xpath利用報錯注入

XPath注入攻擊是指利用XPath 解析器的鬆散輸入和容錯特性,能夠在 URL、表單或其它信息上附帶惡意的XPath 查詢代碼,以獲得權限信息的訪問權並更改這些信息。

  • 注入的對象不是數據庫中的表了,而是一個存儲數據的XML文件。
  • 因爲xpath不存在訪問控制,所以我們不會遇到許多在SQL注入中經常遇到的訪問限制。
  • 通過sql中的關於xml操作的函數注入
①UPDATEXML (XML_文檔, XPath語法, new_value);
  • 第一個參數:XML_document是String格式,一般寫1即可(不存在的文檔)
  • 第二個參數:xpath語法
  • 第三個參數:new_value,String格式,替換查找到的符合條件的數據 (注入時隨便寫)
  • 作用:改變文檔中符合條件的節點的值
    ?id=1' and updatexml(1,concat(0x7e,@@version,0x7e),1)--+

在這裏插入圖片描述
在這裏插入圖片描述

【說明】

  • 0x7e爲~的16進制編碼形式()以~開頭的內容不是xml格式的語,連接後的結果顯然不符合規則,但是會將括號內的執行結果以錯誤的形式報出,這樣就可以實現報錯注入了。
  • @@version爲系統的環境變量
② EXTRACTVALUE (XML_document, XPath_string);
  • 第一個參數:XML_document是String格式,爲XML文檔對象的名
  • 第二個參數:XPath_string (Xpath格式的字符串).
  • 作用:從目標XML中返回包含所查詢值的字符串
id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20database()),0x7e))--+

在這裏插入圖片描述


(4)盲注中基於時間的思路

if( (條件),sleep(5),1 )

條件可以爲基於布爾的思路payload


三,常用的繞過方法

(1)如何繞過 or 和 and 過濾

  • 大小寫變形 Or,OR,oR
  • 編碼繞過,hex,urlencode
  • 添加註釋/*!or*/
  • 利用符號 and=&& or=||
  • 複寫 anandd

四、防護

使用白名單來規範化輸入

服務器端在提交數據庫進行SQL查詢之前,對特殊字符進行過濾、轉義、替換、刪除。

規範編碼,字符集(不用GBK)

使用參數化查詢

什麼是參數化查詢

  • 在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值
    .

爲什麼參數化查詢可以防護sql注入

  • 原理: 使用參數化查詢數據庫服務器不會把參數的內容當作sql指令的一部分來執行,是在數據庫完成sql指令的編譯後才套用參數運行,因此就算參數中含有指令,也不會被數據庫運行。

  • 簡單的說: 語句是語句,參數是參數,參數的值並不是SQL語句的一部分,數據庫只按語句的語義跑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章